docker-compose가 잘 작성된 코드 분석
- 참고한 코드
1. 전체 파일 구조
- mysql과(DB) src(app) 구조로 구분되어져있다.
- src 레벨에 docker-compose.yml이 존재한다.
2.docker-compose.yml
version: '3'
services:
api:
build: .
ports:
- "5000:5000"
volumes:
- "./src:/src"
tty: true
environment:
TZ: Asia/Tokyo
FLASK_APP: run.py
FLASK_ENV: development
command: flask run -h 0.0.0.0
db:
build: ./mysql/
volumes:
- ./mysql/mysql_data:/var/lib/mysql
- ./mysql/sqls:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD=hoge
- version 은 사용할 docker 버젼을 명시
- services에는 내가 compose할 서비스들을 명시함
- {서비스명}
- 기타 옵션들은 이 링크를 보는게 훨씬 좋다.
3. flask, redis, mysql만 띄워보자
- 연동은 바라지도 않고 우선적으로 각각 한번에(docker-compose) 띄워보자
- flask는 poetry를 통해 설치한다.
파일구조
- root 폴더를 docker로 하는건 좋은 생각은 아닌것 같다.
- requirements.txt는 사용하지 않는다(poetry 사용중)
docker-compose.yml
version: "3"
services:
flask_web:
build:
context: .
dockerfile: ./docker/Dockerfile-ver
args:
runfile: app.py
ports:
- 5000:5000
my_redis:
image: redis:4.0.11-alpine
container_name: redis_container
ports:
- 6379:6379
my_sql:
image: mysql:5.7
restart: always
container_name: mysql_5.7
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=user
- MYSQL_PASSWORD=dev
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
ports:
- 5678:3306
- redis, mysql은 기본 image를 그대로 사용한다.
- port 부분은 명확히 명시해주는것이 좋다
- {input_port:docker_port} 에서 input은 내가 원하는 대로 변경해줘도 상관 없지만 docker_port(= 서비스 포트)는 서비스에서 권장하는대로 써주는게 좋다
- mysql은 3306, redis는 6379 등
Dockerfile-ver
FROM python:3.8-slim
ARG runfile
WORKDIR /app
RUN pip install poetry
COPY pyproject.toml poetry.lock /app/
RUN poetry config virtualenvs.create false
RUN poetry install
COPY . .
ENV FLASK_APP=$runfile
CMD flask run --host=0.0.0.0
- poetry config settings.virtualenvs.create false 이 명령어가 특이하다.
- poetry를 설치하면 poetry shell로 접속해서 flask를 실행하던가 아니면 poetry run python 등의 명령을 사용해야하는데 저렇게 할 경우 가상환경을 구성해서 설치하지 않고 바로 그대로(=OS에서 설치하듯이) 설치하기에 좋다.