Sangmun

Docker compose 본문

개발

Docker compose

상상2 2023. 2. 4. 21:39

지금까지는 하나의 Docker Image만을 띄우는 것을 알아보았는데 하난의 Docker Image가 아니라 여러 Docker Image를 띄우고 싶거나 A Image를 띄우고 B Image를 띄워야 하는 상황이 있다면?(B가 A에 의존)

Docker compose를 활용을 할 수 있다. 

 

Docker compose 설치

Mac이나 Window라면 docker desktop을 설치하면서 docker compose도 자동으로 설치가 된다.

linux라면 docker compose는 따로 설치를 해줘야 한다.

https://docs.docker.com/compose/install/

 

Overview

 

docs.docker.com

설치 후 버전을 확인하면서 제대로 설치가 되었는지 확인을 해준다.

 $docker compose version

 

docker-compose.yml

docker image의 내용을 Dockerfile에 작성했던 것처럼 docker-compose의 내용은 docker-compose.yml에 작성을 한다.

 

먼저 그냥 docker run 명령어로 node image를 띄웠을 때와 docker-compose에 작성된 내용을 비교해 보자.

node서버의 포트, volume, 환경 변수등 많은 옵션들이 주어진다.

 docker run -dp 3000:3000 \
  -w /app -v "$(pwd):/app" \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:18-alpine \
  sh -c "yarn install && yarn run dev"

 

위의 명령어를 docker-compose.yml 파일로는 아래와 같이 옮길 수 있다.

services:
  # app은 어떠한 이름도 될 수 있음 사용자 정의에 따름
  # 자동적으로 네트워크의 이름이 됨
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

 

다음은 docker run으로 mysql을 생성하는 명령어이다.

 docker run -d \
  --network todo-app --network-alias mysql \
  -v todo-mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=todos \
  mysql:8.0

 

docker-compose.yml로는 아래와 같이 작성할 수 있다.

주목해야 할 점은 아래와 같다.

 

* docker run 명령어에서는 network-alias를 지정해 주었지만 docker-compose.yml에서는 service이름을 mysql로 지정해 주면서 자동적으로 network-alias가 mysql로 지정되게 된다.

 

* 또한 docker run 명령어에서는 지정된 volume이 자동으로 생성되었지만 compose에서는 그렇지 않아서 사용할 volumne을 volumes: 카테고리 아래에 지정해 준 것을 확인할 수 있다.

services:
  app:
    # The app service definition
  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

 

따라서 전체 docker-compose.yml 파일은 다음과 같다.

services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

이후 docker-compose run -d 명령어로 실행해 주면 다음과 같은 로그가 뜨면서 잘 실행되는 것을 확인할 수 있다.

Creating network "app_default" with the default driver
 Creating volume "app_todo-mysql-data" with default driver
 Creating app_app_1   ... done
 Creating app_mysql_1 ... done

docker-compose.yml 파일에 작성

 

docker-compose로 fastapi와 mysql 연동

또 다른 예시로는 fastapi와 mysql을 연동하는 예시가 있다.

mysql 부분은 위의 예시와 크게 달라진 것은 없다.

version: '3'

services:
  db:
    image: mysql:5.7.12
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: my_database
    ports:
      - 3306:3306
    
  app:
    build:
      context: .
    environment:
      DB_URL: mysql+mysqldb://root:root@db:3306/my_database?charset=utf8mb4
    ports:
      - 8000:8000
    depends_on:
      - db
    restart: always

 

* version : compose file의 버전을 명시합니다.

versioning은 버전별로 다음과 같은 특징이 있습니다.

  • Version 1에서는 버저닝을 생략
  • Version 2부터 마이너 버전(2.x)까지 설정해야 함 (생략 시 2.0으로 적용된다.)
  • Version 3은 도커 스웜과 같이 사용되도록 디자인됨

* build : Dockerfile 빌드를 하기 위해 Dockerfile이 있는 경로를 지정

context:.라는 의미는 현재 경로에 Dockerfile이 있다는 의미이며 위의 예제에서 사용된 Dockerfile은 다음과 같다.

FROM python:3.8.7-slim-buster

COPY . /app
WORKDIR /app
ENV PYTHONPATH /app
ENV PYTHONBUFFERED=1

RUN pip install pip==21.2.4 && \
	pip install -r requirements.txt
    
CMD ["python", "main.py"]

* depends_on: service 간 종속을 의미하며 위에서는 db가 실행되고 난 후에 app이 실행되어야 한다는 의미이다.

* restart : 몇 가지 옵션이 있으며 각각 아래의 뜻을 의미한다.

no : 수동으로 재시작

always : 컨테이너를 수동으로 off 하기 전까진 항상 재시작

on-failure : 오류가 있을 때 재시작

 

 

 

출처 :

https://meetup.nhncloud.com/posts/277

 

Docker Compose와 버전별 특징 : NHN Cloud Meetup

도커는 이제 대부분의 개발자 노트북이나 PC에 하나씩은 설치되어있는 필수품이 되어가는데요 편하고 유용한 도커를 좀 더 유익하고 편하게 사용할 수 있는 도구인 Docker Compose에 대해서 알기 쉽

meetup.nhncloud.com

https://medium.com/@jyson88/docker-compose-yml-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C-%EC%82%AC%EC%9A%A9%EB%B2%95-8dffb6a57da3

 

Docker-compose.yml 구성 요소 사용법

Docker compose 파일에서 사용되는 모듈에 대해서 확인 해보도록 하겠습니다.

medium.com

https://docs.docker.com/get-started/08_using_compose/

 

Use Docker Compose

 

docs.docker.com

 

Comments