FROM python:3.12.2
WORKDIR /src
COPY ./requirements.txt /src/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /src/requirements.txt
COPY ./app /src/app
COPY ./logs /src/logs
COPY ./test /src/test
COPY ./application.json /src/application.json
EXPOSE 8000
CMD ["python", "app/main.py"]
도커는 컨테이너 환경에서 도커 이미지에 빌드된 코드를 실행합니다.
컨테이너 안을 하나의 서버 (클라우드 서비스에서 새로 구성한 서버라 가정) 라고 가정하고 예제 코드를 설명하겠습니다.
- FROM
- 새롭게 구성한 서버에 파이썬을 설치합니다.
- WORKDIR
- 새롭게 구성된 서버에서 /root 경로로 이동해보면, 기본으로 구성된 폴더들을 확인할 수 있습니다.
- /home, /var, 등
- 기본 폴더를 사용할 수 있지만, /src 라는 새로운 폴더를 만들어 사용합니다.
- /workspace 등 자유롭게 설정 가능
- 새롭게 구성된 서버에서 /root 경로로 이동해보면, 기본으로 구성된 폴더들을 확인할 수 있습니다.
- COPY
- 나의 로컬 환경의 파일을 가상 서버의 어떠한 경로로 파일을 복사합니다.
- scp 명령어와 유사한 것 같습니다.
- 파이썬에서 사용할 라이브러리를 적어둔 파일을 복사합니다.
- COPY ./ ./ 라 적어도 다 복사되겠지만, 필요없는 파일들이 존재할 수 있기 때문에 따로 복사하도록 했습니다.
- 나의 로컬 환경의 파일을 가상 서버의 어떠한 경로로 파일을 복사합니다.
- RUN
- 바로 전 단계에서 복사한 라이브러리 설치 파일을 실행시켜, 도커 컨테이너 안에 설치합니다.
- COPY ...
- 파일 구조를 고려하여 다른 파일들을 복사합니다.
- EXPOSE
- 도커 컨테이너는 독립적이고 PORT를 열지 않으면 폐쇠적으로 실행되는 프로세스이기 때문에 외부와 통신할 PORT를 열어야 합니다.
- FASTAPI 기본 실행 PORT인 8000을 열었습니다.
- CMD
- 실행될 명령어를 띄어쓰기 기준으로 적습니다.
- 실행되는 위치는 마지막 WORKDIR 경로에서 해당 명령어가 실행됩니다.
작성된 도커 파일을 기준으로 도커 이미지를 빌드합니다.
docker build -t { 이미지 이름 } ./
- . 또는 ./ 은 해당 경로에서 도커 파일을 찾을 수 있게 합니다.
빌드된 도커 이미지를 실행합니다.
docker run -d -p 8000:8000 { 이미지 이름 }
- d는 detach를 의미하는데 쉽게 말해 그냥 애플리케이션을 실행하면, 실행한 위치를 벗어나거나 종료하면 애플리케이션이 종료하지만 이를 가능하게 해줍니다.
- p는 port를 의미하면 앞은 호스트 포트, 뒤는 컨테이너 포트를 의미합니다.
- 도커가 실행되는 서버의 호스트 포트가 컨테이너의 어떤 포트와 통신하는지를 뜻합니다.
- 아까 도커 파일에서 EXPOSE 한 포트가 뒤에 작성됩니다.
- 추가적으로 nginx (웹 서버 소프트웨어)의 location, proxy_pass 속성에 localhost:8000을 등록하면 해당 서버의 특정 경로로 들어오는 http 요청을 지정한 url로 매핑시킬 수 있습니다.
- lsof -i :{ 포트 } 명령어를 통해 도커가 잘 실행 중인지 확인할 수 있다.
docker ps # 컨테이너 ID 확인
docker exec -it { 컨테이너 Id } /bin/bash
exit # 탈출
- 실행 중인 컨테이너 접근할 수 있습니다.
docker cp { 컨테이너 Id }:{ 컨테이너 내부 파일 경로 } { 저장할 경로 }
- 리눅스의 scp 명령과 유사
- 저장할 경로는 도커가 실행 중인 로컬 혹은 서버
- 외부 서버를 사용한다면,
- 도커에서 외부 서버로 파일을 저장한 후
- PuTTY를 사용해서 로컬 PC로 가져오는 것이 편할 것이다.
mv { 기존 폴더명 } { 변경 폴더명 }
- logs 라는 폴더를 도커 컨테이너에서 가져왔다면, logs-yymmddHHMM 형태로 폴더명을 바꿔서 관리할 수 있습니다.
'인프라' 카테고리의 다른 글
Git, release 브랜치 관리하기 (0) | 2024.05.16 |
---|---|
Github Action & 도커 허브에 이미지 전송 (1) | 2024.05.01 |
Docker-compose, FastAPI & MySQL (0) | 2024.04.24 |
Docker, MySQL with 파이썬 (0) | 2024.04.24 |
클라우드 개발 서버와 동일한 설정의 운영 서버 구축 (0) | 2024.03.10 |