쿠버네티스 교육/강의 내용 정리

220616_3_도커_Dockerfile 명령 RUN / CMD / ENTRYPOINT / ONBUILD

kimhope 2022. 6. 16. 18:49
728x90

명령 및 데몬 실행


RUN: 명령 실행

- 컨테이너에는 FROM 명령에서 지정한 베이스 이미지에 대해 '애플리케이션/미들웨어 설치 및 설정', '환경 구축 위한 명령 실행' 등과 같은 명령 실행 시 사용

- 이미지를 작성하기 위해 실행하는 명령 기술

Shell 형식

  • 쉘에서 실행
  • Shell 형식의 RUN 명령
# nginx 설치
RUN apt-get install -y nginx

 

Exec 형식

  • 쉘을 경유하지 않고 직접 실행
  • 환경 변수 지정 불가 (ex. $HOME 등)
  • 쉘 이용을 원할 경우 RUN 명령에 쉘 경로 지정
  • Exec 형식의 RUN 명령
# nginx 설치
RUN ["/bin/bash", "-c", "apt-get install -y nginx"]

 

  • RUN 명령의 실행 예
  • 문자열을 인수로 지정할 때는 ' (홑따옴표) 사용
  • RUN 명령은 Dockerfile에 여러 개 기술
# 베이스 이미지 설정
FROM ubuntu:latest

# RUN 명령 실행
RUN echo 안녕하세요 Shell 형식입니다
RUN ["echo", " 안녕하세요 Exec 형식입니다 "]
RUN ["/bin/bash", "-c", "echo ' 안녕하세요 Exec 형식에서 bash를 사용해 보>았습니다' "]

 

 

  • RUN 명령의 실행 로그
  • Dockerfile 은 명령 한 줄마다 이미지를 생성함
[root@localhost Dockerfile]# docker build -t run-test .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu:latest
 ---> 27941809078c
Step 2/4 : RUN echo 안녕하세요 Shell 형식입니다
 ---> Running in d44b834efa8a
안녕하세요 Shell 형식입니다
Removing intermediate container d44b834efa8a
 ---> dcf3550fd766
Step 3/4 : RUN ["echo", " 안녕하세요 Exec 형식입니다 "]
 ---> Running in 52f6c3ebf053
 안녕하세요 Exec 형식입니다
Removing intermediate container 52f6c3ebf053
 ---> 7b00dfbd8e60
Step 4/4 : RUN ["/bin/bash", "-c", "echo ' 안녕하세요 Exec 형식에서 bash를 사용해 보았습니다' "]
 ---> Running in da4e2d292bb7
 안녕하세요 Exec 형식에서 bash를 사용해 보았습니다
Removing intermediate container da4e2d292bb7
 ---> dcc5b8101c6b
Successfully built dcc5b8101c6b
Successfully tagged run-test:latest

 

  • 이미지 구성
  • 이미지를 생성할 때 어떤 명령이 실행되는지 확인
[root@localhost Dockerfile]# docker history run-test
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
dcc5b8101c6b   4 minutes ago   /bin/bash -c echo ' 안녕하세요 Exec 형식에서…            0B
7b00dfbd8e60   4 minutes ago   echo  안녕하세요 Exec 형식입니다                          0B
dcf3550fd766   4 minutes ago   /bin/sh -c echo 안녕하세요 Shell 형식입니다               0B

 


 

CMD: 데몬 실행

- 이미지를 바탕으로 생성된 컨테이너 안에서 명령 실행 시 사용

- Dockerfile에는 하나의 CMD 명령만 기술 가능, 여러 개 지정 시 마지막 명령만 유효

Exec 형식

  • 쉘을 호출하지 않음
  • nginx를 포어그라운드에서 실행
CMD ["nginx", "-g", "daemon off;"]

 

Shell 형식

  • nginx를 포어그라운드에서 실행
CMD nginx -g 'daemon off;'

 

ENTRYPOINT 명령의 파라미터로 기술

  • ENTRYPOINT 명령의 인수로 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 이미지 작성
[root@localhost Dockerfile]# docker build -t cmd-test .

 

  • 컨테이너 실행
[root@localhost Dockerfile]# docker container run -p 80:80 -d cmd-test
5d35e96603b8f7b61a3b9b8b95978e6d7610bbc66854a2598412694c8083e09e

[root@localhost Dockerfile]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS        PORTS                                       NAMES
5d35e96603b8   cmd-test    "nginx -g 'daemon of…"   3 seconds ago   Up 1 second   0.0.0.0:80->80/tcp, :::80->80/tcp           bold_jepsen

 

 


 

ENTRYPOINT: 데몬 실행

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

Exec 형식

  • nginx를 포어그라운드에서 실행
ENTRYPOINT ["nginx", "-g", "daemon off;"]

 

Shell 형식

  • nginx를 포어그라운드에서 실행
ENTRYPOINT nginx -g 'daemon off;'

 

  • ENTRYPOINT 명령과 CMD 명령 조합
  • ENTRYPOINT 명령: 실행하고자 하는 명령 자체 지정
  • CMD명령: 그 명령의 인수 지정
  • ENTRYPOINT 명령으로 TOP 명령 실행, CMD 명령으로 갱신 간격인 -d 옵션을 10초로 지정
  • 이 이미지로부터 작성된 컨테이너는 top 명령이 반드시 실행되는데, 이 때 CMD 명령에서 지정한 옵션을 사용하여 실행 시의 인수를 임의로 docker container run 명령 실행 시로 지정할 수 있음
# 베이스 이미지 설정
FROM ubuntu:16.04

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

 

  • 이미지 작성
[root@localhost Dockerfile]# docker build -t ent-cmd .

 

  • 컨테이너 생성 및 실행
# CMD 명령에서 지정한 10초 간격으로 갱신하는 경우
[root@localhost Dockerfile]# docker container run -it ent-cmd

 

  • CMD 명령은 docker container run 명령 실행 시 덮어 쓸 수 있는 구조 때문에 가능함
# 2초 간격으로 갱신
[root@localhost Dockerfile]# docker container run -it ent-cmd -d 2

 


 

ONBUILD: 빌드 완료 후 실행되는 명령

- 다음 빌드에서 실행할 명령을 이미지 안에 설정하기 위한 명령

- Dockerfile로부터 생성한 이미지를 베이스 이미지로 한 다른 Dockerfile을 빌드할 때 실행

- 웹 시스템 구축 시 OS 설치 및 환경 설정, 웹 서버 설치 및 각종 플러그인 설치 등과 같은 인프라 환경 구축과 관련된 부분을 베이스 이미지로 작성

- 인프라 구축 관련 이미지와 애플리케이션 전개 관련 이미지 생성을 나누어 실행

- 이 때, ONBUILD 명령으로 이미지 안에 개발한 프로그램을 전개하는 명령(ADD, COPY 등) 지정

  • 1. 베이스 이미지 작성(Dockerfile.base)
# 베이스 이미지 설정
FROM ubuntu:17.10

# Nignx 설치
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라는 이름으로 지정하여 빌드 (-f 옵션 사용)
  • web-base라는 베이스 이미지가 생성됨
[root@localhost Dockerfile]# docker build -t web-base -f Dockerfile.base .

 

  • 2. 웹 콘텐츠 개발
  • Dockerfile이 있는 디렉토리에서 index.html 파일 생성 후 website.tar 파일로 압축
[root@localhost Dockerfile]# vi index.html
<!doctype html>
<html>
  <head>
    <h1>ONBUILD</h1>
  </head>
  <body>
    <img src="https://3.bp.blogspot.com/-rAve4gA0DNY/WzYXGT3G3aI/AAAAAAAABak/YGC8oM_TMsYDi9ZX8G6iEXgsag728eixgCLcBGAs/s400/Docker%2BONBUILD%2BCommand%2BExplained%2Bwith%2BExamples.jpg">
  </body>
</html>

[root@localhost Dockerfile]# tar -cvf website.tar index.html
index.html

[root@localhost Dockerfile]# ls
Dockerfile  Dockerfile.base  index.html  website.tar

 

  • 3. 웹 서버용 이미지 작성
# Docker 이미지 취득
FROM web-base

 

  • 웹 서버용 이미지 빌드
  • webpage라는 도커 이미지 생성
[root@localhost Dockerfile]# docker build -t webpage .
Sending build context to Docker daemon  14.85kB
Step 1/1 : FROM web-base
# Executing 1 build trigger
 ---> 3a4fd07273fc
Successfully built 3a4fd07273fc
Successfully tagged webpage:latest

 

 

  • 4. 웹 서버용 컨테이너 시작
[root@localhost Dockerfile]# docker container run -d -p 80:80 webpage
8b7f0e59a5d8cbfb08e9eb457c6fb9e8b077dcb4326e774a0f1ed687a4697809

 

  • 웹 브라우저에서 접속하여 확인 (enp0s8)

 

728x90