DevOps

[Docker] Dockerfile 명령어 사용

nineDeveloper 2020. 3. 17. 14:31
728x90

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 명령을 조합한 예

  1. ENTRYPOINT 명령으로 top 명령을 실행
  2. 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;"]

베이스 이미지 빌드

DockerfileDockerfile.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
728x90