Programming > Docker

Dockerfile 이란? 사용 명령어

Dockerfile이란

※ Dockerfile에 있는 명령어는 매번, 중간적인 Docker Container로서 기동된다.

각 명령어를 실행하는 각각의 단계에서 Docker Image를 작성하는 것을 반복한다.
각 단계의 Docker Image를 Layer라고 부른다.

※ 주의  (각 단계 마다의 레이어가 생성되므로)

[Docker file}

RUN cd /tmp         ## (1)
RUN touch test.txt  ## (2)

* 위와 같이 도커파일에 명령어가 있을 경우

test.txt파일은 /tmp 아래에 생기는 것이 아니라 / 루트 아래에 생긴다.

각각의 명령어가 실행할 때마다 새로운 컨테이너가 생성되고 디폴트 디렉토리는 루트(/)가 되기 때문이다.
RUN cd /tmp && touch test.txt  과 같이 && 를 사용해 하나의 명령어로 실행해야 원하는 곳에 작성된다.

※ 작성할 수 있는 레이어 수는 (128개) 이다 : 상한선

되도록 하나의 명령어로 yum 같은 것은  ( 레이어가 많으면 이미지 크기도 커진다. )
단, 캐쉬기능도 생각해야 되므로 적절히 보합해서 명령을 만든다.

 

Dockerfile 빌드하기

Dockerfile이 존재하는 디렉토리에 가서 실행 ( . 은 현재 패스)

# docker build .

Dockerfile이 존재하는 디렉토리를 지정한다.

# docker build /root/data/files

이미지 이름을 지정해서 빌드할 경우 옵션 -t 를 사용한다. (이미지명:myimage, 버전:1.0)

# docker build -t myimage:1.0 /root/data/files


빌드할 Dockerfile 을 default 이외의 이름을 지정할 경우 -f 옵션사용 (Dockerfile name = nginxDocker.txt )
 ※ 아래는 /root/data/files/nginxDocker.txt  를 갖고 빌드하라는 명령어다.
  단, 파일명이 Dockerfile 이 아닌경우 Docker Hub에서는 이미지가 자동으로 생성되지 않는다.

 # docker build -t myimage:1.0 -f nginxDocker.txt /root/data/files

패키징 형식으로 빌드하기 (표준입력) : # docker build - < mydoc.tar.gz ...

1) 샘플로 httpd 이미지 작성용 샘플을 만든다.

Dockerfile
---------------------------------------------------------------
FROM centos:latest

RUN yum -y install httpd
COPY index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
---------------------------------------------------------------


index.html
---------------------------------------------------------------
<h3>index.test.test</h3>
---------------------------------------------------------------

2) 위 2개 파일을 tar 로 압축한다.

mc.tar

3) 표준입력으로 이미지를 생성한다.

이미지명은 임의로 mc:1.0 으로 지정했다.

# docker build -t mc:1.0 - < mc.tar

4) 위에서 생성한 mc:1.0 이미지로 컨테이너를 실행한다.

컨테이너명은 임의로 mccon 으로 지정했다. 오픈포트는 9090

# docker run -d --name mccon -p 9090:80 mc:1.0

5) 웹 테스트 해본다.

http://192.168.99.100:9090

 

Dockerfile에서 사용하는 명령어들

프라퍼티 형식 내용
FROM <image> 어느 이미지를 기본으로 할 것인가
<image>:<tag> ex) ubuntu:latest
<image>@<digest>  
MAINTAINER emunhi <emunhi@emunhi.com> 작성한 유저의 정보
RUN apt-get update 실행 명령어(빌드시 실행된다)
<command>  
["executable","para1","para2"]  
ADD entrypoint.sh / 파일을 컨테이너에 업로드한다.
<src>... <dest> 여러개 소스를 컨테이너 패스 dest에 복사
["src",..."dest"] 폴더에 공백이 있으면 위 것을 이와 같이 사용
UID,GID가 모두 0으로 작성되므로 root이외 사용자의 경우 퍼미션을 변경할 필요가 있다.
COPY <src>...<dest> 여러개 소스를 컨테이너 패스 dest에 복사
["src",..."dest"] 폴더에 공백이 있으면 위 것을 이와 같이 사용
UID,GID가 모두 0으로 작성되므로 root이외 사용자의 경우 퍼미션을 변경할 필요가 있다.
ENTRYPOINT ["/entrypoint.sh"] 이미지 완료 후 실행하는 명령어
CMD echo "now running..." 도커가 run할때 실행된다.
["실행","para1","para2"] ex) apache실행:CMD ["/usr/sbin/aachectl","-D","FOREGROUND"]
ENV foo /bar abc=hello 프라퍼티 생성 key/value
PATH="$HOME/bin:$PATH" 환경변수 설정
<key> <value>  
<key>=<value>....  
WORKDIR ${foo} Container안의 Current Directory (like cd)
EXPOSE port 번호 지정한 포트를 외부에 공개한다.
LABEL    
STOPSIGNAL    
USER   컨테이너에서 사용되는 유저명/UID
VOLUME   외부로부터 마운트 가능한 볼륨(데이터 영속화 가능)
ONBUILD   다음빌드에서 실행되는 커멘드
만들어진 이미지로 다음 Dockerfile을 build하면 ONBUILD가 실행된다.

 

※ COPY 와 ADD 는 비슷하다.

ADD는 원격파일을 다운로드하거나 파일 압축풀기 등이 가능하다.
COPY 명령은 호스트의 파일을 이미지에 복사하는 작업만 가능 (압축해제 없음)

 

 

Apache 이미지 만들기 (Dockerfile)

※ Dockerfile

# 이미지
FROM centos:7

MAINTAINER emunhi <emunhi@emunhi.com>

# RUN: build 할때 실행
RUN echo "now running.....RUN"

# CMD: run 할때 실행
CMD echo "now running.....CMD"

# httpd install
RUN yum install -y httpd

# host의 index.html 파일을 guest(container image)에 복사한다.
ADD ./index.html /var/www/html/

# port 80을 개방한다.
EXPOSE 80

# run 했을때 apache를 기동한다
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]