[도커 튜토리얼] 6. 도커 컴포즈 사용하기

Jisu·2023년 12월 1일
0

Docker

목록 보기
6/6
post-thumbnail

배경

지난 시간에는 todo app 컨테이너와 mysql 컨테이너를 같은 네트워크 상에서 실행시켜 네트워크 내 DNS를 통해 손쉽게 mysql 연결을 해보았다.
결국 하나의 앱에는 기본적으로 UI+비즈니스 로직 소스코드을 담은 앱과 DB를 담당하는 소프트웨어 2개가 최소로 배포된다.

여기서는 YAML 파일을 통해 하나의 명령어로 이런 컨테이너들을 한번에 묶어서 배포하는 방법에 대해서 배우게 된다.

YAML은 "YAML Ain't Markup Language"의 약어로, 데이터를 인간이 쉽게 읽을 수 있도록 하는 언어이다. 주로 설정 파일과 데이터 전송 형식으로 사용되며, 들여쓰기를 통해 계층 구조를 표현한다.


여태껏 해왔던 튜토리얼을 되짚어보자

  1. 내 앱을 컨테이너화 하기 위해서 dockerfile을 작성하고 그를 바탕으로 이미지를 빌드한다.
    그리고 도커헙에 푸쉬하여 공유할 수 있게 만든다.

이 때 도커파일에 들어가는 정보는 베이스 이미지, 컨테이너 실행후 실행될 명령어, 컨테이너 워킹 디렉토리 설정 등이 있었다.

  1. 내 앱의 파일시스템과 컨테이너의 파일시스템을 연동하기 위해 volume mount를 사용한다.
    bind mount를 통해 호스트의 소스코드 변화를 실시간 반영하게 할 수 있다. 환경에 제약받지 않으므로 개발 컨테이너 만들기에 용이하다

  2. 데이터 베이스를 개별 컨테이너로 실행하고 기존의 앱과 연동하기 위해 network를 사용한다.

mysql:8.0 이미지로 컨테이너를 실행하고, network alias를 통해 DNS를 mysql로 설정한다. 이에 따라 host에 컨테이너 IP 주소가 아닌 mysql이라는 텍스트로 호스트 설정이 가능해진다.

mysql의 비밀번호, 루트 사용자 등과 같은 설정을 위해 내 앱을 실행할 때 환경 변수 설정하여 docker run을 해준다.


이를 한번에 처리하려면 두 가지가 필요하다.

  1. dockerfile 명세
  2. mysql과 같은 환경 변수 옵션 명세

이를 compose file에 한번에 처리해보자


Compose file

이전에 실습했던 앱에 compose.yaml 파일을 만든다.

그리고 그 안에 다음과 같이 명세한다

1. 먼저 내가 배포할 앱에 관한 정보를 명세한다.

이 때 들어가는 이미지 이름이 network alias로 자동으로 사용된다.

services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 127.0.0.1:3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos
  • command: sh -c "yarn install && yarn run dev"
    : 컨테이너 내부에서 실행할 명령어를 설정. yarn install로 필요한 패키지를 설치하고, yarn run dev로 애플리케이션을 실행함.

  • ports: 호스트와 컨테이너 간의 포트 매핑을 설정. 호스트의 3000번 포트와 컨테이너의 3000번 포트를 연결.

  • volumes: Persistence를 위해 호스트와 컨테이너 간의 파일 시스템 공유를 설정. 현재 디렉토리(./)를 컨테이너의 /app 디렉토리와 공유함
  • environment: 컨테이너 내부에서 사용할 환경 변수를 설정. 여기서는 MySQL 호스트, 사용자 이름, 비밀번호, 데이터베이스 이름을 설정하고 있음.

2. 두번째로 MySQL 정보를 명세한다

mysql 컨테이너의 환경변수에 mysql 패스워드와 db 그리고 network alias를 설정했었다.

이것을 아래처럼 명세한다

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

volumes:
  todo-mysql-data:

mysql의 volumes 부분을 보자. todo-mysql-data의 로컬 볼륨 주소를 :/var/lib/mysql로 마운트한다.

주의

docker run에서는 자동으로 volume을 앱 내에 만들어주었다. 하지만 여기서는 volume 섹션을 따로 만들어서 명세를 해주어야한다. 이전의 코드를 잠깐보면

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

이전에는 mysql 실행시 docker volume create를 하지 않아도 이렇게 volume을 mount할 주소를 입력하면 도커가 알아서 volume을 만들어주었다.


최종 명세 파일

services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 127.0.0.1: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:

명세서 분석

명세서에는 다음이 담겨있다.

dockerfile 파트

  1. image: 앱을 구동하는데 필요한 OS, 파일 시스템 등이 담긴 베이스 이미지
  2. command: 컨테이너를 실행하자마자 실행되는 명령어
  3. ports: 컨테이너와 호스트의 포트 매핑
  4. working_dir: 컨테이너 내부의 워킹 디렉토리
  5. volumes: 컨테이너의 파일시스템을 호스트와 연동할 volume
  6. environment: mysql에 접속할 수 있는 환경 변수 세팅

mysql 파트

  1. image: mysql 구동에 필요한 베이스 이미지
  2. volumes: mysql을 호스트와 연동할 volume 세팅
  3. environment: mysql 컨테이너의 루트 사용자 비번과 db명

volume

  1. volumes: 호스트에 생성할 볼륨 이름 설정

자 이제 저장 후에 새로운 이미지로 돌려보자!!


Run application stack

아래 명령어 수행

docker compose up -d
jisujang@Jisuui-MacBookPro getting-started-app-main % docker compose up -d
[+] Building 0.0s (0/0)                                                                                           docker:desktop-linux
[+] Running 2/2
 ✔ Container getting-started-app-main-app-1    Started                                                                            0.1s 
 ✔ Container getting-started-app-main-mysql-1  Started             

명령어 수행시 네트워크 설정과 볼륨을 설정하는 것을 볼 수 있다.
이후 docker ps를 통해서 실행중인 컨테이너를 보면 mysql과 todo-app을 볼 수 있다.

todo-app을 중단하고 다시 실행해도 데이터가 보존되는 것을 확인할 수 있고 mysql에도 잘 저장되고 있음을 확인할 수 있다.

여러 컨테이너를 yaml이라는 형식으로 한 파일안에 명세하여 깔끔하게 처리해보았다.

Reference

Use Docker Compose - docker tutorial

profile
비즈니스에 관심많은 DevOps Engineer 장지수입니다.

0개의 댓글