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
'쿠버네티스 교육 > 강의 내용 정리' 카테고리의 다른 글
220617_2_도커_Dockerfile 명령 ADD / COPY / VOLUME (0) | 2022.06.17 |
---|---|
220617_1_도커_Dockerfile 명령 ENV / WORKDIR / USER / EXPOSE / ARG / SHELL (0) | 2022.06.17 |
220616_2_도커_Dockerfile 빌드, 멀티 스테이지 빌드 (0) | 2022.06.16 |
220616_1_도커_Dockerfile을 사용한 구성 관리 (0) | 2022.06.16 |
220615_4_도커_docker container commit / export, image import / save / load (0) | 2022.06.16 |