플랫폼 개발팀 기술 블로그

Docker : Dockerfile 편 본문

Docker

Docker : Dockerfile 편

DevStream 2019. 3. 7. 18:29

Dockerfile 개요



지금까지 도커 이미지를 내려받아 컨테이너를 생성하고 아파치를 설치 후 도커 컨테이너에 접근하는 실습 과정과 아파치가 설치 된 상태까지의 컨테이너를 이미지화하는 내용을 학습하였다.


// 우분투 이미지 다운로드 # docker pull ubuntu:14.04 // 도커 컨테이너 생성 # docker create -i -t --name -p 80:80 ubuntutest docker.io/ubuntu:14:04 b0c51e1ead4b1e4234537ec00394837144ce83f64c2d3c2e1eb7cbabcec8af41 // 컨테이너 활성화 # docker start ubuntutest // 컨테이너 접근 # docker attach ubuntutest // 패키지 업데이트 # apt-get update // 아파치 설치 # apt-get install apache2 -y // 아파치까지 설치 된 상태의 컨테이너를 이미지 화 # docker commit ubuntutest ubuntutest_img



Dockerfile(이하 도커파일)은 위와 같은 일련의 과정들을 기록하고 실행 할 수 있는 일종의 스크립트이다. 도커파일을 실행 할 수 있는 build명령어를 제공하고 있으며 도커파일을 build 할 때 패키지, 콘솔 명령어, Shell Script 등도 함께 포함하여 실행 할 수 있다.


Dockerfile은 콘솔명령어, Shell Script등 기록된 내용을 그대로 실행하는 

일종의 설계도라고 보면 이해하기 쉽다.




Dockerfile 생성



Ubuntu 14.04에 아파치가 설치된 상태의 이미지를 Build 할 수 있는 도커파일을 만들어 보도록 하겠다. 처음부터 도커파일을 작성하기는 쉽지 않으므로 다른사람이 만들어둔 도커파일을 활용하도록 하자. 먼저 다운로드에 앞서 도커허브(https://hub.docker.com/)에 접속 해보자. 도커 허브에 접속하면 바로 검색창이 상단에 보이는데 우리가 찾고자 하는 ubuntu 기반의 아파치 설치를 위해 ubuntu apache라고 검색 해보자.





필자는 업로더 pamtrak06의 ubuntu14.04-apache2 도커파일을 참고하였다. pamtrak06/ubuntu14.04-apache2를 클릭하면 바로 해당 업로더의 페이지로 이동한다.





해당 페이지로 이동하면 pamtrak06 이라는 유저가 업로드한 도커파일뿐만 아니라 이미지도 pull명령어 또는 run명령어를 통해 내려 받을 수 있다. 우리는 도커파일이 필요하므로 Dockerfile 탭을 눌러 스크립트를 확인해보자.





캡쳐된 스크립트의 내용은 아래와 같다.

FROM ubuntu:14.04

MAINTAINER pamtrak06 < pamtrak06@gmail.com >

RUN apt-get update && apt-get install -y apache2 apache2-threaded-dev

# Configure localhost in Apache
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf

# Define default command
CMD ["apachectl", "-D", "FOREGROUND"]

# Expose ports 80/443... : to be override for needs
EXPOSE 80

#USER nobody


해당 텍스트를 복사하여 /home/testuser로 경로이동 후 vi에디터를 통해 Dockerfile을 생성하도록 한다.


여기서 저장하기 전 수정해야 하는 부분이 있는데 아파치를 설치 후 외부에서 접근 가능한 포트를 열어줘야 하므로 'EXPOSE 80'을 추가해준다. 'USER' 구문은 이미 root로 실행하고 있으므로 주석처리 하거나 root로 바꿔준다. -t 옵션을 붙이면 설정한대로 apache_img로 생성 되지만 붙이지 않으면 임의의 16진수로 생성되니 이미지명을 지정하려면 -t 옵션을 꼭 넣기 바란다.


# docker build -t apache_img /home/testuser

Step 1/6 : FROM ubuntu:14.04 Step 2/6 : MAINTAINER pamtrak06 <pamtrak06@gmail.com> ---> Using cache ---> 2c7545bf3112 Step 3/6 : RUN apt-get update && apt-get install -y apache2 apache2-threaded-dev ---> Running in 62fd9a272ce4 Ign http://archive.ubuntu.com trusty InRelease Get:1 http://security.ubuntu.com trusty-security InRelease [65.9 kB] Get:2 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB] Get:3 http://archive.ubuntu.com trusty-backports InRelease [65.9 kB] ... Processing triggers for libc-bin (2.19-0ubuntu6.14) ... Processing triggers for ca-certificates (20170717~14.04.2) ... Updating certificates in /etc/ssl/certs... 148 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d....done. Processing triggers for sgml-base (1.26+nmu4ubuntu1) ... Processing triggers for ureadahead (0.100.0-16) ... ---> 303f9b111bd3 Removing intermediate container 62fd9a272ce4 Step 4/6 : RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf ---> Running in 21b3d68727c2 ---> ff21c8331d36 Removing intermediate container 21b3d68727c2 Step 5/6 : CMD apachectl -D FOREGROUND ---> Running in 93503a25c881 ---> d17b03a01d1f Removing intermediate container 93503a25c881 Step 6/6 : EXPOSE 80 ---> Running in f86591442099 ---> d307433464d8 Removing intermediate container f86591442099

Successfully built 786550292665


빌드가 성공적으로 완료 되었다.




그럼 이제 각 Step별 처리과정에 대해서 알아보도록 하자.


Step 1/6 : FROM ubuntu:14.04 → ubuntu:14.04 이미지를 기반으로 만들겠다는 구문 Step 2/6 : MAINTAINER pamtrak06 <pamtrak06@gmail.com> → 최초 생성자는 pamtrak06이고 email 주소는 pamtrak06@gmail.com 이다. Step 3/6 : RUN apt-get update && apt-get install -y apache2 apache2-threaded-dev → 콘솔명령어 apt-get update로 package 최신화 시킨 후 apache2를 묻지도 따지지도 않고(-y옵션) multi-threaded server 버전으로 다운로드 하라는 뜻

Step 4/6 : RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf → 도커 컨테이너 내부의 apache2.conf에 ServerName을 localhost로 지정 한다는 뜻 (apache2 최초 설치 시 ServerName이 지정 되어있지 않음) Step 5/6 : CMD apachectl -D FOREGROUND → 컨테이너를 올릴때 자동으로 아파치를 기동한다는 명령어 Step 6/6 : EXPOSE 80 → 80번 포트를 외부에서 접근 가능하게 하겠다는 구문



그럼 이제 생성된 이미지를 확인하기 위해 docker images 명령으로 목록을 확인해보자


# docker images REPOSITORY TAG IMAGE ID CREATED SIZE apache_img first d307433464d8 6 minutes ago 390 MB layer_test second 127ab2a39585 13 days ago 188 MB layer_test first 48f47ef8257d 13 days ago 188 MB docker.io/ubuntu 14.04 5dbc3f318ea5 6 weeks ago 188 MB


아까 도커 build명령을 사용하여 빌드할때 설정했던 이름으로 이미지가 잘 생성 되었다. 이제 컨테이너를 생성할 차례인데 이미 도커 파일에서 EXPOSE 80이라는 설정으로 80포트를 오픈 해두었다 이제 해당 포트와 자동으로 매핑 시켜주는 -P 옵션을 추가 해주어야 한다. -d는 detached 옵션으로 백그라운드에서 실행 된다는 뜻이다.



# docker run -d -P --name apache_test apache_img:first 35adceda902976455b18631fe0677d5b3d247700c42ff2791383af40385fe068 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 35adceda9029 apache_img:first "apachectl -D FORE..." 28 seconds ago Up 28 seconds 0.0.0.0:32768->80/tcp apache_test d33a60d75c45 layer_test:first "/bin/bash" 13 days ago Exited (255) 26 hours ago layer_test2 c73025587f2b ubuntu:14.04 "/bin/bash" 13 days ago Exited (0) 13 days ago layer_test 0c18bda4235f ubuntu:14.04 "/bin/bash" 13 days ago Exited (0) 13 days ago nifty_fermat


컨테이너가 잘 생성되었다. 이제 지난 Docker : 컨테이너 편과 마찬가지로 HostOS에서 GuestOS의 아파치로 접근이 가능한지 확인 후 이번 편을 마치도록 하겠다.


는 무언가 잘못 되었다!!


외않되!!


# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 35adceda9029 apache_img:first "apachectl -D FORE..." 28 seconds ago Up 28 seconds 0.0.0.0:32768->80/tcp apache_test d33a60d75c45 layer_test:first "/bin/bash" 13 days ago Exited (255) 26 hours ago layer_test2 c73025587f2b ubuntu:14.04 "/bin/bash" 13 days ago Exited (0) 13 days ago layer_test 0c18bda4235f ubuntu:14.04 "/bin/bash" 13 days ago Exited (0) 13 days ago nifty_fermat


어찌된 영문인지 PORTS 항목을 자세히 보면 포트가 32768로 설정이 되어있다. Dockerfile에서 EXPOSE 80이라는 옵션을 주었기에 -P 옵션은 자동매핑이 가능해서 80은 80포트와 443은 443포트끼리 자동 매핑 되는줄 알았는데 그게 아니었다. 이래서 뇌피셜이 무섭다.

--publish , -pPublish a container’s port(s) to the host
--publish-all , -PPublish all exposed ports to random ports

무려 랜덤 매핑이다.


으응..?


때문에 직접 포트를 지정해주지 않으면 HostOS에서 GuestOS의 동일포트로 넘겨주기 어렵다.

아래와 같이 다시 -p 옵션을 주어 넘겨줄 포트와 넘겨받을 포트를 지정해주도록 하자.


#docker stop 35adceda9029 35adceda9029 # docker rm 35adceda9029 35adceda9029 # docker run -d -p 80:80 --name apache_test apache_img:first b748f27ede243331660ab7ea129a3052b26d416599f85a09ff61cae84efb703f # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b748f27ede24 apache_img:first "apachectl -D FORE..." 18 seconds ago Up 17 seconds 0.0.0.0:80->80/tcp apache_test d33a60d75c45 layer_test:first "/bin/bash" 13 days ago Exited (255) 26 hours ago layer_test2 c73025587f2b ubuntu:14.04 "/bin/bash" 13 days ago Exited (0) 13 days ago layer_test 0c18bda4235f ubuntu:14.04 "/bin/bash" 13 days ago Exited (0) 13 days ago nifty_fermat



설정이 잘 되었다. 이제 HostOS에서 GuestOS 80포트를 다시 호출해보도록 하자. 아래와 같은 화면이 나온다면 접근에 성공한것이다.





여기까지 도커파일을 생성하고 build명령을 통해 이미지 생성 및 컨테이너 생성, 80포트 접근(아파치)까지 진행 해봤다. 도커파일은 고용량 이미지를 보내기 부담스러울 때 텍스트로 대체하여 다른 사람에게 전달 할 수도 있고 이미지를 생성 하기 전 여러가지 옵션으로 설정을 변경 할 수도 있다. 때문에 도커파일은 도커 이미지와는 다르게 여러가지 커스텀한 옵션으로 다양한 환경에서 적절히 사용할 수 있는 아주 유용한 스크립트이다. 다음 편에서는 도커파일을 이용한 실습 및 활용에 대해 설명하겠다.




Docker : Dockerfile 편

끝.

'Docker' 카테고리의 다른 글

Docker : 컨테이너 오케스트레이션 개요 편  (0) 2019.04.19
Docker : Dockerfile 실습 편  (0) 2019.03.22
Docker : 이미지 편  (0) 2019.02.22
Docker : 컨테이너 편  (1) 2019.02.15
Docker : 설치 편  (0) 2019.01.31
Comments