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 대시보드는 앱 스택을 삭제할 때 볼륨을 제거하지 않습니다.
'Docker > docs' 카테고리의 다른 글
[Docker][docs] 09. image_best (레이어 캐싱) (1) | 2023.12.27 |
---|---|
[Docker][docs] 07. 다중 컨테이너 앱 (2) | 2023.12.08 |
[Docker] [docs] 06. 바인드 마운트 사용 (0) | 2023.12.05 |
[Docker] [docs] 05. DB 유지 (볼륨) (0) | 2023.12.05 |
[Docker] [docs] 04. 애플리케이션 공유, Docker Hub (0) | 2023.12.04 |