docker-compose 파해치기

김장훈·2020년 6월 13일
0

docker-compose가 잘 작성된 코드 분석

- 참고한 코드

1. 전체 파일 구조

  • mysql과(DB) src(app) 구조로 구분되어져있다.
  • src 레벨에 docker-compose.yml이 존재한다.

2.docker-compose.yml

  • Dockerfile을 조화롭게? 해주는 역할
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

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에서 설치하듯이) 설치하기에 좋다.
profile
읽기 좋은 code란 무엇인가 고민하는 백엔드 개발자 입니다.

0개의 댓글