Search

Writing a Dockerfile

Explanation

Dockerfile은 컨테이너 이미지를 생성하기 위해 사용되는 텍스트 기반 문서. Dockerfile은 이미지 빌더(builder)에게 실행할 명령어들, 복사할 파일, 시작 명령 등에 대한 지침(instructions)을 제공
예를 들면, 다음 Dockerfile은 실행이 가능한 상태의 Python앱을 만듦 :
FROM python:3.12 WORKDIR /usr/local/app # Install the application dependencies COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # Copy in the source code COPY src ./src EXPOSE 5000 # Setup an app user so the container doesn't run as the root user RUN useradd app USER app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
Docker
복사

Common instructions

Dockfile에서 자주 사용하는 명령어들은 다음과 같음 :
FROM <image>
빌드가 확장할 기본 이미지(base image)를 지정
WORKDIR <path>
파일들이 복사되고 명령어들이 실행될 이미지 내 작업 디렉터리(working directory) 또는 path를 지정
COPY <host-path> <image-path>
빌더(builder)에게 host로부터 파일들을 복사하고, 복사한 파일들을 컨테이너 이미지에 넣으라고 알려주는 지침(instruction)
RUN <command>
빌더(builder)가 지정된 명령을 실행하도록 알려주는 지침(instruction)
ENV <name> <value>
실행중인 컨테이너가 사용할 환경 변수 설정
EXPOSE <port-number>
이미지가 노출(expose)시키고자 하는 포트를 나타내는 구성을 이미지에 설정
USER <user-or-uid>
이후 지침(instruction)들을 수행하기 위해 기본(default) 유저 설정
CMD ["<command>", "<arg1>"]
이미지를 사용하는 컨테이너가 실행할 기본(default) 명령어를 설정

Try it out

Dockerfile은 대부분 다음 과정들로 이뤄짐 :
1.
기본 이미지(base image) 결정
2.
앱 의존성(application dependencies) 설치
3.
관련된 소스코드(또는 바이너리) 복사
4.
최후 이미지(final image) 구성
여기서는 간단한 Node.js 앱을 빌드하는 Dockerfile을 작성해볼 예정

Set up

해당 ZIP 파일을 다운해서 압축을 풀고 로컬에 폴더 가져다두기

Creating the Dockerfile

1.
다운받은 폴더 내 package.json 파일이랑 동일한 위치에 Dockerfile 파일 생성
2025.01.10 날짜 기준, 다운 폴더 내 Dockerfile 문서가 작성되어있음 만약에 해당 내용이 없다면, 아래 순서를 따라할 것
Dockerfile 확장자
2.
다음 내용을 통해, base image를 정의:
FROM node:20-alpine
Docker
복사
3.
WORKDIR 지침(instruction)을 통해, 워킹디렉토리를 정의(이후 명령들을 어디서 실행할지와 컨테이너 이미지 안에서 파일들이 어디로 복사될 지를 명시하는 행위) :
WORKDIR /app
Docker
복사
4.
COPY 지침(instruction)을 통해, 로컬 머신에서 컨테이너 이미지로 모든 파일들을 복사 :
COPY . .
Docker
복사
5.
RUN 지침(instruction)을 통해, yarn CLI & package manager를 사용하여 앱의 의존성들을 설치 :
RUN yarn install --production
Docker
복사
6.
마지막으로 CMD 지침(instruction)을 통해, 기본(default) 명령어를 명시 :
CMD ["node", "./src/index.js"]
Docker
복사
그럼 이제 맨 윗 사진과 동일
주의) 아직은 도커파일이 프로덕션 준비 상태는 아님
docker init을 통해 새 프로젝트를 빠르게 컨테이너화 가능

Next steps

이제는 빌드, 태그, 이미지 push를 학습할 차례!