1. Dockerfile 이란?
- 컨테이너 내부 환경을 정의함
- Docker 이미지 외부 리소스와의 맵핑 정보를 정의함
- 빌드가 성공적으로 이루어진 이미지의 경우 Docker가 설치된 어디에서나 똑같이 실행될 것을 기대할 수 있음.
2. Dockerfile 간단 작성
- 특정 경로에 디렉토리를 생성 한후
.dockerignore
파일을 생성한다..dockerignore
: docker 이미지 빌드 시 무시 될 파일들을 기재한다..gitignore
와 비슷하다.
node_modules npm-debug.log Dockerfile* docker-compose* .dockerignore .git .gitignore README.md LICENSE .vscode
-
Dockerfile 작성
- python관련 이미지를 기반으로,
# 파이썬 이미지를 기반으로 함 FROM python:2.7-slim # Docker 이미지 내부에서 RUN, CMD, ENTRYPOINT의 명령이 실행될 디렉터리를 설정 WORKDIR /app # 현재 디렉터리에 있는 파일들을 이미지 내부 /app 디렉터리에 추가함 ADD . /app # requirements.txt 파일을 기반으로 파이썬 패키지들을 실행함 RUN pip install --trusted-host pypi.python.org -r requirements.txt # 80포트를 외부로 노출함 EXPOSE 80 # 환경변수를 설정함 ENV NAME World # 쉘을 사용하지 않고 컨테이너가 시작되었을 때 아래 명령을 실행함 'python app.py' 가 실행됨 CMD ["python", "app.py"]
-
requirements.txt 작성
Flask Redis
- app.py 파일 작성
- 파이썬 웹프레임워크인 flask를 이용한 코드 작성
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)
- Dockerfile을 기반으로 이미지 빌드하기
friendlyhello
라는 이름으로 현재 디렉토리를 빌드함.- 마지막에
.
주의 요망 현재디렉토리라는 것을 명시 해야함. docker build -t <이미지이름>:<태그> <경로>
- 태그를 생략할 경우 자동으로
latest
가 붙는다. -t
옵션 : 이미지 명칭과 태그를 지정하는 옵션
$ docker build -t friendlyhello:first .
-
이미지 확인
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE friendlyhello first af346c6c2f35 About a minute ago 132MB python 2.7-slim d0d1b97dd328 6 days ago 120MB
-
이미지 실행
$ docker run -p 4000:80 friendlyhello:first
- 로컬에서 웹서버 구동 확인
- 브라우저에서 http://localhost:4000/ 에서 확인해본다.