Search
Duplicate
🗒️

Dockerfile

Tags
Study
Dokerfile은 이미지를 빌드하는데 필요한 모든 명령이 순서대로 포함된 텍스트 파일입니다.

Dockerfile 작성 모범 사례 개요

Dockerfile 참조

키워드
설명
예시
기본 이미지 설정
FROM alpine:latest
기본 쉘 지정
SHELL ["/bin/sh", "-c"]
작업 디렉토리 변경 (default: /)
WORKDIR /app
실행 사용자 또는 그룹 설정 (default: root)
USER minjungk:42seoul
이미지 빌드 시 실행할 명령어 (이미지 레이어 생성)
RUN echo -n hello RUN ["echo", "-n", "hello"]
로컬 파일 또는 URL을 컨테이너 내로 압축을 풀어서 복사
ADD https://example.com/file.tar.gz /tmp/
로컬 파일을 컨테이너 내로 복사
COPY app.jar /app/
Runtime 환경 변수 설정
ENV DB_HOST=localhost
Build-time 환경 변수 설정
ARG APP_VERSION=1.0
컨테이너 시작 시 실행할 명령어 설정
CMD ["java", "-jar", "app.jar"]
컨테이너 시작 시 실행할 주요 명령어 설정
ENTRYPOINT ["nginx", "-g", "daemon off;"]
상속 이미지에서 실행할 기본 명령어 지정
ONBUILD <INSTRUCTION> ONBUILD ADD web.tar /var/www/html
컨테이너가 사용하는 포트 노출 예정 - docker run -P 호출 시에만 외부 랜덤 포트와 매핑됨
EXPOSE 80
이미지에 메타 데이터 레이블 추가
LABEL version="1.0" description="My App"
볼륨을 마운트하거나 컨테이너에 연결
VOLUME ["/data"]
컨테이너 종료 신호 (default: SIGTERM)
STOPSIGNAL SIGTERM
컨테이너 상태 확인 - 0(정상) 1(비정상) 2(예약된 코드) --interval: 헬스체크 간격 (default: 30s) --timeout: 타임아웃 시간 (default: 30s) --retries: 타임아웃 횟수 (default: 3)
HEALTHCHECK NONE HEALTHCHECK --timeout=10s CMD curl -f http://localhost || exit 1
1.
다단계 빌드
2.
.dockerignore
3.
임시 컨테이너 생성
4.
불필요한 패키지 제거
5.
애플리케이션 분리
6.
여러 줄 인수 정렬
7.
빌드 캐시 활용
1.
신뢰할 수 있는 소스에서 올바른 기본 이미지 선택하고 작게 유지
2.
다단계 빌드
3.
이미지 재구성
4.
이미지 취약점 확

Docker build 가이드

빌드 개념 소개
이미지 크기 최적화
빌드 속도 성능 개선
바이너리 빌드 및 내보내기
캐시 마운트 및 바인드 마운트
소프트웨어 테스팅
다중 플랫폼 빌드

Docker build 명령어

docker build 태그 지정이 안되는 버그가 간혹 있어서 <none>으로 뜰 수도 있습니다.
# PATH 기반 이미지 빌드 srcs/requirements/mariadb$ docker build --tag=mariadb:42 . # 파일을 명시하여 이미지 빌드 srcs/requirements/mariadb$ docker build --tag=mariadb:42 < Dockerfile # 이미지 목록 및 상세 정보 확인 srcs/requirements/mariadb$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mariadb 42 8b963556f4b6 4 seconds ago 315MB srcs/requirements/mariadb$ docker image inspect mariadb:42 srcs/requirements/mariadb$ docker image inspect 8b963556f4b6 ...
Shell
복사
다단계 빌드, 이미지 크기 최적화, 빌드 속도 개선 등 다양한 빌드에 대한 가이드는 아래 참고
# 일회용 컨테이너 생성 srcs/requirements/mariadb$ docker run -it --rm mariadb:42 /bin/sh $> mariadb -uroot $> exit
Shell
복사

번외)?

명령어어

Search
Name
키워드
명령어 예시
기본
$ apt install docker.io
이미지
info
$ dockert info Storage Driver : overlay2 Docker Root Dir : /var/lib/docker $ ls /var/lib/docker/overlay2 0cc29ea5605872d9c8291673064e85b071960 # 레이어 변경 사항 저장 615767e7221dbc99b8e441e35a88df5d74be2 # 레이어 변경 사항 저장 9f3bb671f38d7f61f661af369d420cdedb169 # 레이어 변경 사항 저장 l # 원본 레이어 저장
이미지
search
$ docker search tomcat
이미지
images
$ docker images
이미지
inspect
$ docker inspect consol/tomcat-7.0
이미지
history
$ docker history consol/tomcat-7.0
이미지
push
$ docker push ...
이미지
tag
$ docker tag old_tag new_tag
이미지
pull
$ docker pull consol/tomcat-7.0
이미지
rmi
$ docker rmi consol/tomcat-7.0
컨테이너
ps
$ docker ps $ docker ps -a
컨테이너
run
$ docker run -d -p 외부포트:내부포트 --name tc consol/tomcat-7.0 -t : 터미널 역할을 해주는 tty를 사용한다. -i : 컨테이너와의 입출력을 interactive하게 설정한다. -d : 컨테이너를 detach 모드로 실행한다. (백그라운드) -p : 컨테이너와 호스트의 포트를 연결한다. (포트포워딩) --name : 컨테이너의 이름을 설정한다. --cpushare : cpu 스케쥴링 시 컨테이너의 비중을 늘린다. --volume : 호스트 OS와 컨테이너의 디렉터리를 공유한다. --rm : 임시 컨테이너로 생성한다.
컨테이너
run -v
$ docker run -v 호스트경로:컨테이너 내 경로:권한 컨테이너 $ docker run -d -p 80:80 --rm -v /var/www:/usr/shared/nginx/html:ro nginx $ echo 1234 > /var/www/index.html
컨테이너
create
$ docker create -p 80:8080 --name tc consol/tomcat-7.0 컨테이너 접속 시 127.0.01:8080 으로 접속하면 됨
컨테이너
start
$ docker start -d f6e513b399a6 컨테이너ID 대신 지정한 이름 tc을 사용해도 된다.
컨테이너
stop
$ docker stop f6e513b399a6
컨테이너
$ docker stop `sudo docker ps -a -q` $ docker rm `sudo docker ps -a -q`
컨테이너
rm
$ docker rm f6e513b399a6
컨테이너
exec
$ docker exec -it f6e513b399a6 /bin/bash
컨테이너
logs
$ docker logs f6e513b399a6 # stdout, stderr
컨테이너
cp
$ docker cp <path> <to container>:<path> $ docker cp <from container>:<path> <path> $ docker cp <from container>:<path> <to container>:<path>