Dockerfile을 사용한 구성 관리
Dockerfile은 Docker상에서 작동시킬 컨테이너의 구성정보를 기술하기 위한 파일.
docker build
명령을 통해 Dockerfile에 기술된 구성정보를 바탕으로 Docker 이미지를 작성한다.
Dockerfile의 기본 서식
명령 인수
명령
은 대소문자 상관없이 사용가능하며 관례적으로 대문자를 통일해 사용.
명령 | 설명 |
---|---|
FROM | 베이스 이미지 지정 |
RUN | 명령 실행 |
CMD | 컨테이너 실행 명령 |
LABEL | 라벨 설정 |
EXPOSE | 포트 익스포트 |
ENV | 환경변수 |
ADD | 파일/디렉토리 추가 |
COPY | 파일 복사 |
ENTRYPOINT | 컨테이너 실행 명령 |
VOLUME | 볼륨 마운트 |
USER | 사용자 지정 |
WORKDIR | 작업 디렉토리 |
ARG | Dockerfile 안의 변수 |
ONBUILD | 빌드 완료 후 실행되는 명령 |
STOPSIGNAL | 시스템 콜 시그널 설정 |
HEALTHCHECK | 컨테이너 헬스 체크 |
SHELL | 기본 쉘 설정 |
Dockerfile에 주석을 쓰는경우 앞에 #
을 붙인다.
#주석 주석입니다.
명령 인수
명령 인수 # 이것도 주석
Dockerfile 작성
Dockerfile에는 'Docker 컨테이너를 어떤 Docker 이미지로부터 생서할지'라는 정보를 기술해야한다. 이걸 베이스 이미지라 한다.
FROM 명령
FROM [이미지명]
FROM [이미지명]:[태그명]
FROM [이미지명]@[다이제스트]
FROM명령은 필수 항목이며 CentOS 7버전을 베이스 이미지로 사용할 경우
# FROM [이미지명]:[태그명]
FROM centos:centos7
# 태그명을 생략할경우 최신버전이 적용된다 (latest)
FROM centos
다이제스트를 저장한 Dockerfile
ls 명령에서 --digests 옵션을 지정하면 다이제스틀 확인할 수 있다.
$ docker image ls --digests nginx
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
nginx latest sha256:b95a99feebf7797479e0c5eb5ec0bdfa5d9f504bc94da550c2f58e839ea6914f 2b7d6430f78d 9 days ago 142MB
# 베이스 이미지 설정
#FROM [이미지명]@[다이제스트]
FROM nginx@sha256:b95a99feebf7797479e0c5eb5ec0bdfa5d9f504bc94da550c2f58e839ea6914f
Dockerfile 빌트 및 이미지 레이어
Dockerfile로부터 Docker 이미지 만들기
$ docker build -t [생성할 이미지명]:태그명 [Dockerfile의 위치]
도커파일 생성
% mkdir sample && cd $_
sample % touch Dockerfile
sample % ls
Dockerfile
centos 7버전 내용 작성
FROM centos:centos7
Dockerfile 실행
% docker build -t sample:1.0 .
[+] Building 26.3s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 62B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:centos7 6.4s
=> [auth] library/centos:pull token for registry-1.docker.io 0.0s
=> [1/1] FROM docker.io/library/centos:centos7@sha256:c73f515d06b0fa07bb18d8202035e739a49 19.8s
=> => resolve docker.io/library/centos:centos7@sha256:c73f515d06b0fa07bb18d8202035e739a494 0.0s
=> => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b5 76.10MB / 76.10MB 16.1s
=> => sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b 1.20kB / 1.20kB 0.0s
=> => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B 0.0s
=> => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c51 2.75kB / 2.75kB 0.0s
=> => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 3.3s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:72b64f44af7b171e762593a7834a88ba13c30b6f349c75532807fd903c5ee79 0.0s
=> => naming to docker.io/library/sample:1.0
명령을 실행하면 해당 ./sample 에 저장된 Dockerfile로 부터 sample이라는 이름의 도커 이미지가 생성된다.
베이스 이미지인 centos:centos7이 로컬 환경에 없을경우 Docker Repository에서 다운받은 후 sample이라는 이름에 1.0 태그를 설정하면 sample:1.0이라는 이미지가 생성된다.
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sample 1.0 72b64f44af7b 11 months ago 204MB
centos latest 5d0da3dc9764 11 months ago 231MB
Dockerfile에 임의이 파일명 작성
docker build 명령에서 -f 옵션을 사용하여 임의의 파일명을 사용할 수 있다.
디렉토리에서 Dockerfile.[이름]
라는 이름을 파일을 지정하면된다.
$ docker build -t sample -f Dockerfile.base .
단 파일명이 Dockerfile 이외의 이름을 지닌 경우 Docker Hub에서 이미지 자동 생성 기능을 사용할 수 없다.
Docker 이미지 레이어 구조
Dockerfile을 빌드하여 Docker이미지를 작성하면 Dockerfile 이미지를 작성할 수 있다. 작성된 여러 개의 이미지는 레이어 구조로 되어있다.
# STEP1 : ubunutu(base image)
FROM ubuntu:latest
# STEP2 : nginx install
RUN apt-get update && apt-get install -y -q nginx
# STEP3 : copy file
#Dockerfile 디렉토리에 index.html 파일을 둬야함.
COPY index.html /usr/share/nginx/html/
# STEP4 : Start Nginx
CMD ["nginx" "-g", "daemon off;"]
컨테이너 Health Check 명령
컨테이너 안의 프로세스가 정상적으로 작동하고 있는지 체크하기 위해 사용.
HEALTHCHECK [옵션] CMD 실행할 명령
옵션 | 설명 | 기본값 |
---|---|---|
--interval=n | 헬스 체크 간격 | 30s |
--timeout=n | 헬스 체크 타임아웃 | 30s |
--retries=N | 타임아웃 횟수 | 3 |
ex)
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1
결과는 docker container inspect명령으로 확인 가능.
환경 및 네트워크 설정
환경변수 설정(ENV)
ENV [key] [value]
ENV [key]=[value]
# ex) key value type
ENV myName "devPaik"
ENV myNickName "DEV"
# ex) key=value type
ENV myName="devPaik" \
myNickName="DEV"
작업 디렉토리 지정(WORKDIR)
## 지정한 디렉토리가 없으면 새로 생성
WORKDIR [작업 디렉토리 경로]
ex)
## result : /first/second/third
WORKDIR /first
WORKDIR second
WORKDIR third
RUN ["pwd"]
## result : /first/second
ENV DIRPATH /first
ENV DIRNAME second
WORKDIR $DIRPATH/$DIRNAME
RUN ["pwd"]
사용자 지정 (USER)
이미지 실행 시 사용자를 지정할 때 사용
USER [사용자명/UID]
라벨 지정(LABEL)
이미지 버전정보 및 작성자 정보 코멘트 등을 제공할 때 사용.
LABEL <KEY>=<VALUE>
LABEL <KEY> <VALUE>
ex)
LABEL maintainer "DevPaik"
LABEL title="WebApp"
LABEL version="1.0"
LABEL description="This image is sample WebApp"
포트설정(EXPOSE)
컨테이너의 공개포트 번호를 지정할 때 사용
EXPOSE <포트번호>
EXPOSE 8080
Dockerfile 내 변수 설정(ARG)
변수 정의할 때 사용.
ARG <이름> [=기본값]
# 변수 정의
ARG NAME="PAIK"
RUN echo $NANE
기본 쉘 설정(SHELL 명령)
쉘 형식으로 명령을 실행할 때 사용.
SHELL ["쉘의 경로", "파라미터"]
SHELL ["/bin/bash", "-c"]
RUN echo hello
파일 설정
파일 및 디렉토리 추가(ADD)
이미지에 호스트 상의 파일이나 디렉토리를 추가
ADD <호스트의 파일 경로> <Docker 이미지의 파일 경로>
ADD ["<호스트의 파일 경로>" "<Docker 이미지의 파일 경로>"]
ex)
## host.html 추가
ADD host.html /docker_dir/
## [hos]로 시작하는 모든 파일 추가
ADD hos* /docker_dir/
## [hos]+ 임의 한 문자 롤에 해당하는 파일 추가
ADD hos?.txt /docker_dir/
Docker 이미지 안의 파일은 절대경로를 지정하거나 WORKDIR 명령에서 지정한 디렉토리를 기점으로 한 명령을 지정
ex) /docker_dir
을 지정하고 그 안에 web
이라는 디렉토리에 host.html
를 복사
WORKDIR /docker_dir
ADD host.html web/
파일복사(COPY)
이미지에 호스트상의 파일이나 디렉토리를 복사할 때
COPY <호스트 파일 경로> <Docker 이미지의 경로>
COPY ["<호스트 파일 경로>" "<Docker 이미지의 경로>"]
ADD명령은 원격 파일의 다운로드나 아카이브 압축 해제 등과 같은 기능을 갖고있고, COPY 명령은 호스트상의 파일을 이미지 안으로 복사하는 처리만 한다.
볼륨 마운트(VOLUME)
이미지에 볼륨을 할당할 때 사용
# 지정한 이름의 마운트 포인트를 작성하고 호스트나 그 외 다른 컨테이너로부터 볼륨의 외부 마운트를 수행.
VOLUME ["/마운트 포인트"]
'CI-CD > Docker' 카테고리의 다른 글
11. Docker Application 배포 (0) | 2023.04.19 |
---|---|
10. Docker Compose (0) | 2023.04.19 |
8. Docker compose를 이용하여 Kafka Confluent 설치 (0) | 2023.04.19 |
7. Docker Network (0) | 2023.04.19 |
6. Docker container (0) | 2023.04.19 |