Docker Compose는 여러 컨테이너를 가지는 애플리케이션을 통합적으로 Docker 이미지를 만들고, 만들어진 각각의 컨테이너를 시작 및 중지하는 등의 작업을 더 쉽게 수행할 수 있도록 도와주는 도구이다.
여러 개의 컨테이너가 하나의 어플리케이션으로 동작할 때 도커 컴포즈를 사용하지 않는다면, 이를 테스트하려면 각 컨테이너를 하나씩 생성해야 한다.
즉, 아래와 같이 두개의 run 명령어를 입력해야된다.
$ docker run --name test -d mysql...
$ docker run -d -p 8000:80 test...
이런 작업을 docker compose를 사용하면 각 컨테이너의 의존성, 네트워크, 볼륨 등을 함께 정의할 수 있다.
그래서 컨테이너의 수가 많아지면 정의해야 할 옵션이 많아지고, 정의해야 할 옵션이 많아진다면 도커 컴포즈를 사용하는 것이 좋다.
적용 방법은 간단하다. 필자는 미리 docker image를 docker hub에 올려두었다.
docker-compose.yml을 생성한 후, docker run 명령어를 작성하는 것처럼 version, services, networks, volumes 총 4개의 최상위 옵션을 적용해주면 된다.
docker-compose 내의 depends_on 옵션을 이용하여 각 서비스의 의존성을 주입할 수 있다.
하지만, 선행 컨테이너의 실행 여부는 보장하지만, 준비 여부는 보장하지 않는다. 때문에 entry point에서 shell 스크립트를 이용하여 실행 여부 확인이 필요하다.
현재 초기 Docker-compose의 구조는 아래와 같다.
version: '3.8'
services:
neo4j:
image: neo4j:latest
container_name: neo4j-container
ports:
- "7474:7474"
- "7687:7687"
volumes:
- $HOME/neo4j/data:/data
- $HOME/neo4j/logs:/logs
- $HOME/neo4j/import:/var/lib/neo4j/import
- $HOME/neo4j/plugins:/plugins
environment:
NEO4J_dbms_security_procedures_unrestricted: "apoc.*"
NEO4J_apoc_export_file_enabled: "true"
NEO4J_apoc_import_file_enabled: "true"
NEO4J_PLUGINS: '["apoc"]'
NEO4J_AUTH: "[사용자 이름]/[비밀번호]"
cwu-ai:
image: 2swon/cwu-ai:latest
container_name: cwu-ai-container
ports:
- "8000:8000"
environment:
NEO4J_URL: "bolt://neo4j:7687"
NEO4J_USERNAME: "[사용자]"
NEO4J_PASSWORD: "[비밀번호]"
OPENAI_API_KEY: "[토큰]"
depends_on:
- neo4j
cwu-front:
image: 2swon/cwu-front:latest
container_name: cwu-front-container
ports:
- "3000:3000"
depends_on:
- neo4j
- cwu-ai
일단 초기 구조는 이렇게 진행을 했고 프리티어다보니 발생하는 메모리 문제는 차차 해결할 계획이다.
yaml파일을 작성하였으면 아래 명령어를 사용하여 백그라운드로 실행할 수 있다.
$ docker-compose up -d
Foreground로 실행
$ docker-compose up
background로 실행
$ docker-compose up -d
프로젝트 이름 my-project로 변경하여 실행
$ docker-compose -p project up -d
프로젝트 내 컨테이너 및 네트워크 종료 및 제거
$ docker-compose down
프로젝트 내 컨테이너, 네트워크 및 볼륨 종료 및 제거
$ docker-compose down -v
프로젝트 내 서비스 로그 확인
$ docker-compose logs
프로젝트 내 컨테이너 목록
$ docker-compose ps