거꾸로 바라본 세상
Published 2023. 4. 19. 09:35
9. Dockerfile CI-CD/Docker
반응형

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
profile

거꾸로 바라본 세상

@란지에。

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!