Dockerfile 이란
docker 이미지를 빌드하는 데 쓰이는 지시사항들의 모음
8.1 Dockerfile을 이용하여 ubuntu-git 빌드하기
Dockerfile이라는 이름으로 파일을 만들고 다음 내용을 작성한다.
FROM ubuntu:latest
LABEL maintainer="dia@allingeek.com"
RUN apt-get update && apt-get install -y git
ENTRYPOINT ["git"]
이미지 빌드하기
docker buildx build --tag ubuntu-git:auto .
auto 태그로 된 이미지가 존재하는 것을 볼 수 있다.
설명
- FROM : 기본이 되는 이미지
- LABEL : key=value 형태로 label을 부여한다.
- RUN : 컨테이너를 실행한 후 프로그램 실행 명령어를 나열한다.
- ENTRYPOINT : 프로그램 진입점을 나타낸다.
Dockerfile에 새로운 내용을 추가한다면, 새로운 레이어가 추가된 이미지가 빌드된다.
Docker 이미지 빌드 시스템은 캐싱을 이용하여 단계별 레이어가 이미 빌드된 캐시를 사용할 수 있다면, 빠르게 빌드할 수 있다.
FROM ubuntu:latest
LABEL maintainer="dia@allingeek.com"
RUN apt-get update && apt-get install -y git
ENTRYPOINT ["git"]
RUN this will not work
- Run this will not work를 추가해본다.
- 그 전 레이어에 대한 캐싱을 사용하기 때문에 이전 빌드보다 빠르다.
- --no-cache 옵션을 사용하면 캐시 사용 없이 빌드 한다.
8.2 도커 파일 핵심
메타 데이터 지시사항
.dockerignore 파일을 작성하면 해당 리스트에 있는 파일들은 이미지 빌드 시 컨테이너 내부로 복사를 방지한다.
.dockerignore
mailer-base.df
mailer-logging.df
mailer-live.df
mailer-base.df 예시
FROM debian:buster-20190910
LABEL maintainer="dia@allingeek.com"
RUN groupadd -r -g 2200 example && \
useradd -rM -g example -u 2200 example
ENV APPROOT="/app"\
APP="mailer.sh" \
VERSION="0.6"
LABEL base.name="Mailer Archetype" \
base.version="${VERSION}"
WORKDIR $APPROOT
ADD . $APPROOT
ENTRYPOINT ["/app/mailer.sh"]
EXPOSE 33333
- LABEL은 이미지나 컨테이너에 메타 데이터를 제공한다.
- WORKDIR : 기본 작업 디렉토리
- EXPOSE : 도커 컨테이너 외부로 공개할 포트 번호를 지정한다.
- ENTRYPOINT : 프로그램 진입점을 의미하며 컨테이너 내부에서는 /bin/sh -c 'exec ./mailer.sh' 를 실행한다.
ENTRPOINT를 명시할 경우 CMD나 docker container run을 통해 명령어를 주입할 경우 무시되므로 주의.
mailer-base:0.6으로 이미지를 빌드해두자.
docker buildx build -t dockerinaction/mailer-base:0.6 -f mailer-base.df .
Filesystem 관련 사항
로깅 프로그램을 위한 mailer-logging.df 도커 파일 예시
FROM dockerinaction/mailer-base:0.6
RUN apt-get update && \
apt-get install -y netcat
COPY ["./log-impl", "${APPROOT}"]
RUN chmod a+x ${APPROOT}/${APP} && \
chown example:example /var/log
USER example:example
VOLUME ["/var/log"]
CMD ["/var/log/mailer.log"]
COPY : 이미지 빌드 파일 시스템으로 부터 컨테이너 내부로 복사
VOLUME : 이미지 파일 시스템에 볼륨을 생성 및 할당
CMD : ENTRYPOINT와 유사하나 커스텀한 명령어를 실행할 경우 지정
log-impl 폴더를 만들고 하위에 mailer.sh 쉘 스크립트를 작성한다.
mailer-base 이미지에 지정한 mailer.sh 스크립트 실행을 할 수 있다.
docker image build -t dockerinaction/mailer-logging -f mailer-logging.df .
컨테이너를 빌드한 이미지 mailer-logging로부터 실행한다.
mailer-live.df 작성하기
Amazon Web Servcice의 Simple Email Service를 이용하는 mailer-live.df를 작성해본다.
FROM dockerinaction/mailer-base:0.6
ADD ["./live-impl", "${APPROOT}"]
RUN apt-get update && \
apt-get install -y curl netcat python && \
curl "https://bootstrap.pypa.io/get-pip.py" -i "get-pip.py" && \
python get-pip.py && \
pip install awscli && \
rm get-pip.py && \
chmod a+x "${APPROOT}/${APP}"
USER example:example
CMD ["mailer@dockerianction.com", "pager@dockerinaction.com"]
- ADD : COPY와 유사하지만 URL을 지정할 경우 원격지 소스로 부터 파일을 받아 복사한다.
마찬가지로 live-impl 폴더를 생성하고 적절한 SES API를 호출하는 mailer.sh를 작성한다.
8.3 다운 스트림 빌드 타임 동작 주입하기
ONBUILD COPY [".", "/var/myapp"]
ONBUILD RUN go build /var/myapp
ONBUILD 동작은 해당 이미지를 기본으로 하는 다운 스트림 이미지가 실제로 빌드될 때, 동작하는 방식이다.
upstream.df
FROM busybox:latest
WORKDIR /app
RUN touch /app/base-evidence
ONBUILD RUN ls -al /app
docker buildx build -t dockerinaction/ch8_onbuild -f upstream.df .
RUN ls -al /app 을 실행하지 않는다.
downstream.df
FROM dockerinaction/ch8_onbuild
RUN touch downstream-evidence
RUN ls -al
docker image build -t dockerinaction/ch8_onbuild_down -f downstream.df .
ch8_onbuild_down 이미지를 빌드할 때 기본이 되는 이미지를 가져온 직후 ONBUILD로 지정한 지시사항들이 적용된다.
8.4 관리 가능한 도커 파일 만들기
FROM debian:buster-20190910
ARG VERSION=unknown
LABEL maintainer="dia@allingeek.com"
RUN groupadd -r -g 2200 example && \
useradd -rM -g example -u 2200 example
ENV APPROOT="/app"\
APP="mailer.sh" \
VERSION="0.6"
LABEL base.name="Mailer Archetype" \
base.version="${VERSION}"
WORKDIR $APPROOT
ADD . $APPROOT
ENTRYPOINT ["/app/mailer.sh"]
EXPOSE 33333
ARG로 지정한 변수는 이미지를 빌드할 때 결정되는 값이다. 실제 빌드 시점에 결정되는 값에 쓰인다.
version=0.6;
docker buildx build -t dockerinaction/mailer-base:${version} \
-f mailer-base.df \
--build-arg VERSION=${version} \
.
멀티 스테이지 빌드 옵션
한 도커 파일안에 빌드 stage를 둘 이상 지정하는 방식이다.
build와 runtime 빌드 stage가 있다면, runtime 빌드는 build stage에서 정의된 값을 가져올 수 있다.
# Builder stage
FROM go-lang:1-alpine as builder
# Install CA
RUN apk update && apk add ca-certificates
# Copy source into Builder
ENV HTTP_CLIENT_SRC=$GOPATH/src/dia/http-client/
COPY . $HTTP_CLIENT_SRC
WORKDIR $HTTP_CLIENT_SRC
# Build HTTP client
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -v -o /go/bin/http-client
# Runtime stage
FROM scratch as runtime
ENV PATH ="/bin"
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certicifates.crt
COPY --from=builder /go/bin/http-client /http-client
ENTRYPOINT ["/http-client"]
builder 스테이지에서는 HTTPS 서비스를 위한 CA 인증서를 설치하고 http-client 실행 파일을 빌드한다.
runtime stage는 아무런 파일 시스템이 존재하지 않는 "scratch" 레이어에서 CA 인증서와 실행 파일만 복사하여 HTTPS 서비스를 실행하기 위한 이밎 빌드 단계 이다.
8.5 시작 스크립트 및 멀티 프로세스 컨테이너
이른 환경 검증하기
프로세스를 실행하기 전에 유효하지 않은 환경 설정이 발견되면, 더 진행하지 않고 빠른 종료를 권장한다.
그러한 시작 프로세스는 다음과 같은 값을 검증한 뒤, 원래 실행 파일을 실행하는 단계로 구성되어 있다.
- 별칭
- 환경 변수
- 시크릿
- 네트워크 접근 권한
- 네트워크 포트 사용 가능
- 볼륨
- 현재 유저
#!/bin/bash
set -e
if [ -n "$WEB_PORT80_TCP"]; then
if [ -z $"WEB_HOST" ]; then
WEB_HOST='web'
else
echo >$2 '[WARN]: Linked container, "web" overriden by $WEB_HOST.'
echo >$2 "===> Connecting to WEB_HOST ($WEB_HOST)"
fi
fi
if [ -z "$WEB_HOST" ]; then
echo >$2 '[ERROR] : specify container to link;'
exit 1
fi
# time to run original process
exec "$@"
초기화 프로세스
init process는 다중 프로그램을 관리하고, 댕글링된 프로세스를 정리하며 프로세스를 모니터링하고 실패 감지 시 자동 재시작 옵션을 제공하는 데 있다.
docker container run -it --init alpine:3.6 nc -l -p 3000
--init 옵션은 init 프로세스를 컨테이너 내부에서 실행할 수 있게 한다.
'Cloud > Docker' 카테고리의 다른 글
Docker In Action 11. Services with Docker and Compose (0) | 2024.12.14 |
---|---|
Docker In Action 9. Public and private software distribution (1) | 2024.12.09 |
Docker In Action 7. Packaging software in images (1) | 2024.12.06 |
Docker In Action 6. Limiting risk with resource controls (1) | 2024.12.04 |
Docker In Action 5. Single-host networking (0) | 2023.10.22 |