최근에 쿠버네티스를 공부할 일이 있어서 보고 있는데, 쿠버네티스 자체가 도커(Docker) 오케스트레이션을 해주는 툴이라 도커에 대한 개념이 없으니, 공부하기가 힘들었습니다. 그래서 이렇게 급하게 책을 사서 공부하면서 내용을 정리하고자 합니다.

해당 내용은 위키북스에서 나온 시작하세요! 도커 책을 보면서 정리한 내용입니다. 책의 내용이 매우 좋아서 강추합니다.

이번에는 도커의 Dockerfile 생성해보겠습니다.


Dockerfile

Dockerfile은 컨테이너를 만들고 해야하는 일련의 작업들을 미리 선언함으로써 매번 해당 작업을 하지않고도, 컨테이너 생성시 자동으로 등록된 작업이 실행된 후 컨테이너를 생성할 수 있는 파일입니다.

Dockerfile은 어플리케이션 개발 외에도 도커 허브에 배포할때, 이미지가 아닌, Dockerfile을 이용하여 배포할 수도 있습니다.


Dockerfile 작성

Dockerfile은 컨테이너에서 수행해야할 작업들을 명시합니다. (그리고 실제 파일이름이 Dockerfile 입니다)

이번에는 ubuntu에 아파치 서버를 설치하고 로컬에 있는 test.html/var/www/html복사하여 컨테이너를 생성해보도록 하겠습니다.

$ mkdier dockerfile && cd dockerfile
$ vi Dockerfile

Dockerfile안에 내용은 아래와 같이 합니다.

FROM ubuntu:14.04                                   # FROM : 생성할 이미지
MAINTAINER jungwoon                                 # MAINTAINER : 이미지를 생성한 개발자의 정보 (1.13.0 이후 사용 X)
LABEL "purpose"="practice"                          # LABEL : 이미지에 메타데이터를 추가 (key-value 형태)
RUN apt-get update                                  # RUN : 내부에서 실행하는 명령, apt-get 업데이트
RUN apt-get install apache2 -y                      # RUN : 내부에서 실행하는 명령, apache2 설치
ADD test.html /var/www/html                         # ADD : 파일을 추가, 파일은 Dockerfile이 위치한 디렉토리에서 가져옴
WORKDIR /var/www/html                               # WORKDIR : 디렉토리 이동, cd 명령어와 동일합니다, /var/www/html로 이동
RUN ["/bin/bash", "-c", "echo hello >> test2.html"]  # RUN : 내부에서 실행하는 명령, test2.html 파일 생성
EXPOSE 80                                           # EXPOSE : Dockefile의 빌드로 생성된 이미지에서 열어줄 포트
CMD apachectl -DFOREGROUND                          # CMD : 컨테이너가 시작될 때마다 실행한 명령어, apache를 매번 실행
  • FROM : 생성할 이미지
  • MAINTAINER : 이미지를 생성한 개발자의 정보 (1.13.0 이후 사용 X)
  • LABEL : 이미지에 메타데이터를 추가 (key-value 형태)
  • RUN : 내부에서 실행하는 명령
  • ADD : 파일을 추가, 파일은 Dockerfile이 위치한 디렉토리에서 가져옴
  • WORKDIR : 디렉토리 이동, cd 명령어와 동일합니다
  • EXPOSE : Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트
  • CMD : 컨테이너가 시작될 때마다 실행한 명령어

만약 더 많은 명령어를 알고 싶으면 다 Docker 공식 사이트를 참고하시기 바랍니다.


Dockerfile 빌드

$ docker build -t [이미지 이름:이미지 버전] [Dockerfile의 경로]

-t는 생성될 이미지의 이름을 설정, 생략시 16진수 형태로 자동 생성되므로 사용하는 걸 추천합니다.

실습

$ docker build -t mybuild:0.0 ./
Sending build context to Docker daemon  3.072kB
Step 1/10 : FROM ubuntu:14.04
---> 7e4b16ae8b23
Step 2/10 : MAINTAINER jungwoon
---> Using cache
---> 3a109c0fbc9c
Step 3/10 : LABEL "purpose"="practice"
---> Using cache
---> eb4fc9a7f0c0
Step 4/10 : RUN apt-get update
---> Using cache
---> 310c61072f92
Step 5/10 : RUN apt-get install apache2 -y
---> Using cache
---> 351f441a52e6
Step 6/10 : ADD test.html /var/www/html
---> Using cache
---> fabdb41b1d4a
Step 7/10 : WORKDIR /var/www/html
---> Using cache
---> aade10f6b4bd
Step 8/10 : RUN ["/bin/bash", "-c", "echo hello >> test2.html"]
---> Running in 1e831fca765c
Removing intermediate container 1e831fca765c
---> 6e80dc20b1d2
Step 9/10 : EXPOSE 80
---> Running in b2062df70dda
Removing intermediate container b2062df70dda
---> a94a15199cc6
Step 10/10 : CMD apachectl -DFOREGROUND
---> Running in bbc99d44fc10
Removing intermediate container bbc99d44fc10
---> 83ef57094ad5
Successfully built 83ef57094ad5
Successfully tagged mybuild:0.0

실제로 위의 이미지 빌드시에 일어나는건 아래 그림과 같이 매 명령에 마다 새로운 컨테이너가 생성되는 형태입니다.

그렇기 때문에 실제 명령어 수만큼 레이어가 생성이 되고, 스텝이 넘어갈때마다 컨테이너도 삭제됩니다.

만들어 졌으면 아래 명령으로 컨테이너를 생성합니다.

$ docker run -d -P --name myserver mybuild:0.0
bda63598395e4a1a4e428f0bad41b7b92a843191874e6c3bb450b798be6dc4e1

팁 : git에서 가져오게끔 만드는 경우, repository의 모든 파일과 모듈들을 가져오기 때문에 이미지 빌드에 필요한 파일만 있도록 해야합니다, 특정 파일들을 제외하고 싶으면 .gitignore과 같은 .dockerignore을 사용할 수 있습니다.

$ vi .dockerignore
test.html
*.html
test.htm?