다중 컨테이너 Docker 어플리케이션을 정의하고 실행하기 위한 도구이다.
Compose는 YAML 파일을 사용하여 각종 어플리케이션 서비스를 구성한다.
그런다음 단일 명령으로 구성에서 모든 서비스를 만들고 시작 할 수 있다.
Swarm과 Kubernetes 같은 Conatainer Orchestration 툴과는 다른 말 그대로 Docker Container를 쉽게 실행하고 종료 할 수 있게 해주는 도구 이다.
docker run -d -v /usr/home/user/db:./db -p 3306:3306 --name db db
docker run -d -v /usr/home/user/app1:./app1 -p 80:80 --name app1 --net container:ev24c9qu34m7 db app1
이와 같이 docker 실행 명령어에 각종 옵션을 추가하여 컨테이너를 실행 시킨 이후
다른 컨테이너와 연결을 위해 net 옵션이나 link를 걸어주고...
스크립트를 별도로 구성해서 돌린다면 모르겠지만 매번 이런식으로 컨테이너를 올리는건 아주 비효율적이다. 이때 사용하는것이 Docker compose이다.
version: 3
service:
app1:
image: app1
volumes:
- /usr/home/user/app1:./app1
container_name: app1
ports:
- 80:80
db:
image: db
volumes:
- /usr/home/user/db:./db
container_name: db
ports:
- 3306:3306
networks:
tmp_network:
driver: bridge
해당 파일을 만들어 단순히 $ docker-copose up -d 만 하면 간단하게 db와 연결된 app1을 구동 할 수 있다.
docker-compose up
docker-compose down
docker-compose start [{컨테이너 이름}]
docker-compose start [{컨테이너 이름}]
docker-compose stop [{컨테이너 이름}]
docker-compose logs
docker-compose ps
docker-compose exec {컨테이너 이름} {명령어}
docker-compose build [{컨테이너 이름}]
version: '3' // compose 버전 ('3' = 3. 버전대 가장 최신)
services: // service container 영역
db: // service 이름 container_name이 없을 경우 기본적으로 db_1형식으로 만들어 진다.
image: mysql:latest // 참조 이미지
volumes: // 볼륨 설정
- ./data:/var/lib/mysql // host경로 : container경로
environment: // 컨테이너 환경 변수 설정
- 'MYSQL_ROOT_PASSWORD=PASSWORD'
networks: // 네트워크 설정
tmp_network:
ipvr4_address: 192.168.0.2 // ip지정
container_name: db // 컨테이너 이름
hostname: db // 호스트 이름
command: // 추가 명령어 ["--lower_case_table_names=1", "--charact...", ...] 가능
- --lower_case_table_names=1
- --character-set-server=utf8
- --collation-server=utf8_unicode_ci
app1:
build: // build 설정
context: . // 명령어 전달할 Dir경로
dockerfile: ./compose/Dockerfile-dev // Dockerfile 경로
environment:
- DB_HOST=db
depends_on: //의존성 지정
- db
volumes:
- app1_data:./app1:ro // volume container 연결 및 ro : read-only 설정
restart: always // 재시작 여부 no, always, on-failure[:{시도횟수}], unless-stopped
ports: // 포트 지정 Host Port : Container Port
- 8000:8000
networks: // 네트워크 설정
- default
- tmp_network
volumes: // volume container 영역
app1_data: // 볼륨 이름
networks: // network 영역
tmp_network: // name이 없을 경우 최상위 container이름_tmp_network
driver: bridge // 드라이버 이름 bridge, host, custom driver 가능
name: tmp_network // network 이름
docker-compose 를 시작할때 network 영역을 설정 하지 않으면 기본적인 container이름_default 로 네트워크를 형성한다. 그로 인해서 docker-compose로 올린 컨테이너에 docker 명령어로 구동한 컨테이너는 접근이 불가능 하다.
Docker Compose로 도커를 구동시 네트워크를 연결 하는 방법으로는 docker-compose에 명시적으로 network 생성 하도록 설정을 하던지 외부에서 network 생성을 한 이후 할당 하는 방법이 있다.
Docker Network 생성 후 할당
Docker Network 생성
docker network create --driver=bridge tmp_networkdocker compose 할당
networks: default: external: name: tmp_network혹은
networks: tmp_network: driver: bridge external: true
동일한 compose file에 container 설정
version: '3' services: store-service: image: nginx:latest container_name: store networks: - tmp_network web-service: image: nginx:latest container_name: web networks: - tmp_network networks: tmp_network: driver: bridge name: tmp_network
compose file에 network를 동일하게 작성
version: '3' services: store-service: image: nginx:latest container_name: store networks: - tmp_network networks: tmp_network: driver: bridge name: tmp_network
version: '3' services: web-service: image: nginx:latest container_name: web networks: - tmp_network networks: tmp_network: driver: bridge name: tmp_network
network와 마찬가지로 compose가 돌아갈때 volume을 생성하는 방법과 외부에서 생성한 볼륨을 할당 하는 방법이 있다.
Docker Volume 생성 후 할당
Docker Network 생성
docker volume create tmp_volumedocker compose 할당
volumes: tmp_volume: external: true
compose file에 volume 명시
volumes: tmp_volume: