서버 운영 관리

윤황용 에반젤리스트

Dockerfile 작성 예시

1. Dockerfile이란?

 

Dockerfile이란 docker에서 이용하는 이미지를 기반으로 하여 새로운 이미지를 스크립트 파일을 통해 내가 설정한 나만의 이미지를 생성할 수 있는 일종의 이미지 설정파일입니다.

dockerfile을 이용하면 컨테이너 생성 시 기존 이미지로 생성하였을 경우 추가로 설정해줘야 할 것들을 미리 설정 및 사전 준비가 가능하므로 잘 이용할 수 있다면 무궁무진한 형태의 이미지를 좀 더 간편하고 손쉽게 만들어 낼 수 있습니다.

이 글에서는 간단하게 centos 이미지에 httpdphp를 설치하여 연동시키는 예시로 dockerfile을 작성하는 방법을 알아보겠습니다.

 

2. dockerfile 작성

 

2-1. 디렉토리 및 dockerfile 생성

 



 

dockerfile의 경우 파일이 있는 디렉토리를 context로 인식하여 작업이 진행되므로 작성 및 빌드까지 새로운 디렉토리를 만들어서 해당 디렉토리 내부에서 작업을 진행하시는 것을 추천합니다.

Dockerfile 자체에 다른 확장자가 있는 것은 아니므로 원하시는 파일 이름으로 생성을 진행하시면 됩니다.

 

2-2. dockerfile 작성

 



# vi dockerfile

-----------------------------------------------------------------

FROM centos:latest

 

MAINTAINER newbnewbe

 

# yum 업데이트 및 apache, php 설치

RUN yum update && yum install -y httpd php

 

# php 연동

RUN cp -arp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.ori

RUN sed -i 's/#ServerName www.example.com:80/ServerName localhost/g' /etc/httpd/conf/httpd.conf

 

RUN sed -i 's/DirectoryIndex index.html/DirectoryIndex index.html index.php index.jsp/g' /etc/httpd/conf/httpd.conf

 

RUN sed -i 's/#AddHandler cgi-script .cgi/AddHandler cgi-script .cgi/g' /etc/httpd/conf/httpd.conf

 

RUN sed -i '/AddType application\/x-gzip .tgz/a\ #PHP Enable' /etc/httpd/conf/httpd.conf

 

RUN sed -i '/\ #PHP Enable/a \ AddType application/x-httpd-php-source .phps' /etc/httpd/conf/httpd.conf

 

RUN sed -i '/\ #PHP Enable/a \ AddType application/x-httpd-php .php .jsp .html' /etc/httpd/conf/httpd.conf

 

# 공유할 볼륨 지정

VOLUME ["/var/www/html", "/etc/httpd"]

 

# 포워딩 할 포트 지정

EXPOSE 80 443

 

# Context 에서 index.htmlphpinfo 페이지 가져오기

ADD index.html /var/www/html

ADD phpinfo.php /var/www/html

 

# docker run apache 시작

ENTRYPOINT ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

 

명령어별 용도로 위의 내용을 정리해보겠습니다. 아래 서술하는 명령에는 위 예시에는 없는 것도 있습니다.

 

- FROM

docker 이미지 생성에 있어서 기초가 되는 이미지를 지정합니다. Dockerfile 작성에 있어서 가장 기초가 되는 부분이며 이미지를 로컬에 가지고 있을 경우 그냥 사용하지만, 없다면 도커 허브에서 제공하는 이미지를 불러오게 되어 있습니다. 위 예시에서는 centos의 최신 버전을 이용하고 있습니다.

 

-MAINTAINER

해당 이미지의 생성, 유지, 보수, 등의 즉 관리자를 뜻하는 란입니다.

실질적으로는 아무런 효과는 없습니다.

 

-RUN

쉘 명령어를 사용 할 수 있도록 해줍니다. 위에 예시에서는 다중의 run 구문을 이용하여 가독성을 높였으나, &|, \ 등을 통해 줄여주실 수 있다면, 줄여주시는 것이 좋습니다. 주로 packgage 설치나 기본 설정에 사용합니다.

 

-VOLUME

이 이미지로 만든 컨테이너와 호스트 간의 연결이 가능한 볼륨을 지정해줍니다.

위 예시에서는 httpdRootDirectory/var/www/html 과 설정 폴더가 있는 /etc/httpd를 공유할 수 있도록 하였습니다.

이는 이미지 생성 후 docker run 명령어 사용 시 -v 옵션과 함께 <호스트 볼륨>:<컨테이너 볼륨>의 모양으로 설정하게 되며, 설정이 없을 경우, 이미지에서 제공하는 파일들이 들어가있게 됩니다.

 

-EXPOSE

컨테이너와 호스트 간 연결이 가능한 포트를 지정해주게 됩니다.

현재 제작하려는 이미지는 httpdphp를 설치한 웹 서비스 컨테이너이므로, 80번과 443번 포트를 매칭할 수 있도록 지정해주었습니다.

 

-ADD COPY

ADDCOPY는 이미지로 파일을 불러오는 기능을 합니다.

차이점이라면 COPY의 경우 실제 로컬에서만 파일을 불러 올 수 있으며, 파일 자체를 가져오게 됩니다. ADD의 경우 url을 사용하여 외부에서도 파일을 가져 올 수 있으며, tar로 압축 된 파일을 풀어서 가져오게 됩니다. 다만 인터넷 url을 통해 가져온 파일의 경우는 tar의 경우에도 원본으로 가져옵니다.

위 예시에서는 볼륨 지정 없이 이미지만 올렸을 경우 띄울 index .html페이지와, php연동이 잘 되었는지 확인하기 위한 phpinfo 페이지를 로컬, , dockerfile이 있는 doc_build라는 디렉토리에서 가져오도록 설정하였습니다.

               

사진 1: index.html                                                                                                    사진 2: phpinfo.php



-ENTRYPONTCMD

docker run 명령어 실행, 멈춰있던 컨테이너가 다시 시작될 경우 등에 쉘 명령어 및 스크립트를 변수를 받아 사용할 수 있습니다.

이 두 명령어의 경우 용도 및 사용법이 매우 비슷하여 언뜻 구분이 어려울 수 있습니다.

우선 위 예시를 보겠습니다.

 

ENTRYPOINT ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

 

/usr/sbin/apachectl 이라는 쉘 스크립트를 -D, FOREGROUND라고 하는 인자 값들을 받아 실행시키겠다는 의미입니다.

 

ENTRYPOINT apachectl -D FOREGOUND

 

이렇게 입력을 해줘도 되지만 위와 같이 입력을 해주는 것이 좀 더 정확하게 인식을 한다고 합니다.

왜냐하면 이렇게 입력하는 것은 기본을 /bin/sh -c 명령어로 호출하여 실행하기 때문입니다.

 

작성 방식은 RUN, ENTRYPOINT, CMD가 동일합니다.

다만 RUN 명령어는 위에서 언급했듯 기초 세팅에 필요한 부분에서 이용하는 것이 좋습니다.

ENTRYPOINT의 경우 dockerfile 내에서 1개만 작동합니다.

 

CMD의 경우 여러개를 선언하여도 override가 가능합니다.

ENTRYPOINTCMD가 같이 쓰이기도 하는데,

 

ENTRYPOINT [“/bin/echo”,”Hello”]

CMD [“world”]

 

라고 작성할 경우 결과물로 컨테이너 실행 시 Hello world를 볼 수 있습니다.

 

 

2-3. dockerfile build

  



 

docker build -t 이미지명:라벨명

 

위 명령어로 이미지 파일을 만들 수 있습니다.

 



docker images

 

위 명령어를 통해 갖고 있는 이미지 목록을 볼 수 있습니다.

 

 

2-4. docker run 실행 및 확인

 

docker run -it -d –name 컨테이너명 -p 80:80 -p 443:443 이미지명:라벨명

 

현재 웹 데몬은 계속 돌아야 하므로 -d 옵션을 주고, 컨테이너명을 지정해주고, 위에서 지정해줬던 포트들을 매칭 해놓은 상황입니다. 현재 -v 옵션을 주지 않은 것은 제가 넣은 페이지가 잘 뜨는 지 확인하기 위해 입니다.

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

미리 넣었던 페이지가 잘 뜨는 것을 확인하였습니다.

이젠 로컬의 /mnt 디렉토리를 컨테이너의 /var/www/html 디렉토리와 매칭 시킬 예정입니다.

또 다른 간단한 페이지를 /mnt 디렉토리에 넣어 놓도록 하겠습니다.

 

 

 

              << index.html 이 될 페이지의 소스

 

    

 

       

                <<  /mnt 디렉토리와 컨테이너의 /var/www/html 디렉토리를 매칭하여 컨테이너 생성

 

docker run -it -d –name test -p 80:80 -p 443:443 -v /mnt:/var/www/html apa-php:test

 

컨테이너가 잘 올라온 것을 볼 수 있습니다.

 


넣어 놓은 페이지 역시도 잘 보이는 것을 확인 할 수 있습니다.

 

질문 및 제안하기

댓글 0

댓글 내역이 없습니다.

댓글 더 보기 첫 댓글 맨 위