※ 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이 존재하는 디렉토리에 가서 실행 ( . 은 현재 패스)
# 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
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>
---------------------------------------------------------------
mc.tar
이미지명은 임의로 mc:1.0 으로 지정했다.
# docker build -t mc:1.0 - < mc.tar
컨테이너명은 임의로 mccon 으로 지정했다. 오픈포트는 9090
# docker run -d --name mccon -p 9090:80 mc:1.0
http://192.168.99.100:9090
프라퍼티 | 형식 | 내용 |
---|---|---|
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 명령은 호스트의 파일을 이미지에 복사하는 작업만 가능 (압축해제 없음)
※ 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"]