[Docker] Docker Compose? (Feat. ChatGPT)
💡 GPT가 소개해준 커리큘럼
- 다중 컨테이너 애플리케이션 구성 관리
- Compose 파일 작성 및 사용
- 여러 컨테이너 간 네트워킹
다중 컨테이너 애플리케이션 구성 관리
컨테이너화 기술은 애플리케이션 개발과 배포를 혁신적으로 변화시켰다.
그 중 Docker는 가장 인기있는 컨테이너 플랫폼 중 하나로 애플리케이션을 독립적인 환경으로 격리하고 관리하는데 사용된다.
Docker Compose는 Docker를 사용하여 다중 컨테이너 애플리케이션을 쉽게 구성하고 관리하는 도구이다.
Docker Compose를 활용한 다중 컨테이너 애플리케이션 구성 관리에 대해 살펴보자.
Docker Compose란?
YAML 파일을 사용하여 여러 개의 독립적인 컨테이너로 구성된 애플리케이션을 정의하고 실행하는 도구이다.
단일 호스트 또는 여러 호스트에서 컨테이너를 실행하고 관리하는데 사용된다.
Docker Compose를 사용하면 복잡한 다중 컨테이너 애플리케이션을 단일 명령으로 실행할 수 있으며, 애플리케이션간의 의존성 관리와 확장성을 용이하게 할 수 있다.
Docker Compose 파일 작성
YANL 파일을 사용하여 애플리케이션의 구성 요소와 각 컨테이너의 설정을 정의한다.
일반적으로 파일 이름은 “docker-compose.yml”로 지정되며, 서비스, 네트워크, 볼륨 등을 정의할 수 있다.
각 서비스는 이미지, 포트 매핑, 환경 변수 등의 속성으로 구성된다.
docker-compose.yml 파일을 작성함으로써 애플리케이션의 구성을 명확하게 정의할 수 있다.
Compose 파일 작성 및 사용
version: '3'
services:
web:
build: .
ports:
- "80:80"
depends_on:
- db
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=secret
웹 애플리케이션과 데이터베이스를 포함하는 다중 컨테이너 애플리케이션의 예시이다.
web 서비스와 db 서비스 두 개의 컨테이너로 구성된 웹 애플리케이션을 정의한다.
web서비스는 현재 디렉토리에서 Dockerfile을 사용하여 이미지를 빌드하고 호스트의 80번 포트와 컨테이너의 80번 포트를 매핑한다.
db서비스는 MySQL 5.7 이미지를 사용하고 환경변수를 설정하여 루트 암호를 지정한다.
web서비스는 db서비스에 의존하므로 db서비스가 먼저 시작된다.
Docker Compose 명령어
- docker-compose up
- 컨테이너를 시작하고 애플리케이션을 실행한다.
- docker-compose down
- 컨테이너를 중지하고 애플리케이션을 종료한다.
- docker-compose restart
- 컨테이너를 다시 시작한다.
- docker-compose scale
- 서비스의 인스턴스 수를 확장 또는 축소한다.
환경 변수와 볼륨 관리
Docker Compose를 사용하면 애플리케이션에서 사용하는 환경변수와 데이터 저장을 쉽게 관리할 수 있다.
compose파일에서 환경변수를 설정하거나 외부 파일을 사용할 수 있으며, 볼륨을 정의하여 데이터를 컨테이너에 영속적으로 저장할 수 있다. 이를 통해 애플리케이션을 배포 및 확장할 때 설정과 데이터를 유지할 수 있다.
여러 컨테이너 간 네트워킹
컨테이너간 네트워크를 관리하는 기능도 제공한다.
compose 파일에서 네트워크를 정의하고 서비스 간의 통신을 설정할 수 있으며, 여러 개의 compose 파일을 사용하여 여러 개의 네트워크를 생성할 수도 있다.
이를 통해 애플리케이션의 MSA를 구성하고 네트워크 격리를 달성할 수 있다.
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- mynetwork
depends_on:
- db
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=mydb
- MYSQL_USER=myuser
- MYSQL_PASSWORD=mypassword
networks:
- mynetwork
networks:
mynetwork:
위 예시는 web 서비스와 db 서비스간의 네트워킹을 구성하고 있다.
- web 서비스
- Nginx의 최신 이미지를 사용한다.
- 호스트의 80번 포트와 컨테이너의 80번 포트를 매핑하여 웹 서버에 접근할 수 있다.
- 'mynetwork'라는 사용자 정의 네트워크에 연결된다.
- 'db' 서비스에 의존하므로 'db' 서비스가 먼저 시작된다.
- db 서비스
- MySQL 5.7 이미지를 사용한다.
- 환경 변수를 설정하여 MySQL 루트 암호, 데이터베이스 이름, 사용자 이름, 사용자 암호를 지정한다.
- 'mynetwork'라는 사용자 정의 네트워크에 연결된다.
마지막으로, 네트워크를 정의하는 섹션인 **networks**를 추가했다. 이를 통해 web 서비스와 db 서비스가 같은 네트워크에 속하게 된다.