본문 바로가기

DevOps/Docker

Docker file 구성요소와 멀티스테이징

FROM 베이스 이미지 지정

  • FROM [이미지명] | [이미지명]:[태그명] | [이미지명][다이제스트]
  • docker image ls --digests

RUN 명령 실행

CMD 컨테이너 실행 명령

LABEL 라벨 설정

EXPOSE 포트 익스포트

ENV 환경변수

ADD 파일/디렉토리 추가

COPY 파일 복사

ENTRYPOINT 컨테이너 실행 명령

VOLUME 볼륨 마운트

USER 사용자 지정

WORKDIR 작업 디렉토리

ARG Dockerfile 안의 변수

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

STOPSIGNAL 시스템 콜 시그널 설정

HEALTHCHECK 컨테이너의 헬스 체크

SHELL 기본 쉘 설정

 

 

RUN

FROM에서 베이스 이미지에 환경 구축을 위한 명령을 실행하는 명령어, 이미지가 만들어질 때(빌드) 실행 된다. 주로 라이브러리 설치 등에 사용(RUN pip install -r requirements.txt)

  • shell형식추가적으로 exec형식이 있다.
  • 기본적으로 shell에서 입력하는거랑 똑같다, 기본쉘은 shell명령어로 변경 가능
  • 같은 문법으로 하나의 레이어만 사용한다.
  • RUN 명령어 한 줄 마다 이미지 레이어가 앃인다. 그러므로RUN yum install httpd\\ php\\..

CMD & ENTRYPOINT

두 명령어 모두 컨테어너가 최초로 실행될 때 트리거된다.

차이점이라면 CMD 명령어의 경우, 빌드됬더라도 컨테이너 실행 시에 명령어를 바꿔줄 수 있다.

    • 실제로 적용 시 entry point 명령어가 더 먼저 시작된다.
  • run명령어와 같이 shell, exec 포맷 둘 다 가능하지만 shell 포맷의 경우 쉘 창을 올리고 명령어가 실행되므로 exec포맷이 더 안정적일 수 있고, 도커 독에서도 이 방법을 추천한다.

 

ONBUILD란?

자신의 도커파일로 이미지를 생성할 때 설정할 수 있는 옵션으로, 해당 이미지를 베이스로 가져가면 ONBUILD 옵션에 설정해둔 명령이 실행된다.

 

HEALTHCHECK

--interval --timeout --retries 을 통해 원하는 간격과 대기시간 체크 횟수 등을 정할수 있다.

 

ENV

환경 변수를 설정한다.

ENV name = das\\
		id = das\\
		...
으로 선언하여 레이어를 최적화한다.				

WORKDIR

컨테이너에서 작업할 경로를 정해주고 없다면 만든다.

영향을 받는 명령들은 RUN CMD ENTRY POINT COPY ADD

이며, WORKDIR로 지정한 경로에서 실행된다.

 

USER

USER [사용자명/UID] 로 선언한다.

디폴트 사용자를 사용하지않으면 RUN명령어로 사용자를 먼저 만들어야한다.

 

LABEL

이미지에 정보를 설정한다.

LABEL version = "1.0"
LABEL builder = "jk"

EXPOSE

컨테이너가 listen한 네트워크를 알려준다.

 

ARG

ENV와 다르게 Dockerfile 내부 변수를 설정할 수 있다.

 

ADD & COPY

ADD <host_path> <docker_path>

  • add와 copy의 차이점은 copy는 단순한 로컬 영역의 파일만을 옮기수 있다.
  • add는 링크를 통한 다운로드까지 가능하다.

VOLUME

VOLUME [”/mount_path”]

 

 

 

멀티스테이징

# 생성할 이미지명으로 이미지 생성
docker build -t [생성할 이미지명]:[태그명] [Dockerfile 위치]

# from으로 부터 베이스이미지가 같으면 전부 같은 imageID를 가진다.
# 중간이미지를 가짐으로서 캐싱이미지를 가진다.
---dockerfile---

# 1. Build Image
FROM golang:1.8.4-jessie AS builder

# Install dependencies
WORKDIR /go/src/github.com/asashiho/greet
RUN go get -d -v github.com/urfave/cli

# build modules
COPY main.go .
RUN GOOS=linux go build -a -o greet .

# ------------------------------------------
# 2. Production Image
FROM busybox
WORKDIR /opt/greet/bin

# Deploy modules
COPY --from=builder /go/src/github.com/asashiho/greet/ .
ENTRYPOINT ["./greet"]

--------------------------------
# 결과
docker build -t greet .
1번 이미지에서 만든 파일을 2번 이미지가 가져와서 실행만 하므로 경량화해서 운영 가능하다.
2번 이미지에서 추가모듈만 생성된 greet 라는 새로운 이미지 생성