[Docker] Dockerfile 명령어 사용
Dockerfile 명령어 사용
명령 실행(RUN 명령)
컨테이너에는 FROM 명령에서 지정한 베이스 이미지에 대해 '애플리케이션/미들웨어를 설치 및 설정한다
환경 구축을 위한 명령을 실행한다 등과 같은 명령을 실행할 때는 RUN
명령을 사용함
Dockerfile을 작성할 때 RUN
명령을 가장 많이 사용함
RUN 명령
RUN
명령으로 지정한 명령은 Docker 이미지를 생성할 때 실행 됨
RUN [실행하고 싶은 명령]
RUN
명령에는 Shell, Exec 두 가지 형식의 기술 방법이 있음
1. Shell 형식의 RUN 명령
명령어의 지정을 쉘에서 실행하는 형식으로 기술하는 방법
Docker 컨테이너 안에서 /bin/sh -c
를 사용하여 명령을 실행했을 때와 똑같이 작동함
Docker 컨테이너에서 실행할 기본 쉘을 변경하고 싶을 때는 SHELL
명령을 사용함
# Nginx의 설치
RUN apt-get install -y nginx
2. Exec 형식의 RUN 명령
Exec 형식으로 기술하면 쉘을 경유하지 않고 직접 실행함
- 명령 인수에 $HOME과 같은 환경변수를 지정할 수 없음
- Exec 형식에서는 실행하고 싶은 명령을 JSON 배열로 지정함
- 다른 쉘을 이용하고 싶을 때는
RUN
명령에 쉘의 경로를 지정한 후 실행하고 싶은 명령을 지정 - 문자열을 인수로 지정할 때는 '(홑따옴표)를 사용함
# Nginx의 설치 RUN ["/bin/bash", "-c". "apt-get install -y nginx"]
여러개의 RUN 명령을 기술
RUN
명령은 기술된 내용에 따라 순차적으로 실행 됨
# 베이스 이미지 설정
FROM ubuntu:latest
# RUN 명령의 실행
RUN echo 안녕하세요 Shell 형식입니다
RUN ["echo", " 안녕하세요 Exec 형식입니다 "]
RUN ["/bin/bash", "-c", "echo", ' 안녕하세요 Exec 형식에서 bash를 사용해 보았습니다 ' "]
RUN 명령을 여러개 지정하는 경우
4개의 레이어가 생성됨
RUN yum -y install httpd
RUN yum -y install php
RUN yum -y install php-mbstring
RUN yum -y install php-pear
RUN 명령을 한 줄로 지정하는 경우
한줄에 쓸 수 있는 RUN
명령은 한줄에 쓰는 것이 좋음
RUN yum -y install httpd php php-mbstring php-pear
RUN 명령의 줄 바꿈
줄 바꿈을 넣으면 가독성이 향상되므로 명령을 쉽게 확인할 수 있음
RUN yum -y install\
httpd\
php\
php-mbstring\
php-pear
이미지 구성 보기
이미지를 생성할 때 어떤 명령이 실행되는지 확인하기 위해 docker history
명령을 실행
docker history run-sample
데몬 실행(CMD 명령)
이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하려면 CMD
명령을 사용
Dockerfile에는 하나의 CMD
명령을 기술할 수 있음
만일 여러개를 지정하면 마지막 명령만 유효함
예를 들어 웹 서버를 가동시키기 위해 Nginx를 설치하는 명령은 RUN
명령
설치한 Nginx를 데몬으로서 컨테이너 안에서 상시 작동시키기 위해서는 CMD
명령을 사용함
CMD 명령
CMD [실행하고 싶은 명령]
CMD
명령은 Shell, Exec, ENTRYPOINT 세 가지 형식의 기술 방법이 있음
1. Exec 형식의 CMD 명
- Exec 형식은 쉘을 호출하지 않음
- 인수는 JSON 배열로 지정함
CMD ["nginx", "-g", "daemon off;"]
2. Shell 형식의 CMD 명령
쉘을 통해 실행하고 싶을 떄 사용
CMD nginx -g 'daemon off;'
3. ENTRYPOINT 명령의 파라미터로 기술
ENTRYPOINT
명령의 인수로 CMD
명령을 사용할 수 있음
CMD 명령의 예
# 베이스 이미지 설정
FROM ubuntu:16.04
# Nginx 설치
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx
# 포트 지정
EXPOSE 80
# 서버 실행
CMD ["nginx", "-g", "daemon off;"]
Docker 이미지 작성 예
Dockerfile로부터 cmd-sample이라는 이름의 Docker 이미지를 생성함
docker build -t cmd-sample .
컨테이너 실행
docker container run -p 80:80 -d cmd-sample
데몬 실행(ENTRYPOINT 명령)
ENTRYPOINT
명령에서 지정한 명령은 Dockerfile에서 빌드한 이미지로부터 Docker 컨테이너를 시작함docker container run
명령을 실행했을 때 실행됨
ENTRYPOINT 명령
ENTRYPOINT [실행하고 싶은 명령]
ENTRYPOINT
명령은 Shell, Exec 두 가지 형식의 기술 방법이 있음
1. Exec 형식의 ENTRYPOINT 명령
ENTRYPOINT ["nginx", "-g", "daemon off;"
2. Shell 형식의 ENTRYPOINT 명령
ENTRYPOINT nginx -g 'daemon off;'
ENTRYPOINT
명령과 CMD
명령의 차이는 docker container run
명령 실행 시의 동작에 있음
CMD
명령의 경우 컨테이너 시작 시에 실행하고 싶은 명령을 정의 해도 docker container run
명령 실행 시에 인수로 새로운 명령을 지정한 경우 이것을 우선 실행함
ENTRYPOINT
명령에서 지정한 명령은 반드시 컨테이너에서 실행되는데, 실행 시에 명령 인수를 지정하고 싶을 때는 CMD
명령과 조합하여 사용함
ENTRYPOINT
명령으로 실행하고 싶은 명령 자체를 지정하고 CMD
명령으로는 그 명령의 인수를 지정하면, 컨테이너를 실행했을 때의 기본 작동을 결정할 수 있음
ENTRYPOINT 명령과 CMD 명령을 조합한 예
ENTRYPOINT
명령으로 top 명령을 실행CMD
명령으로 갱신 간격인-d
옵션을 10초로 지정함
이 이미지로 부터 작성된 컨테이너는 top 명령이 반드시 실행 되는데CMD
명령에서 지정한 옵션을 사용하여 실행 시의 인수를 임의로 docker container run
명령 실행 시로 지정할 수 있음
# Docker 이미지 취득
FROM ubuntu:16.04
# top 실행
ENTRYPOINT ["top"]
CMD ["-d". "10"]
docker container run 명령의 예
Dockerfile을 바탕으로 sample이라는 이미지를 작성하고 docker container run
명령을 실행CMD
명령은 docker container run
명령 실행 시 덮어 쓸 수 있다는 구조 때문에 가능한 것
# CMD 명령에서 지정한 10초 간격으로 갱신하는 경우
docker container run -it sample
# 2초 간격으로 갱신하는 경우
docker container run -it sample -d 2
빌드 완료 후에 실행되는 명령(ONBUILD 명령)
ONBUILD
명령은 그 다음 빌드에서 실행할 명령을 이미지 안에 설정하기 위한 명령
인프라 구축과 관련된 이미지 작성과 애플리케이션 전개와 관련된 이미지 생성을 나눌 수 있음
ONBUILD 명령
ONBUILD
명령은 자신의 Dockerfile로부터 생성한 이미지를 베이스 이미지로 한 다른 Dockerfile을 빌드 할 때 실행하고 싶은 명령을 기술
ONBUILD [실행하고 싶은 명령
Sample 코드: https://github.com/asashiho/dockertext2/tree/master/chap05/onbuild
1. 베이스 이미지 작성(Dockerfile.base)
# 베이스 이미지 작성
FROM ubuntu:17.10
# Nginx 설치
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx
# 포트 지정
EXPOSE 80
# 웹 콘텐츠 배치
ONBUILD ADD website.tar /var/www/html/
# Nginx 실행
CMD ["nginx", "-g" "daemon off;"]
베이스 이미지 빌드
Dockerfile을 Dockerfile.base라는 이름으로 하고 이미지를 빌드docker build
명령을 사용하여 파일명을 지정할 때는 -f
옵션 다음에 파일명을 지정함
docker build -t web-base -f Dockerfile.base .
2. 웹 콘텐츠 개발
샘플로서 HTML 파일이나 CSS 파일, 그림 파일 등을 website라는 이름으로 하여 tar
명령을 사용하여 하나로 모음
디렉토리 구성을 포함해도 상관 없음
3. 웹 서버용 이미지 작성
작성한 베이스 이미지를 FROM
명령으로 지정
# Docker 이미지 취득
FROM web-base
웹 서버용 이미지 빌드
Dockerfile을 빌드하면 ONBUILD
명령에서 지정한 웹 콘텐츠를 이미지에 추가하는 처리가 실행됨
docker build -t photoview-image
4. 웹 서버용 컨테이너 시작
http://localhost 애플리케이션이 동작확인
docker container run -d -p 80:80 photoview-image
이미지의 상세 정보 확인
docker image inspect
명령으로 이미지에 ONBUILD
명령이 설정 여부를 확인할 수 있음
docker image inspect --format="{{ .Config.OnBuild }}" web-base
[ADD website.tar /var/www/html/]
시스템 콜 시그널의 설정(STOPSIGNAL 명령)
컨테이너를 종료할 때에 송신하는 시그널을 설정하려면 STOPSIGNAL
명령을 사용함
STOPSIGNAL 명령
STOPSIGNAL
명령에는 시그널 번호(9 등) 또는 시그널명(SIGKILL 등)을 지정할 수 있음
STOPSIGNAL [시그널]
컨테이너의 헬스 체크 명령(HEALTHCHECK 명령)
컨테이너 안의 프로세스가 정상적으로 작동하고 있는지를 체크하고 싶을 때는 HEALTHCHECK
명령을 사용
HEALTHCHECK 명령
HEALTHCHECK [옵션] CMD 실행할 명령
지정할 수 있는 옵션
옵션 | 설명 | 기본값 |
---|---|---|
--interval=n |
헬스 체크 간격 | 30s |
--timeout=n |
헬스 체크 타임아웃 | 30s |
--retries=N |
타임아웃 횟수 | 3 |
HEALTHCHECK 명령의 예
5분마다 가동 중인 웹 서버의 메인 페이지(http://localhost/)를 3초 안에 표시할 수 있는지 없는지를 확인
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1
HEALTHCHECK 확인
docker container inspect webap