Connecting
도커와 친해지기 - 도커 명령어와 간단한 어플리케이션 만들기 본문
저번 시간에는 Docker가 무엇인지 핵심 기능인 컨테이너 기반의 가상화가 무엇인지 살펴보았다.
이번시간에는 Docker를 설치하고 공식 Documents에 있는 명령을 실제로 실행하면서 Docker에 대해 이해도를 가지는 시간을 가지도록 한다.
본 문서는 Mac OS X를 기반으로 작성하였다. Linux 사용자나 Windows 사용자는 설치방법이 각각 상의하기 때문에 공식 문서를 읽어보고 설치를 진행하는 것을 권장한다.
Docker를 활용하여 간단한 웹 애플리케이션을 만들어 사용한다.
파이썬을 활용하여 어플리케이션을 만들며, 본 프로젝트를 실행하기 위해 빈 디렉토리를 만들어서 테스트 한다.
빈 디렉토리에 Dockerfile를 만들고 다음 내용을 작성한다.
# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
requirements.txt를 만들고 다음과 같이 작성한다.
Flask
Redis
app.py를 만들고 다음과 같이 작성한다.
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
route("/") .
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
$ ls
app.py dockerfile requirements.txt
파일을 다 만들었으면 위와 같이 3가지 파일이 있는지 확인한다.
이제 빌드명령을 실행하여 Docker 이미지를 생성한다.
-t 옵션은 친숙한 이름으로 지정하는 옵션이다.
$ docker build -t friendlyhello .
다음 명령어를 사용하여 앱을 실행한다.
-p 옵션은 기기의 포트 4000번을 컨테이너의 게시된 80번에 매핑하여 실행하도록 한다.
$ docker run -p 4000:80 friendlyhello
앱을 종료할때는 CTRL + C로 종료한다.
윈도우는 CTRL + C로 종료하지 않는다.
Windows 시스템에서는 다른 터미널을 열고 'docker container ls' 를 통해 실행 중인 컨테이너 목록을 확인한 다음 컨테이너 'docker container stop <Container NAME or ID>' 를 통해 중지한다.
이렇게 종료하지 않을 경우 컨테이너를 다시 실행하려고 시도할 때 데몬에서 오류 응답을 받는다.
Docker를 활용하여 간단한 웹 애플리케이션을 만들어 사용한다.
파이썬을 활용하여 어플리케이션을 만들며, 본 프로젝트를 실행하기 위해 빈 디렉토리를 만들어서 테스트 한다.
빈 디렉토리에 Dockerfile를 만들고 다음 내용을 작성한다.
# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
requirements.txt를 만들고 다음과 같이 작성한다.
Flask
Redis
app.py를 만들고 다음과 같이 작성한다.
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
route("/") .
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
$ ls
app.py dockerfile requirements.txt
파일을 다 만들었으면 위와 같이 3가지 파일이 있는지 확인한다.
이제 빌드명령을 실행하여 Docker 이미지를 생성한다.
-t 옵션은 친숙한 이름으로 지정하는 옵션이다.
$ docker build -t friendlyhello .
다음 명령어를 사용하여 앱을 실행한다.
-p 옵션은 기기의 포트 4000번을 컨테이너의 게시된 80번에 매핑하여 실행하도록 한다.
$ docker run -p 4000:80 friendlyhello
앱을 종료할때는 CTRL + C로 종료한다.
윈도우는 CTRL + C로 종료하지 않는다.
Windows 시스템에서는 다른 터미널을 열고 'docker container ls' 를 통해 실행 중인 컨테이너 목록을 확인한 다음 컨테이너 'docker container stop <Container NAME or ID>' 를 통해 중지한다.
이렇게 종료하지 않을 경우 컨테이너를 다시 실행하려고 시도할 때 데몬에서 오류 응답을 받는다.
백그라운드에서 어플리케이션을 실행할때는 다음과 같이 실행한다.
$ docker run -d -p 4000:80 friendlyhello
앱에 대한 컨테이너 ID를 얻기위해서 다음 명령어를 실행한다.
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6ffb3c312f7 friendlyhello "python app.py" 11 seconds ago Up 11 seconds 0.0.0.0:4000->80/tcp keen_kirch실행중인 컨테이너를 종료하기 위해 다음 명령어를 실행한다.
$ docker container stop f6ffb3c312f7
f6ffb3c312f7
Docker 사용해 보기
Docker의 명령어는 docker run, docker push 와 같이 docker <명령> 형식으로 실행한다.
리눅스 사용자의 경우 반드시 root 권한으로 실행해야 한다.
search 명령어를 활용하여 이미지를 검색한다.
$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based
...
다양한 이미지가 검색이 되는데 공식 명칭을 가진 OS나 프로그램이 공식 이미지이다.
나머지는 개발자들이 직접 만들어 배포한 사설 이미지이다.
pull 명령어로 이미지를 받기 위해서는 다음과 같은 명령어를 사용한다.
$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
a48c500ed24e: Pull complete
1e1de00ff7e1: Pull complete
0330ca45a200: Pull complete
471db38bcfbf: Pull complete
0b4aba487617: Pull complete
Digest: sha256:c8c275751219dadad8fa56b3ac41ca6cb22219ff117ca98fe82b42f24e1ba64e
images 명령어로 이미지 목록을 출력한다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest af7ce11cd9ba 34 minutes ago 151MB
python 2.7-slim 46ba956c5967 2 weeks ago 140MB
ubuntu latest 452a96d81c30 3 weeks ago 79.6MB
hello-world latest e38bc07ac18e 5 weeks ago 1.85kB
run 명령어으로 컨테이너를 생성한다.
$ docker run -i -t --name hello ubuntu /bin/bash
root@f745dc7699ed:/#
Docker run <옵션> <이미지 이름> <실행할 파일> 형식으로 실행한다.
본 예제에는 ubuntu 이미지를 컨테이너로 생성한 뒤에 ubuntu 이미지 안에 /bin/bash를 실행한다.
이미지 이름 대신에 이미지 ID를 사용해도 된다.
bash에서 빠져나가기 위해서는 exit를 입력한다.
우분투 이미지에서 /bin/bash 실행파일을 직접 실행했기 때문에 빠져나오게 되면 컨테이너가 정지된다.
start 명령으로 컨테이너 시작
$ docker start hello
restart 명령으로 컨테이너 재시작
$ docker restart hello
attach 명령으로 컨테이너에 접속
$ docker attach hello
root@f745dc7699ed:/#
exec 명령으로 외부에서 컨테이너 안의 명령어 실행
$ docker exec hello echo "wisoft hello"
wisoft hello
stop 명령으로 컨테이너 정지
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f745dc7699ed ubuntu "/bin/bash" 8 minutes ago Up About a minute hello
$ docker stop hello
hello
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Docker의 명령어는 docker run, docker push 와 같이 docker <명령> 형식으로 실행한다.
리눅스 사용자의 경우 반드시 root 권한으로 실행해야 한다.
search 명령어를 활용하여 이미지를 검색한다.
$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based
...
다양한 이미지가 검색이 되는데 공식 명칭을 가진 OS나 프로그램이 공식 이미지이다.
나머지는 개발자들이 직접 만들어 배포한 사설 이미지이다.
pull 명령어로 이미지를 받기 위해서는 다음과 같은 명령어를 사용한다.
$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
a48c500ed24e: Pull complete
1e1de00ff7e1: Pull complete
0330ca45a200: Pull complete
471db38bcfbf: Pull complete
0b4aba487617: Pull complete
Digest: sha256:c8c275751219dadad8fa56b3ac41ca6cb22219ff117ca98fe82b42f24e1ba64e
images 명령어로 이미지 목록을 출력한다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest af7ce11cd9ba 34 minutes ago 151MB
python 2.7-slim 46ba956c5967 2 weeks ago 140MB
ubuntu latest 452a96d81c30 3 weeks ago 79.6MB
hello-world latest e38bc07ac18e 5 weeks ago 1.85kB
run 명령어으로 컨테이너를 생성한다.
$ docker run -i -t --name hello ubuntu /bin/bash
root@f745dc7699ed:/#
Docker run <옵션> <이미지 이름> <실행할 파일> 형식으로 실행한다.
본 예제에는 ubuntu 이미지를 컨테이너로 생성한 뒤에 ubuntu 이미지 안에 /bin/bash를 실행한다.
이미지 이름 대신에 이미지 ID를 사용해도 된다.
bash에서 빠져나가기 위해서는 exit를 입력한다.
우분투 이미지에서 /bin/bash 실행파일을 직접 실행했기 때문에 빠져나오게 되면 컨테이너가 정지된다.
start 명령으로 컨테이너 시작
$ docker start hello
restart 명령으로 컨테이너 재시작
$ docker restart hello
attach 명령으로 컨테이너에 접속
$ docker attach hello
root@f745dc7699ed:/#
exec 명령으로 외부에서 컨테이너 안의 명령어 실행
$ docker exec hello echo "wisoft hello"
wisoft hello
stop 명령으로 컨테이너 정지
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f745dc7699ed ubuntu "/bin/bash" 8 minutes ago Up About a minute hello
$ docker stop hello
hello
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
본 명령어는 이미지 ID로 대체하여 작성해도 상관없이 동작한다.
rm 명령으로 컨테이너 삭제
$ docker rm hello
hellormi 명령으로 이미지 삭제
'Container' 카테고리의 다른 글
Docker, Stacks (0) | 2018.06.19 |
---|---|
Docker Swarms (4) | 2018.06.13 |
Docker 컨테이너와 서비스 (0) | 2018.06.05 |
Docker란 무엇인가? 도커에 대해 알아보기 (2) | 2018.06.03 |
Hello 도커(Docker), 도커 설치기와 입문 (0) | 2018.03.18 |