본문 바로가기
Docker/docs

[Docker][docs] 08. Use Docker Compose

by NJ94 2023. 12. 27.

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

 

Use Docker Compose

Using Docker Compose for multi-container applications

docs.docker.com

 

Docker Compose


Docker Compose는 여러 개의 도커 컨테이너를 관리하고 실행하기 위한 도구 이다. Docker Compose를 사용하면 여러 개의 컨테이너로 이루어진 복잡한 애플리케이션을 정의하고 실행하고, 관리하는 작업을 단순화할 수 있다.

 

기존적으로 Docker Comose 는 YAML 파일을 사용하여 애플리케이션의 서비스를 정의한다. 이 YAML 파일에는 애플리케이션을 구성하는 각 서비스의 설정 정보, 컨테이너 간의 네트워크 볼륨 마운트 구성, 환경 변수, 포트 매핑 등이 포함된다.

 

 

1. 이전, 다중 컨테이너에서 아래의 명령어를 사용하여 애플리케이션 서비스를 시작했습니다.

$ docker run -dp 127.0.0.1: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"

 

 

2. 이제 Docker Compose 를 이용하여, 위의 서비스를 정의한다.

1. getting-started-app 폴더에 진입.

2. compose.yaml 파일 생성

 

 

3. compose.yaml 서비스 정의

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

 

1. image

:  node:18-alpine: Nodejs18 버전 기반으로하는 리눅스 이미지를 사용하여 app 서비스를 생성합니다.

 

2. command

:  컨테이너가 시작될 때 실행할 명령을 지정합니다.

 

3. ports

:  127.0.0.1 주소에서 3000포트를 컨테이너의 3000 포트와 연결합니다. 로컬 머신의 3000번 포트로 들어오는 요청을 컨테이너 내부의 3000번 포트로 전달합니다.

 

4. working_dir

:  /app 컨테이너 내부에서 작업 디렉토리를 /app 으로 설정합니다. 작업 디렉토리를 명시적으로 지정하여 작업을 수행할 디렉토리를 설정합니다.

 

5. volumes

:  호스트의 현재 디렉토리 ('.')를 컨테이너 내부의 /app 디렉토리로 마운트합니다. 이를 통해 호스트와 컨테이너 간 파일 시스템을 공유할 수 있습니다.

 

6. environment

: 컨테이너 내에서 사용할 환경 변수를 설정합니다. MySQL 호스트, 사용자이름, 패스워드, 데이터베이스 이름 등의 환경변수를 정의하여 애플리케이션 내에서 사용할 수 있도록 한다.

 

 

4. compose MySQL 서비스 정의

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

volumes:
  todo-mysql-data:

 

1. image

: MySQL 이미지는 mysql:8.0 사용

 

2.volumes

: todo-mysql-data 라는 볼륨을 /var/lib/mysql 에 마운트한다.

 

3. environment

: MySQL 환경 변수 정의

 

 

5. compose.yaml 파일 정의 완료

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:

 

 

6. 애플리케이션 스택 실행

1. 먼저 실행 중인 컨테이너의 다른 복사본이 없는지 docker ps 통해 조회한다. 중복되는 컨테이너가 있을 경우,

아래의 명령어로 삭제한다.

$ docker rm -f <ids>

 

2. 아래의 명령어를 사용하여 애플리케이션 스택을 실행한다. 

$ docker compose up -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가 볼륨과 네트워크를 생성한 것을 알 수 있다. 기본적으로 Docker Compose는 애플리케이션 스택을 위한 네트워크를 자동으로 생성한다 (이것이 Compose 파일에 네트워크를 정의하지 않은 이유이다)

 

 

3. 아래의 명령어를 사용하여 실시간 로그 확인

$ docker compose logs -f

 

명령어를 실행 중일때, compose가 완료되면 아래와 같은 명령어가 출력된다.

mysql_1  | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
mysql_1  | Version: '8.0.31'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
app_1    | Connected to mysql db at host mysql
app_1    | Listening on port 3000

 

 

4. localhost:3000 브라우저 실행

 

 

7. 컨테이너 중지, 네트워크 제거

$ docker compose down

 

<경고>
기본적으로 compose 파일의 명명된 볼륨은 를 실행할 때 제거되지 않습니다 docker compose down. 볼륨을 제거하려면 --volumes플래그를 추가해야 합니다.Docker 대시보드는 앱 스택을 삭제할 때 볼륨을 제거하지 않습니다.