Skip to main content

6. Docker Image Build

이 문서는 도커 이미지 빌드와 볼륨의 개념을 다룹니다.

Build Docker Image

도커 이미지 기본 개념은 이 문서를 참조하시면 됩니다.

빌드 필요성

  • 도커 이미지: 소스 코드, 환경 설정 등 컨테이너 실행을 위해 필요한 모든 패키지.
  • 이미지 빌드 방법을 컨테이너 기술을 제대로 활용하기 위한 필수 조건
  • CICD에서 일관성, 자동화, 효율, 보안, 협업 등 컨테이너 기술의 모든 장점을 실현하는 출발점

이미지를 그저 Docker Hub에서 받아 쓰면 될 수도 있지만, 직접 빌드할 줄 아는 것과는 큰 차이가 있습니다. 예를 들어, 사내 레지스트리에 직접 개발한 소스 코드와 환경 설정을 이미지로 빌드하여 push해야 하는 상황을 충분히 떠올릴 수 있습니다. 의존성 패키지의 사용법만 아는 것과 직접 배포할 수 있는 것에는 큰 차이가 있으니, 익혀서 나쁠 게 전혀 없겠습니다.

Dockerfile

Dockerfile이미지 빌드 스크립트입니다. 일반적인 CI/CDyaml 설정과 약간의 문법적인 차이가 있지만, 역할과 기능은 유사한 것으로 파악됩니다. 이미지를 빌드하기 위해서 필요한 스크립트이니, 조작법을 익힐 필요가 있습니다.

docker-file

app.docker.com에서 제 개인 레지스트리에 배포된 이미지의 Dockerfile 내부를 확인할 수 있습니다.

Instructions

Dockerfile의 문법과 형식이 낯설어서 간략하게 표로 정리합니다:

cmdusagedescription
FROMFROM ubuntu:14.04OS나 필요한 애플리케이션 이름을 지정
RUNRUN ["mv", "1234", "5678"]컨테이너가 빌드될 때 실행할 명령어
쉘 스크립트를 배열로 전달
EXPOSEEXPOSE 80컨테이너 외부에 노출할 포트 지정
ENVENV dev_env /tmp
echo ${dev_env}
환경변수 이름 지정
CMDCMD ["echo", "${dev_env}"]컨테이너가 시작될 때 실행할 명령어
ENTRYPOINTENTRYPOINT ["python"]
sudo docker run -t custom-img -c "print('1234')"
컨테이너가 실행될 때 기본 명령어
CMD와 달리 옵션 파람을 넘길 수 있음
WORKDIRWORKDIR /project작업이 실행될 디렉터리 설정
USERUSER user
USER user:group
도커 실행 시 사용할 유저 이름 또는 uid를 지정
VOLUMEVOLUME["/tmp"]호스트 디렉터리와 도커를 연결
커밋 없이 사용 가능하여 주로 로그 수집 + 데이터 저장 용도
COPY, ADDCOPY file /copy/to/path
ADD https://example.com/big.tar.xz /usr/src/custom-img
ADD rootfs.tar.xz/
파일, 경로를 복사할 때 사용. 명령어 대신 URL도 가능. 압축된 파일은 해제하면서 옮김
SHELLSHELL ["/bin/sh", "-c"]
SHELL ["cmd", "/S", "/C"]
쉘 타입 설정

Practice

COPY <src> <dest>
ADD <src> <dest>
  • src: 빌드 컨텍스트에 있는 파일 또는 디렉토리 = docker build 명령을 실행한 호스트의 디렉토리
  • dest: 이미지 내부 파일시스템의 경로. 컨테이너가 실행될 때 / 기준의 내부 경로

실제로 작성하니 생각보다 헷갈립니다. 특히 COPY | ADD 부분이 혼동이 쉬워 정리해봅니다.

# 프로젝트 경로
project/
├── Dockerfile
├── server.js
└── packages.txt

# packages.txt
express
cors
dotenv

#./Dockerfile
FROM node:18-slim

WORKDIR /app

COPY packages.txt .
COPY server.js .
#
RUN xargs -a packages.txt npm install

CMD ["node", "server.js"]

Build CLI

docker build -t {이미지 태그 네임} {빌드 컨텍스트 경로}

빌드 컨텍스트는 docker build 명령을 실행할 때 마지막 인자로 주는 디렉토리를 뜻합니다. 이를 일반적인 "배포 환경"으로 이해했습니다.

  • ex: CI/CD 빌드-배포 스크립트가 실행되는 배포 환경 (EC2, Github Actions, Cloudflare, CircleCI, Vercel 등)
pwd
/my-node-app
docker build -t my-node-app:latest .

.이 여기선 빌드 컨텍스트입니다. 이 커맨드가 실행된 경로 "."를 dest로 삼습니다. 빌드가 실행되면 Docker는 이 디렉토리를 압축해서 Docker Daemon으로 전송합니다. DockerfileCOPY. ADD는 이 컨택스트 안의 파일에만 접근 가능합니다.

순서를 정리하자면 다음과 같습니다:

  1. Dockerfile 읽음
  2. 각 명령(FROM, COPY, RUN, …)을 순차 실행
  3. 결과를 새 이미지 레이어로 저장
  4. 최종적으로 my-node-app:latest 이미지 생성