Docker 시작하기 03 - Dockerfile 로 이미지 빌드하기

Docker 시작하기 03 - Dockerfile 로 이미지 빌드하기

2018, Sep 11    

이번시간에는 dockerfile 을 가지고 빌드하는 방법을 알아보겠습니다.

Dockerfile 이란?

dockerfile 이란 docker 이미지를 생성할 때 필요한 일련의 작업들과 정보들을 모아놓은 일종의 배치파일 입니다.
dockerfile 을 사용함에 따라 이미지 생성과 함께 필요한 어플리케이션 설치, 서버 구동 등과 같은 일련의 작업들을 한번에 처리할 수 있습니다.


Dockerfile 로 빌드하기

아래의 예와같이 임의의 폴더에 dockerfile 를 생성합니다.

출처: https://www.slideshare.net/pyrasis/docker-fordummies-44424016

# 이미지 생성시 base가 되는 이미지를 지정합니다.
FROM ubuntu:latest

# MAINTAINER 생성자가 deprecate 되었기 때문에
# LABEL 을 통해 maintainer 를 지정해 주었습니다.
# 이미지를 생성한 사람/기관 등을 나타냅니다.
LABEL maintainer="Foo Bar foo@bar.com"

# nginx 서버를 설치해 줍니다.
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx

# 호스트와 연결할 디렉토리를 나타냅니다.
VOLUME [ "/data", "/etc/nginx/site-enabled", "/var/log/nginx" ]

# 컨테이너 실행시 작업디렉토리를 지정합니다.
WORKDIR /etc/nginx

# WORKDIR에서 지정한 디렉토리에 있는 nginx 서버를 실행합니다.
CMD [ "nginx" ]

# 호스트와 바인딩할 포트를 지정합니다.
EXPOSE 80
EXPOSE 443

한가지 팁을 드리자면 VSCODE 에디터를 사용하시는 경우, Microsoft 에서 배포한 Docker Extension 을 설치하시면 dockerfile 을 매우 편하게 편집할 수 있습니다.

dockerfile 생성 후, 파일이 있는 폴더에서 아래와 같이 빌드합니다.

$ docker build --tag hello:0.1 .

–tag 옵션을 사용해서 이미지명과 버전을 지정해 주었습니다. 버전을 지정하지 않을경우 latest 태그가 자동으로 붇게 됩니다. 마지막 ` . ` 으로 현재 폴더를 지정하게 되면 docker 가 자동을 현재폴더의 dockerfile 를 찾아 빌드를 시작하게 됩니다.

빌드가 완료되면 docker images 를 통해 빌드한 이미지가 생성되었는지 확인 할 수 있습니다.

마지막으로 아래와 같이 컨테이너 생성과 동시에 nginx 서버를 실행합니다.

$ docker run --name hello-nginx -d -p 80:80 -v /root/data:/data hello:0.1

-v /root/data:/data 옵션은 호스트 디렉토리와 컨테이너 디렉토리를 연결하는 역활을 합니다. 나머지 옵션들은 이전 포스트를 참조해 주세요.

alt text

호스트 브라우저를 통해 서버가 실행되고 있는 것이 확인되었습니다.



윈도우7 에서 컨테이너 디렉토리와 연결하기

리눅스에서 Docker 컨테이너를 돌릴 경우, 위에서 살펴본것 처럼 컨테이너 생성시 -v [호스트폴더]:[컨테이너폴더] 옵션으로 바인딩 하는 것 만으로도 간단하게 디렉토리를 연결할 수 있었습니다. 하지만 윈도우에서는 일련의 작업이 더 필요합니다. alt text
위의 그림처럼 리눅스 에서 도커 컨테이너를 돌릴 경우는 호스트OS와 컨테이너 폴더를 한번만 연결하면 됩니다.

alt text
윈도우 기반에서 docker 컨테이너를 실행할 경우는 위 그림처럼 윈도우 위에서 가상 호스트OS(리눅스) 를 실행하고 가상 호스트OS 위에서 docker 컨테이너를 실행하는 방식이 됩니다.
그렇기 때문에 윈도우에서 docker 를 사용하는 경우 윈도우의 폴더와 가상호스트OS 의 디렉토리를 연결하는 작업이 더 필요하게 됩니다.


본격적으로 도커 컨테이너와 가상호스트의 디렉토리가 연결되었다는 가정하에 윈도우와 가상호스트를 연결해 보겠습니다.

먼저 가장호스트를 돌리고 있는 Oracle virtual Box 를 실행합니다. 메뉴 - 설정 - 공유폴더 항목에서 마운트할 폴더를 추가 합니다. 추가시 자동 마운트 체크박스를 체크합니다. alt text OS가 일본어 버전이라 일본어로 표시되는 점 양해 바랍니다.

그리고 나서 호스트 OS에 ssh 로 접속합니다.

$ docker-machine ssh

접속후 mount 명령으로 위에서 추가한 공유폴더 이름으로 디렉토리를 마운트 합니다.

sudo mount -t vboxsf [virtualbox로 설정한 공유폴더명] [연결할 호스트 디렉토리 예)/root/data]

주의 할 점은 윈도우의 공유 폴더 주소가 아니라 virtualbox 에서 설정한 공유폴더 이름 으로 지정해야 한다는 점 입니다.

여담으로 위 방법을 사용해서 jekyll 서버는 docker 컨테이너로 돌리고 포스트는 윈도우에서 VSCODE 로 편집하는 환경을 구성해서 사용하고 있습니다. 엄청 편하네요.ㅎㅎ