도커 컴포즈는 여러 컨테이너를 효율적으로 다루기 위한 프로그램이다. 어떻게 효율적으로 다룬다는 의미일까?
컨테이너를 3개 만든 후, 각 컨테이너에 Nginx, Wordpress, mariaDB 를 설치한 후 연동한다고 해보자.
위 그림에서 docker-compose.yml 이 있다.
docker-compose [docker-compose.yml 위치] up --build -d;
명령어를 한 번 실행하면, 각 컨테이너를 위한 이미지를 생성하는 dockerfile 을 실행하고 컨테이너를 생성하고, 3 개의 프로그램을 연결까지 해준다.
만약 docker-compose 파일이 없다면 여러 단계가 필요하다.
네트워크 만들기
docker network create [network 이름]
각 컨테이너 네트워크에 연결하기
docker run -d --name [container 이름] --network [network 이름] [이미지 이름]
여기서는 네트워크에 연결하는 코드를 3번 입력해야한다.
docker-compose 를 사용하지 않으면, 더 많은 커맨드를 입력해야하는 번거로움이 생긴다.
아래는 직접 만들어본 docker-compose.yml 이다.
services:
nginx:
build: requirements/nginx
image: nginx
container_name: nginx
ports:
- 443:443
restart: always
volumes:
- wp_volume:/var/www/html/wordpress
depends_on:
- wordpress
networks:
- inception_network
mariadb:
init: true
build: ./requirements/mariadb/
image: mariadb
container_name: mariadb
restart: always
expose:
- "3306"
env_file:
- .env
volumes:
- db_volume:/var/lib/mysql/
networks:
- inception_network
wordpress:
build: requirements/wordpress
image: wordpress
container_name: wordpress
restart: always
volumes:
- wp_volume:/var/www/html/wordpress
expose:
- "9000"
networks:
- inception_network
env_file:
- .env
depends_on:
mariadb:
condition: service_healthy
volumes:
wp_volume:
name: wp_volume
driver: local
driver_opts:
type: none
device: /home/jaekim/data/wordpress
o: bind
db_volume:
name: db_volume
driver: local
driver_opts:
type: none
device: /home/jaekim/data/mariadb
o: bind
networks:
inception_network:
name: inception_network
driver: bridge
정의는 이렇다.
컨테이너 서비스 정의
각각 nginx, wordpress, mariadb 서비스에 대한 정의
Dockerfile 대신에 Dockerfile을 빌드하기 위한 Build context 경로
이미지 이름 설정 (이미지 빌드시 태그명으로 설정)
컨테이너 이름 설정
컨테이너의 포트 설정
always를 설정하여 컨테이너가 중단되었을 때 자동으로 다시 시작하도록 설정
호스트 파일시스템과 컨테이너 파일시스템 간 마운트를 설정
컨테이너 간 의존성 설정
포트를 외부에 노출하지 않고 다른 컨테이너에서만 접근 가능하도록 설정
컨테이너에서 사용할 환경변수 파일을 설정
service_healthy를 설정하여 mariadb가 건강한 상태일 때만 wordpress 컨테이너가 시작되도록 설정
볼륨 정의
각각 wordpress, mariadb 볼륨 정의
사용할 볼륨 드라이버 설정
볼륨 드라이버 옵션 설정
사용할 볼륨 드라이버 유형
호스트 파일시스템에서 사용할 경로
마운트 옵션 설정
네트워크 정의
네트워크 이름 설정. 도커 컴포즈에 정의된 컨테이너들이 상호작용할 수 있는 네트워크를 형성하도록 하는 옵션이다.
사용할 네트워크 드라이버 설정 (기본값: bridge)
왜 mariadb에만 init: true를 해주는 것인가요?