도커 파일 작성

나만의 도커 이미지를 생성해보겠습니다.
도커이미지를 생성하기 위해서는 Dockerfile이라는 텍스트문서를 작성해야합니다.
사용자는 특정 명령을 통해서 원하는 도커 이미지를 생성합니다.

  • Dockerfile에 기반 이미지를 지정
  • 원하는 소프트웨어 및 라이브러리를 설치하기 위한 명령 기술
  • 컨테이너 실행 시 수행할 명령을 기술

Dockerfile 기초

저는 Documents디렉토리에서 작업을 하겠습니다.

우분투 20.04 LTS 버전은 파이썬이 이미 설치되어있습니다.

hello.py이름의 파이썬 스크립트를 작성합니다.

hello.py

import os
import sys

my_ver = os.environ["my_ver"]
arg = sys.argv[1]

print("hello %s, my version is %s!" % (arg, my_ver))

마찬가지로 Dockerfile도 작성합니다.

Dockerfile

From ubuntu:18.04

Run apt-get update \
	&& apt-get install -y \
    curl \
    python-dev
    
WORKDIR /root/Documents
COPY hello.py .
ENV my_ver 1.0

CMD ["python", "hello.py", "guest"]
  • FROM : 이 지침은 Docker 파일에서 코멘트가 없는 첫 번째 지침이어야 합니다.
    해당 이미지를 기반으로 새로운 도커 이미지가 생성됩니다.

  • RUN : 이 지침에 지정된 명령은 빌드 프로세스 중에 실행됩니다.
    사용자가 지정한 명령을 실행하는 지시자입니다.

  • WORKDIR : 이 지시문은 RUN, CMDB, ENTERPOINT, COPY 및 ADD 지시사항에 대한 현재 작업 디렉토리를 설정합니다. 저는 /Documents 디렉토리로 지정했습니다.

  • COPY : 로컬 호스트에 존재하는 파일을 이미지 안으로 복사하는 지시자입니다.
    원본은 로컬 파일 또는 디렉터리만 사용할 수 있습니다.

  • ENV : 환경변수를 정의합니다.

  • CMD : 이미지를 실행 시, Default로 실행되는 명령어를 지정합니다.


두개의 파일이 만들어져 있습니다.


도커 빌드

작성한 Dockerfile을 도커 이미지로 변환하기 위해 빌드 명령을 수행합니다.

기본포맷

$ docker build <PATH> -t <IMAGE_NAME>:<TAG>

<PATH>는 Dockerfile이 위치한 경로입니다.

예제

$ docker build . -t hello:1

도커를 처음 빌드 시, 시간이 걸립니다.


-t (또는 --tag) 옵션은 새로 생성할 이미지 이름을 지정한다.


이미지로 넘겨주는 파라미터에 따라서 어떻게 동작하는지 살펴보겠습니다.
$ docker run hello:1

$ docker run hello:1 echo "hello world!"

$ docker run hello:1 cat hello.py

$ docker run hello:1 pwd

컨테이너 실행 시, -e옵션으로 환경변수를 주입할 수 있습니다.

기본포맷

$ docker run -e KEY=VALUE <REGISTRY>/<IMAGE>:<TAG>

예제

$ docker run -e my_ver=1.5 hello:1


Dockerfile 심화

ARG

Dockerfile 안에서 사용할 수 있는 매개변수를 정의합니다.
파라미터로 넘겨지는 변수의 값에 따라, 생성되는 이미지 내용을 바꿀 수 있습니다.

ARG지시자를 사용하여 my_ver이라는 변수를 생성합니다.
또한, 이미지 빌드 시, --build-arg옵션을 사용하여 ARG값을 덮어 씌울 수 있습니다.

$ docker build . -t hello:2 --build-arg my_ver=2.0	#1.0이 아닌 2.0으로 설정됩니다.


컨테이너를 실행해보면 2.0으로 바뀐것을 확인할 수 있습니다.


이미지 빌드 시점에서 환경변수의 값을 바꾸더라도 컨테이너 실행시점에서 환경변수를 변경할 수 있습니다.


ENTRYPOINT

CMD와 비슷하지만 실행 명령이 override되지 않고 실행가능한 이미지를 만듭니다.

Dockerfile을 아래처럼 수정합니다.
CMD에서 ENTRYPOINT로 지시자를 변경합니다.

$ docker build . -t hello:3	#도커 빌드

화면결과를 보시면 echo "hello" 명령을 파라미터로 전달하더라도 실행 명령이 override되지 않습니다.


이번에는 Dockerfile을 조금 바꿔보겠습니다.

guest를 삭제했습니다.

$ docker build . -t hello:4		# hello:4로 이미지를 새로 빌드합니다.

hello:4이미지로 전달된 파라미터 new-guest가 실행 명령으로 override되지 않고 python hello.py의 파라미터로 전달됩니다.

python hello.py new-guest	#이 형태로 호출된 것처럼 동작합니다.

CMD와 ENTRYPOINT의 차이점

CMD는 Default Command라고 생각하시면 됩니다.
특별히 파라미터를 치지 않으면 기본값으로 실행되는 명령어가 동작하고 파라미터를 넘겨주면 기본값이 override됩니다.

ENTRYPOINT는 이미지를 실행가능한 바이너리로 만들어주는 지시자 입니다.
이미지 실행시 무조건 호출이되고 파라미터를 전달하면 해당 파라미터가 그대로 ENTRYPOINT파라밑로 전달됩니다.

좋은 웹페이지 즐겨찾기