pip list --not-required --format=freeze # 의존성에 따라 설치된 라이브러리는 보이지 않음
Dockerfile 작성
Dockerfile에는 Docker 이미지를 빌드하기 위한 정보가 담긴다
FROM <baseImage:tag> : 이미지 빌드에 사용할 베이스 이미지를 지정 FROM python:3.8.7-slim-buster
COPY <로컬 디렉토리(파일)> <컨테이너 내 디렉토리(파일)> 컨테이너는 자체적인 파일 시스템과 디렉토리를 가짐 COPY 명령어는 Dockerfile이 존재하는 경로 기준 로컬 디렉토리를 컨테이너 내부의 디렉토리로 복사 COPY . /app → 로컬 프로젝트 폴더 최상위에 존재하는 모든 파일을 컨테이너 내부 /app 디렉토리로 복사
WORKDIR <컨테이너 내 디렉토리> Dockerfile의 RUN, CMD 등의 명령어를 실행할 컨테이너 경로 지정 WORKDIR /app → 이 라인 뒤의 등장하는 명령어는 컨테이너 내부의 /app 에서 실행
ENV <환경변수 이름=값> 컨테이너 내 환경변수를 지정 ENV PYTHONPATH=/app ENV PYTHONBUFFERED=1 → 파이썬 애플리케이션의 경우 통상 위 두 값을 지정함
RUN <실행할 리눅스 명령어> RUN pip install pip==22.3.1 && \ pip install -r requirements.txt 이전 라인에서 COPY와 WORKDIR이 실행되었기 때문에 container 내에 requirements.txt가 존재하고 이를 pip install -r로 실행시킬 수 있다. && \ → 한번에 실행할 명령어가 여러개인 경우 이어주는 역할 (docker 파일 한 줄을 layer라고 하는데 &&는 두 개의 layer을 하나로 묶어줌)
CMD [<"실행할 명령어">, <"인자">, ... ] CMD ["python", "main.py"] docker run으로 이 이미지 기반 컨테이너를 만들 때 실행할 명령어를 담는다. CMD는 띄어쓰기를 사용하지 않는다.
RUN과 CMD의 차이는?
RUN 명령어 : 도커파일로부터 도커 이미지를 빌드하는 순간에 실행이 되는 명령어
Docker는 Container를 실행할 때 도커 이미지가 필요하다. 이 이미지를 만들때는 보통 도커 허브의 이미 만들어진 이미지를 베이스 이미지로 놓고, 이 베이스 이미지에 Docker 명령어를 가지고 자신에게 맞는 환경을 하나하나 얹는다. (layer를 더한다고 표현함) RUN 명령어는 명령을 실행한 결과를 새로운 layer를 더하는 과정으로 볼 수 있다.
CMD 명령어 : RUN 명령어는 이미지를 작성하기 위해 실행하는 명령어라면, CMD는 이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하기 위한 명령어
ENTRYPOINT 명령어 : CMD와 마찬가지로 컨테이너 안에서 명령을 실행하기 위한 명령어 그러나 ENTRYPOINT로 정의하는 명령어는 컨테이너가 수행될 때 변경되지 않는다.
Example)
# Dockerfile
FROM ubuntu:latest
CMD ["echo", "hello"]
prac이라는 이름의 이미지를 빌드 빌드한 이미지 컨테이너로 실행하면서 echo world 명령까지 실행해보면 기존 도커 파일은 "hello"로 실행되도록 되었지만 "world"라고 출력됨을 알 수 있다. ⇒ parser argument의 default값이라고 생각하면 될 것 같다.
$ sudo docker build --tag prac .
$ sudo docker run prac echo world
world
FROM ubuntu:latest
ENTRYPOINT ["echo", "hello"]
ENTRYPOINT로 지정하면 명령 인자를 무엇을 주든 무조건 ENTRYPOINT 값이 실행된다. 그리고 뒤에 추가로 실행한 명령어인 echo world 는 매개변수로 처리되어 뒤에 함께 처리된다.
$ sudo docker build --tag prac .
$ sudo docker run prac echo world
hello echo world
그래서 CMD 명령어는 ENTRYPOINT 명령어로 지정된 커맨드에 디폴트로 넘길 파라미터를 지정할 때 사용한다.
User@DESKTOP-FEQ0UC5 MINGW64 ~/Desktop/docker_project_setting
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-fastapi latest bebcf58eb45c About a minute ago 253MB
mysql 8 2a04bf34fdf0 5 days ago 535MB
Docker 이미지를 이용해 컨테이너 실행
docker run -p 8000:8000 my-fastapi:latest
User@DESKTOP-FEQ0UC5 MINGW64 ~/Desktop/docker_project_setting
$ docker run -p 8000:8000 my-fastapi:latest
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)