Docker가 먼가요? - 4. Docker Image 만들기 1

1. Dockerfile 이란?

  • 컨테이너 내부 환경을 정의함
  • Docker 이미지 외부 리소스와의 맵핑 정보를 정의함
  • 빌드가 성공적으로 이루어진 이미지의 경우 Docker가 설치된 어디에서나 똑같이 실행될 것을 기대할 수 있음.

2. Dockerfile 간단 작성

  1. 특정 경로에 디렉토리를 생성 한후 .dockerignore 파일을 생성한다.
    • .dockerignore : docker 이미지 빌드 시 무시 될 파일들을 기재한다. .gitignore와 비슷하다.
     node_modules
     npm-debug.log
     Dockerfile*
     docker-compose*
     .dockerignore
     .git
     .gitignore
     README.md
     LICENSE
     .vscode
    
  2. 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"]
    
  3. requirements.txt 작성

    Flask
    Redis
    
  4. 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)
    
  5. Dockerfile을 기반으로 이미지 빌드하기
    • friendlyhello 라는 이름으로 현재 디렉토리를 빌드함.
    • 마지막에 . 주의 요망 현재디렉토리라는 것을 명시 해야함.
    • docker build -t <이미지이름>:<태그> <경로>
    • 태그를 생략할 경우 자동으로 latest 가 붙는다.
    • -t 옵션 : 이미지 명칭과 태그를 지정하는 옵션
     $ docker build -t friendlyhello:first .
    
  6. 이미지 확인

     $ 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
    
  7. 이미지 실행

     $ docker run -p 4000:80 friendlyhello:first
    
  8. 로컬에서 웹서버 구동 확인