1. Dockerfile
1-1) Dockerfile이란?
애플리케이션을 패키징하여 Docker 이미지로 만들기 위한 스크립트다.
패키징이란, 실행되기 위해 필요한 모든 파일, 라이브러리, 의존성 등을 하나의 배포 가능한 단위로 묶는 것을 의미한다.
Dockerfile을 통해 애플리케이션을 다른 환경에서 손쉽게 배포하고 실행할 수 있게 된다.
패키징된 애플리케이션은 해당 환경에서 설치나 설정 없이도 바로 동작한다.
1-2) Dockerfile 경로
애플리케이션의 루트 디렉토리에 위치해야 한다.
왜냐하면 Docker 이미지 빌드 시 Docker 컨텍스트가 설정되는데, 컨텍스트는 Dockerfile이 있는 디렉토리 기준으로 로컬 파일을 컨테이너로 복사하거나 참조할 수 있기 때문이다.
(*컨텍스트란 Docker 이미지를 빌드 할 때, Dockerfile이 참조할 수 있는 파일과 디렉토리 범위를 의미)
2. Dockerfile 문법
2-1) 기본 문법
✔️FROM
: Docker 이미지의 기본 시작점을 설정한다. 모든 이미지는 다른 이미지로부터 출발한다.
✔️RUN
: 명령어를 실행하여 이미지를 빌드한다.
이미지를 빌드한다는 것은 애플리케이션의 실행 환경을 정의하고, 이를 하나의 패키지로 만드는 과정이다.
이미지를 빌드하면 애플리케이션이 실행될 준비가 된 독립적인 환경이 만들어진다.
✔️COPY
: 로컬 파일 시스템의 파일 혹은 디렉터리를 컨테이너 이미지로 복사한다.
[원본경로][복사경로]형식으로 지정하면 된다.
✔️ADD
: 파일을 복사하거나 URL의 파일을 추가한다. (* COPY와 비슷하지만 ADD는 URL에서 파일을 다운로드하고 압축을 해제하는 추가기능이 있다.)
✔️WORKDIR
: 컨테이너 이미지 파일 시스템에 디렉터리를 만들고, 해당 디렉터리를 작업 디렉토리로 설정한다.
리눅스와 윈도 컨테이너 모두 구분자로 슬래시를 사용한다.
RUN, CMD, ENTRYPOINT 등의 명령이 여기서 실행된다.
✔️CMD
: 컨테이너가 시작될 때 실행할 기본 명령을 지정한다.
✔️ENTRYPOINT
: 컨테이너가 시작될 때 실행할 프로그램을 지정한다.
✔️EXPOSE
: 컨테이너가 사용하는 네트워크 포트를 정의한다.
✔️ENV
: 환경 변수를 설정한다. 값을 지정하기 위해 [key] = "[value]" 형식을 따른다.
2-2) Dockerfile 예시
Python Flask 애플리케이션을 위한 Dockerfile
# 1. 베이스 이미지 설정
FROM python:3.9-slim
# 2. 환경 변수 설정
ENV APP_HOME=/app
ENV FLASK_ENV=development
# 3. 작업 디렉토리 설정
WORKDIR $APP_HOME
# 4. 의존성 파일 복사
COPY requirements.txt .
# 5. 의존성 설치
RUN pip install --no-cache-dir -r requirements.txt
# 6. 소스 코드 복사
COPY . .
# 7. 추가 파일 다운로드 및 압축 해제
ADD http://example.com/additional-config.tar.gz /app
# 8. 컨테이너 시작 시 실행할 명령어 설정
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
# 9. 컨테이너가 외부와 통신할 포트 지정
EXPOSE 5000
# 10. 엔트리포인트 설정
ENTRYPOINT ["python", "-m"]
#1. FROM
python:3.9-slim 이미지를 베이스로 사용하여 Python3.9 환경을 준비한다.
#2. ENV
애플리케이션 디렉토리와 Flask 환경을 지정한다.
#3. WORKDIR
작업 디렉토리를 $APP_HOME("/app")으로 설정하여 이후 명령어들이 실행될 디렉토리를 지정한다.
$는 환경 변수를 참조하기 위함이다.
#4. COPY
txt파일을 현재 작업 디렉토리에 복사하여 Python 패키지 설치에 사용할 수 있도록 한다.
#5. RUN
pip install 명령어를 사용하여 의존성을 설치한다. 이 명령어는 빌드 과정에서 한 번 실행된다.
--no-cache-dir 옵션으로 캐시된 파일을 사용하지 않고 새로 다운로드 하도록 한다.
-r 옵션은 requirements 파일을 지정해 pip가 여러 패키지를 한 번에 설치할 수 있도록 한다.
#6. COPY
COPY . . 명령은 로컬 파일들을 컨테이너 내에 복사하는 명령으로, Dockerfile에서 가장 자주 사용된다.
첫번째 . 은 현재 Dockerfile이 위치한 호스트의 현재 디렉토리를 의미한다.
두번째 . 은 컨테이너 내에서 작업 디렉토리로 설정된 위치를 의미한다.
#7. ADD
URL에서 파일을 다운로드하고 /app 디렉토리에 압축 해제하여 저장한다.
#8. CMD
CMD명령어를 리스트 형식으로 작성할 때, ["실행 파일", "인수1", "인수2"]와 같은 구조를 사용한다.
리스트 형식으로 작성하면, 쉘(/bin/sh -c)을 거치지 않고 실행 파일 그대로 실행한다.
문자열 형식(쉘 형식)으로 작성하면 쉘 명령을 사용할 수 있으나 쉘을 거치므로 환경에 따라 동작이 달라질 수 있다.
ENTRYPOINT와 함께 사용하면 ENTRYPOINT를 통해 기본 실행 파일을 설정하고, CMD를 통해 인수를 설정할 수 있다.
이 예제에서는 flask run 명령어를 통해 Flask 개발 서버를 실행한다.
--host=0.0.0.0 으로 웹 서버가 외부에서 접근 가능하도록 설정한다.
--port=5000으로 컨테이너 내부에서 애플리케이션이 실행될 포트 번호를 지정한다.
#9. EXPOSE
Flask 애플리케이션(컨테이너)이 사용할 포트를 외부에 노출한다.
CMD에서 포트를 지정하는 것과 EXPOSE에서 포트를 지정하는 것은 서로 다른 목적을 가진다.
CMD는 컨테이너 내부에서 애플리케이션이 실행되는 포트를 지정하는 것이고, EXPOSE는 Docker가 이 포트를 외부와 연결할 수 있는 통신 포트로 사용하도록 표시하는 역할을 한다.
#10. ENTRYPOINT
컨테이너가 실행될 때 실행할 프로그램을 지정한다.
Python 모듈 실행을 위해 python -m을 기본 설정으로 지정하였고, CMD로 넘어온 인수를 실행한다.
'Cloud' 카테고리의 다른 글
프리온보딩 백엔드 챌린지 1일차 복습 - Docker의 주요 구성 요소 (0) | 2024.05.16 |
---|---|
프리온보딩 백엔드 챌린지 - 1일차 기록 (0) | 2024.05.09 |
AWS EC2 우분투 서버 구축하기 | windows (0) | 2024.03.18 |
도커를 위한 리눅스 쉘 사용법 | 1편 (0) | 2024.03.12 |