Docker 공식 문서를 보며 진행해 본 것을 간단하게 정리한다. 자세히 보려면 아래 링크를 확인.(한글은 지원하지 않음)
https://docs.docker.com/get-started/
Docker 설치는 환경마다 다를 수 있으므로, 아래 링크를 참고
https://docs.docker.com/install/
도커 버전 확인
간단한 도커 이미지 hello-world 를 실행하여 잘 동작하는 지 확인한다.
이미지 빌드
컨테이너를 생성해서 서비스 앱을 배포해보자
먼저 이미지를 빌드한다.
임의의 디렉토리를 만들고, 해당 디렉토리로 이동
mkdir test
cd test
먼저 Dockerfile을 생성하고 정의한다.
# Use an official Python runtime as a parent image
# python:2.7-slim 이미지를 기반으로,
FROM python:2.7-slim
# Set the working directory to /app
# 워킹 디렉토리를 /app으로 지정
WORKDIR /app
# Copy the current directory contents into the container at /app
# 디렉토리에 있는 파일들을 /app으로 복사한다.
COPY . /app
# Install any needed packages specified in requirements.txt
# 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"]
test 디렉토리에 requirements.txt와 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__)
@app.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)
test 디렉토리 구성
docker build 명령어로 이미지를 빌드한다.
생성된 이미지를 확인
컨테이너 실행
그럼 이제 앱을 실행해보자.
docker run 명령어로 컨테이너를 실행한다. -p 옵션을 포트 포워딩 옵션이다.
4000 포트로 접속해보면, 정상적으로 앱이 실행된 것을 확인할 수 있다.
다만 이렇게 실행하면 CTRL+C 를 누르면 컨테이너가 종료된다.
docker run 명령에서 -d 옵션을 주면, 컨테이너가 백그라운드에서 실행된다.
컨테이너를 종료할 때는 아래와 같이 docker container stop <container id> 명령을 사용한다.