일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- FastAPI
- Matplotlib
- leetcode
- GCP
- Kubernetes
- 백준
- github
- DeepLearning
- vscode
- 알고리즘
- NLP
- 네이버AItech
- autoencoder
- FDS
- python
- rnn
- torchserve
- 완전탐색
- 코딩테스트
- wandb
- GitHub Action
- 프로그래머스
- pytorch
- PytorchLightning
- NaverAItech
- GIT
- pep8
- Kaggle
- docker
- datascience
- Today
- Total
Sangmun
Docker Image를 만들기 위한 Dockerfile 작성 기본 본문
이번에는 docker image를 어떻게 생성을 하는지에 대해서 알아보려고 합니다.
간단한 fast api 애플리케이션을 실행하는 docker image 서버를 만들어 보려고 합니다.
먼저 폴더를 하나 생성하고 관련 패키지를 다운로드 그리고 간단한 fastapi 코드를 작성해 줍니다.
$mkdir fastapi_example
$cd fastapi_example
$pip install fastapi[all]
$pip list --not-required --format=freeze >> requirements.txt
Dockerfile을 이용하여 docker build할때 사용할 requirements.txt도 pip list 명령어를 사용해서 만들어 줍니다.
이때 pip freeze를 사용하지 않는 이유는 의존성에 따라 설치된 라이브러리를 포함하지 않기 위해서 입니다.
다음으로 Dockerfile이라는 파일을 만들어서 아래와 같이 작성해줍니다.
FROM python:3.8.7-slim-buster
COPY . /app
WORKDIR /app
ENV PYTHONPATH /app
ENV PYTHONBUFFERED=1
# layer를 하나로 묶음 layer가 늘어나면 보통 안좋음
RUN pip install pip==21.2.4 && \
pip install -r requirements.txt
CMD ["python", "main.py"]
* FROM python:3.8.7-slim-buster
FROM "이미지 이름:태그"
형태로 이루어져 있고 이미지 빌드에 사용할 베이스 이미지를 지정한다.
보통 처음부터 만들지는 않고 docker hub와 같은 저장소에 공개된 이미지를 기반으로 하여 이후에 레이어를 추가하여 이미지를 만들어 간다.
* COPY . /app
로컬호스트의 .(현재 디렉토리의 폴더 및 파일)을 컨테이너의 /app 경로에 복사한다는 의미이다.
위의 경우에는 main.py와 requirements.txt 가 복사되게 된다.
* WORKIDR /app
Dockerfile의 RUN, CMD, ENTRYPOINT등의 명령어를 실행할 컨테이너의 경로라는 의미이다.
* ENV PYTHONPATH /app, ENV PYTHONBUFFERED=1
컨테이너 내부에서의 환경변수를 지정을 한다.
* RUN pip install pip==21.2.4 && pip install -r requirements.txt
RUN 다음에 오는 명령어를 실행하라는 의미이다.
fast api를 실행해야 함으로 pip install과 requirements를 이용하여 패키지를 설치해준다.
이 경우에는 pip 명령어가 2개지만 한번에 이어서 작성을 해주었는데 이는 Docker image의 layer를 줄이기 위함이다.
COPY, ENV등등의 명령어가 Dockerfile에 추가될때마다 하나씩 layer가 늘어나는것인데 보통은 layer를 적게 하는것이 더 좋다.
* CMD ["python", "main.py"]
docker run으로 이 이미지를 기반으로 컨테이너를 만들 때 실행할 명령어이다.
이 이미지가 실행되는 즉시 python main.py를 실행한다.
* docker build
다음으로 "Dockerfile이 위치한 경로" docker build 명령어를 사용하면 알아서 Dockerfile을 찾아서 이미지를 빌드를 해준다.
docker build . -t my-fastapi-app 처럼 -t 옵션을 사용하여 이름과 태그를 설정할수 있고 tag는 미지정시 latest로 지정된다.
. 이라고 쓰면 무조건 Dockerfile을 찾아서 빌드를 하고 Dockerfile이 아닌 다른 파일 이름을 사용하고 싶으면 . 대신 다른 파일 이름을 지정해주면 된다.
* RUN vs CMD vs ENTRYPOINT
Dockerfile에서 실행될 수 있는 3가지 명령어는 비슷하면서도 차이가 있다.
일단 운영체제에서 명령어를 실행한다는 점에서는 차이가 없어보이기도 한다.
우선 RUN은 CMD와 ENTRYPOINT와 확실히 구분된다.
RUN은 이미지를 빌드할때 사용하는 명령어이고 CMD와 ENTRYPOINT는 이미지가 빌드되고 컨테이너가 실행될 때 수행되는 명령어다
그렇다면 CMD와 ENTRYPOINT의 차이는 무엇일까?
ENTRYPOINT는 실행이 무조건 되는 명령어이고 CMD는 실행 될 수도 아닐수도 있다.
EXPOSE : 컨테이너 외부에 노출할 포트 지정
ENTRYPOINT : CMD랑 유사, 이미지를 컨테이너로 띄울때 항상 실행하는 커맨드이다
docker run my-fastapi-app echo hello
위와 같이 my-fastapi-app 이미지를 실행하고 추가로 echo hello로 인자를 전달해주면 run main.py는 실행되지 않고 컨테이너 내부서 hello만 출력한다.
하지만 CMD가 아닌 ENTRYPOINT를 사용했으면 fastapi도 실행하고 echo hello도 실행하게 된다.
* docker run -p vs EXPOSE
Dockerfile의 EXPOSE 명령어는 해당 포트를 외부로 개방할 것이다.라고 명시하는 것이다.
EXPOSE를 사용하였다고 하더라고 해당 포트가 즉각 개방되어 외부에서 접속할 수 있는것이 아니다.
docker run -p 옵션으로 포트를 매핑을 해주어야 한다.
'개발 > docker' 카테고리의 다른 글
Google Cloud Registry에 Docker Image push (0) | 2023.02.05 |
---|