ComputerScience/Docker

[Docker] 11. Dockerfile 명령 및 데몬 실행 (1)

kyungmin.yu 2019. 5. 16. 22:17

 Docker 이미지를 만들기 위해서 필요한 미들웨어를 설치하고, 사용자 계정이나 디렉토리들을 설정하는 명령을 실행할 필요가 있고, 이미지로부터 컨테이너를 실행했을 때 서버 프로세스등을 데몬으로 작동시킬 필요도 있음

 

명령실행(RUN 명령)

 컨테이너에는 FROM 명령에서 지정한 베이스 이미지에 대해 애플리케이션/미들웨어를 설치 및 설정한다’, ‘환경 구축을 위한 명령을 실행한다등과 같은 명령을 실행할 때는 RUN 명령을 사용함

 Dockerfile을 작성할 때 이 RUN 명령을 가장 많이 사용하고 아래와 같은 구문으로 사용함

RUN [실행하고 싶은 명령]

RUN 명령에는 두가지 기술법이 존재함

1. SHELL 형식으로 기술

: 명령 지정을 쉘에서 실행하는 형식으로 지정하는 방법. 예를 들어 apt 명령으로 nginx를 설치하는 경우 아래와 같은 형식으로 사용

RUN apt-get install –y nginx

 이 경우 docker 컨테이너 안에서 /bin/sh -c를 사용하여 명령을 실행했을 때와 같은 기능을 함. 사용되는 기본 쉘을 변경하고 싶을 SHELL 명령을 사용함

 

2. EXEC 형식으로 기술

: SHELL 형식으로 명령을 기술하면 /bin/sh에서 실행되지만, EXEC 형식으로 기술하면 쉘을 경유하지않고 직접 실행됨. 따라서 명령인수에 $HOME과 같은 환경변수를 지정할 수 없음. EXEC 형식에서는 실행하고 싶은 명령을 JSON 배열로 지정함. 또한, 다른 쉘을 지정하고 싶을 때는 RUN 명령에 쉘의 경로를 지정한 후 실행하고 싶은 명령을 지정함 이 예를 들어 EXEC 형식으로 출력을 하는 경우 아래와 같은 방법들을 사용할 수 있음

RUN [“echo”, “ exec 형식 사용”]
RUN [“/bin/bash”, “-c”, “echo ‘ exec 형식에서 bash 사용’ ”]

• 이미지 레이어의 이해

: Dockerfile을 빌드하면 기술된 명령마다 내무 이미지가 하나씩 작성됨. 그래서 Docker 명령을 줄이는 방법이 몇가지 고안됨. 아래의 경우 이미지 레이어가 4개가 만들어짐

RUN yum –y install httpd
RUN yum –y install php
RUN yum –y install php-mbstring
RUN yum –y install php-pear

 하지만 다음과 같은 경우는 하나의 레이어만 생성됨

RUN yum –y install httpd php php-mbstring php-pear

 이처럼 한 줄에 쓸 수 있는 경우는 한 줄에 는 것이 이미지 레이어를 줄이는데 도움이 됨

명령의 가독성을 위해 백슬래시(\)를 이용해서 줄바꿈을 넣을 수도 있음

RUN yum –y install httpd\
                   php\
                   php-mbstring\
                   php-pear

 

데몬실행(CMD 명령)

 RUN 명령은 이미지를 작성하기 위해 실행하는 명령을 기술하지만, 이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하려면 CMD 명령을 사용함. Dockerfile에서는 하나의 CMD명령을 사용할 수 있음. 만약 여러 개의 CMD 명령을 지정하면 마지막 것만 유효함.

 예를 들어 웹서버를 가동시키기위해 Nginx를 설치하는 명령은 RUN 명령을, 설치한 Nginx데몬으로 컨테이너 안에서 상시 작동시키기위해서느 CMD 명령을 사용함.

CMD [실행하고 싶은 명령]  

CMD 명령에는 가지 기술법이 존재함

1. SHELL 형식으로 기술

2. EXEC 형식으로 기술

=> 위의 두 경우는 RUN 명령과 동일한 방식으로 사용하고 EXEC 형식 사용시에 쉘을 호출하지 않는 점만 다름

3. ENTRYPOIN파라미터로 기술

: 아래의 ENTRYPOINT에서 함께 설명

 

데몬실행(ENTRYPOINT 명령)

ENTRYPOINT 명령에서 지정한 명령은 Dockerfile에서 빌드한 이미지로부터 Docker 컨테이너를 시작하기 때문에 docker container run 명령을 실행했을 때 실행됨.

ENTRYPOINT [실행하고 싶은 명령]  

ENTRYPOINT 명령에는 두가지 기술법이 존재함

1. SHELL 형식으로 기술

2. EXEC 형식으로 기술

=> 위의 두 경우 CMD 명령과 동일한 방식으로 사용함

 

• RUN 명령과 ENTRYPOINT 명령의 차이

: 둘 사이의 차이는 docker container run 명령 실행 시의 동작에 있음. CMD 명령의 경우 컨테이너 시작 시에 실행할 명령을 정의해도 docker container run 명령 실행 시에 인수로 새로운 명령을 지정하는 경우 이것을 우선하여 실행함.

(docker container run 명령의 인수를 CMD로 본다고 생각하면 편함 마지막 CMD가 새로 지정되기 때문에 이전에 정의한 CMD를 무시)

 ENTRYPOINT 명령에서 지정한 명령은 반드시 컨테이너에서 실행되는데 실행시에 명령 인수를 지정하고 싶은 경우 CMD 명령과 조합하여 사용함. ENTRYPOINT 명령으로는 실행하고 싶은 명령 자체를 지정하고 CMD 명령으로는 그 명령의 인수를 지정하면 컨테이너를 실행했을 때 기본 동작을 결정할 수 있음(CMD 명령의 기술법 3)

 예를 들어 ENTRYPOINT 명령으로 top 명령을 실행하고 그 뒤에 CMD 명령으로 갱신 간격인 –d 옵션을 10으로 지정함. 그러면 이 이미지로부터 작성된 컨테이너는 top 명령이 반드시 실행되는데

이 때 CMD 명령으로 지정한 옵션을 docker container run 명령의 인수로 덮어씌울 수 있음

# Docker 이미지 취득
FROM ubuntu:18.04

# top 실행
ENTRYPOINT [“top”]
CMD [“-d”, “10”]

 이 Dockerfile을 바탕으로 sample 이라는 이미지를 작성하고 docker container run 명령을 실행하면 다음과 같은 차이를 볼 수 있음

docker container run -it sample
docker container run -it sample -d 2

 첫번째는 top 명령의 갱신이 10초 간격으로, 두번째는 2초 간격으로 이루어짐 CMD 명령은 docker container run 명령 실행시에 덮어 씌울 수 있다는 구조때문에 가능한 방법임. 이를 이용하면 확장성 혹은 사용성이 좋은 이미지를 만들 수 있을 듯 함