[Docker] 도컨살 EP.8 - Docker Compose

정재경·2022년 10월 11일

도컨살

목록 보기
8/8
post-thumbnail

Docker Compose

올 것이 왔다..

바로 앞 포스팅에서 배운 여러 컨테이너를 사용하는 앱을 한방에 관리하기 위한 것이 바로 Docker Compose 이다.

docker-compose.yml 작성하기

일단 앞 포스팅에서 컨테이너 하나를 실행시킬 때 사용했던 스크립트를 docker-compose.yml 로 옮겨보자

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:12-alpine \
  sh -c "yarn install && yarn run dev"

이거의 뜻을 복습해보자

  1. -w - 컨테이너 안에서 스크립트를 실행할 디렉토리
  2. -v - Named Volume이나 Bind mounts 지정
  3. --network - 컨테이너가 속할 네트워크 지정
  4. -e 컨테이너 안의 환경변수 지정
  5. node:12-alphine 컨테이너 생성할 이미지
  6. sh -c - 컨테이너 안에서 실행할 스크립트

이거를 docker-compose.yml로 옮기면 다음과 같다

 version: "3.7"

 services:
   app:
     image: node:12-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

각각의 의미를 하나씩 뜯어보자. 일단은 기본적으로 yml파일이므로 yml의 구조를 그대로 가져간다.

  1. version: - docker-compose의 버전을 지정해준다. 공식문서에 찾아보면 docker-compose의 버전 기록이 나와있는데, 최신 버전을 사용하는 것이 좋다고 한다. 튜토리얼에는 3.7로 돼있는데 현재 최신 버전은 3.8이다
  2. services: - 이 docker-compose.yml로 관리할 컨테이너들의 목록이 들어온다. services 안에 있는 컨테이너들은 자동으로 같은 네트워크 하나에 연결된다!
  3. app: - 컨테이너의 이름을 적어준 것인데 여기에선 그냥 app으로 한다. 여기에 적은 이름은 자동으로 network-alias로 지정이 되는 것을 기억하고 가자!
  4. 그 아래부터는 이름 그대로다. 이것들은 순서에 크게 상관은 없지만 통상적으로 image, command는 초반에 넣는다고 한다.

여기 까지하면 컨테이너 하나만 관리하는 docker-compose.yml 파일을 하나 만든거다. 우리는 여러 컨테이너를 사용할꺼니까? 바로 이어서 MySQL 예시도 같이 알아보자.

MySQL까지 넣으면?

version: "3.7"

services:
  app:
    image: node:12-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:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

새로 생긴 부분들만 확인해보자

  1. 이번에는 이름을 mysql로 했다. 마찬가지로 이게 network-alias로 지정해주니까 이름을 짓는데 신중해야한다.
  2. volumes:는 마지막에 가장 상위 레벨에 작성했는데, 여기에 하면 볼륨을 생성할 수 있다. 지금은 todo-mysql-data 이라는 Named Volume을 생성해준다.

이제는 내꺼로 해보자!

version: "3.8"

services:
  app:
    image: node:12-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:5.7
    platform: linux/amd64
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

다른점은

  1. version 을 최신버전인 3.8로 해줬다.
  2. mysql 컨테이너를 생성할 때 앞 포스팅에서 플랫폼지정을 해줘서 여기도 해줬다.

실행하려면 앱 디렉토리에 가서

docker compose up -d

그러면! 한방에 되는게 무섭긴 하지만 한방에 너무 잘 된다! 헉~ㅋㅋ -d 옵션은 백그라운드에서 계속 실행시킨다는 옵션이다

내 앱 디렉토리는 이렇다! 혹시나 이걸 따라하면서 이상하다고 뭐라고 말자

.
├── node_modules
├── Dockerfile
├── docker-compose.yml
├── package.json
├── spec
│   ├── persistence
│   └── routes
├── src
│   ├── index.js
│   ├── persistence
│   ├── routes
│   └── static
└── yarn.lock

컨테이너 끄기

컨테이너들을 킬 때는 docker compose up -d 으로 켰으니까, 반대로 끌 때는 docker compose down으로 끄면 된다. 그런데 만약에 볼륨을 생성했다면 --volumes 옵션을 꼭 줘야 같이 사라진다!

N줄 요약

  1. docker-compose 로 컨테이너 여러 개를 한 yml 파일로 관리할 수 있다
  2. docker-compose.yml 로 관리되는 컨테이너들을 실행하려면 docker compose up -d
  3. 반대로 삭제하려면 docker compose down --volumes

여기까지 해서 일단 공식문서 튜토리얼 에 있는 내용을 쭉 한번 다뤘다! 9번이랑 10번은 예시들이랑 이제 뭘 더 공부해보아라~ 같은 내용이라 앞으로의 도컨살은 진짜 15GG 백엔드에 적용하면서 생기는 문제들에 대해서 포스팅 해야겠다!

profile
You'll see what I've become.

0개의 댓글