[Docker] 도커 컨테이너 다루기 : 도커 컴포즈 개념 및 사용법
도커 컴포즈 (Docker Compose)
도커 서버에서 여러 컨테이너를 프로젝트로 묶어서 관리하게 위해 사용됩니다.
단일 서버에서는 도커 엔진의 도커 커맨드라인 명령어를 사용하여 도커 컨테이너를 실행할 수 있었습니다.
하지만 도커 컴포즈를 사용하게 되면 docker-compost.yml YAML 파일을 통해서 컨테이너들을 명시적으로 관리할 수 있으며, 컨테이너들을 프로젝트 단위로 묶어서 관리할 수도 있기 때문에 더 격리된 환경을 제공할 수 있습니다.
이 외에도 프로젝트 단위로 도커 네트워크와 불륨 관리가 가능하며,
프로젝트 내 서비스 간 의존성 정의가 가능하며 디스커버리 자동화, 손 쉬운 컨테이너 수평 확장이 쉽게 가능합니다.
주요 사용 목적
로컬 개발 환경 구성
- 특정 프로젝트의 로컬 개발 환경 구성 목적으로 사용
- 프로젝트의 의존성 (Redis, MySQL, Kafka 등)을 쉽게 띄울 수 있음
자동화된 테스트 환경 구성
- CI/CD 파이프라인 중 쉽게 격리된 테스트 환경을 구성하여 테스트 수행 가능
단일 호스트 내 컨테이너를 선언적 관리
- 단일 서버에서 컨테이너를 관리할 때 YAML 파일을 통해 선언적으로 관리 가능
프로젝트(project) / 서비스(service) / 컨테이너(container)
도커 컴포즈를 이해하기 위해서는 세가지 개념의 상관관계를 이해하고 있어야 합니다.
프로젝트(project)
- 도커 컴포즈에서 다루는 워크스페이스 단위
- 함께 관리하는 서비스 컨테이너의 묶음
- 프로젝트 단위로 기본 도커 네트워크가 생성됨
서비스(service)
- 도커 컴포즈에서 컨테이너를 관리하기 위한 단위
- scale을 통해 서비스 컨테이너의 수 확장 가능
컨테이너(container)
- 서비스를 통해 컨테이너 관리
docker-compose.yml 파일 형식
최상위 옵션으로 version, service, networks, volume 4가지 옵션이 존재합니다.
- 버전(version)
2024년 1월 기준 3.9가 최신버전입니다.
docker-compose 공식 문서 상에서는 가능한 최신 버전을 사용하기를 권장하고 있습니다.
도커 엔진 및 도커 컴포즈 버전에 따라서 사용가능한 YAML 버전이 달라지기 때문에 호환성 매트릭스를 참조해야합니다.
아래 도커 문서 사이트에서 docker engine release 버전에 따라 사용 가능한 compose file format을 확인할 수 있습니다.
https://docs.docker.com/compose/compose-file/compose-file-v3
Compose file version 3 reference
Find a quick reference for Docker Compose version 3, including Docker Engine compatibility, memory limitations, and more.
docs.docker.com
도커 컴포즈 사용 시 버전 2와 버전 3의 차이점을 가지고 있습니다.
가능한 버전 3를 사용하기를 권장하고 있으며, 버전 3부터는 Docker Swarm과 호환이 가능합니다.
-> Swarm 서비스를 docker-compose.yml로 정의 가능
도커 스왐(Docker Swarm)
여러 서버를 기반으로 스왐 클러스터를 형성하여 컨테이너를 관리하는 컨테이너 오케스트레이션 시스템
쿠버네티스와 동일 목적으로 만들어졌지만 인기를 끌지 못해서 사용률이 점점 줄어드는 추세
- 서비스(service)
프로젝트 내에 구성되는 여러 서비스들을 서브키들을 통해 관리를 할 수 있습니다.
- 네트워크 (network), 볼륨(Volume)
네트워크와 볼륨의 경우 프로젝트마다 독립되어 구성되게 되는데, 프로젝트 내에서 사용할 네트워크는 네트워크 키 밑에 정의해서, 도커 볼륨은 볼륨 키 밑에 정의해서 사용하면 된다.
참고로 네트워크의 경우 정의를 하지 않더라도 기본적으로 프로젝트 내에 default라는 이름으로 기본 네트워크가 브릿지 모드로 생성이 됩니다.
docker-compose 명령어 옵션
# docker-compose
Usage: docker compose [OPTIONS] COMMAND
Docker Compose
Options:
--ansi string Control when to print ANSI control characters ("never"|"always"|"auto")
(default "auto")
--compatibility Run compose in backward compatibility mode
--env-file string Specify an alternate environment file.
-f, --file stringArray Compose configuration files
--profile stringArray Specify a profile to enable
--project-directory string Specify an alternate working directory
(default: the path of the Compose file)
-p, --project-name string Project name
Commands:
build Build or rebuild services
convert Converts the compose file to platform's canonical format
cp Copy files/folders between a service container and the local filesystem
create Creates containers for a service.
down Stop and remove containers, networks
events Receive real time events from containers.
exec Execute a command in a running container.
images List images used by the created containers
kill Force stop service containers.
logs View output from containers
ls List running compose projects
pause Pause services
port Print the public port for a port binding.
ps List containers
pull Pull service images
push Push service images
restart Restart containers
rm Removes stopped service containers
run Run a one-off command on a service.
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker Compose version information
Run 'docker compose COMMAND --help' for more information on a command.
도커 컴포즈 버전 확인
root@wnwls648-220351:~# docker-compose version
Docker Compose version v2.1.1
docker-compose 명령어 : 실행 및 종료
저는 테스트를 위해 Flask 프레임워크를 이용해서 간단한 웹 어플리케이션을 만드는 코드를 작성하였고 해당 컨테이너를 빌드하여 실행하는 과정에 대해서 기술해보도록 하겠습니다.
build 디렉토리에 웹 어플리케이션을 만들기 위한 코드들을 작성하였습니다.
docker-compose up 명령어를 사용하여 이미지를 받아오거나 빌드를 진행하고, 컨테이너를 생성하고, 실행합니다.
# docker-compose up
docker-compose up 명령어 사용시 아래와 같은 오류 메시지가 뜨면서 실행이 되지 않을 때가 있는데,
.yml 또는 .yaml 파일이 있는 디렉토리 내에서 명령어 실행 시 정상적으로 명령어가 작동합니다.
docker-compose 명령어는 프로젝트 기반으로 동작하기 때문에 yaml 파일이 있는 곳에서 실행해야 오류가 나지 않습니다.
docker-compose 명령어로 프로젝트를 생성하게 되면, 브릿지 네트워크가 기본적으로 생성됩니다.
브릿지 네트워크의 이름은 default로 생성되는데 현재 프로젝트에서는 필자가 프로젝트 명을 따로 지정하지 않았기 때문에 디렉토리 명을 사용하여 build_default로 생성되었습니다.
docker-compose 명령어로 프로젝트 생성 시, 사용자가 프로젝트 명을 따로 지정해주지 않으면 디렉토리 명을 사용해서 프로젝트가 생성됩니다.
Container의 경우 build-web-1, build-redis-1로 생성된것을 확인할 수 있는데 이에 대한 설명은 아래와 같습니다.
build-web-1 // 프로젝트 명 - 서비스 명 - 컨테이너 인덱스
// 컨테이너 인덱스는 해당 서비스상에서 컨테이너의 순서를 의미함
아래 명령어를 사용하여 다시 프로젝트를 실행한다.
// p 옵션 사용 : 프로젝트 명 변경 -d 옵션 사용 : 백그라운드에서 실행
# docker-compose -p docker-compose-test up -d
container가 정상적으로 구동되었다는 메시지가 확인되면 docker-compose ls 명령어를 통해 실행중인 프로젝트를 확인합니다.
docker-compose ls 명령어는 버전 2 이상부터 사용 가능한 명령어기 때문에 사용 전 해당 사항을 확인하시길 바랍니다.
# docker-compose ls
-a 옵션 사용 시 전체 프로젝트 확인이 가능합니다.
확인 시, 초반에 종료되었던 build 프로젝트와 새로 구동한 docker-compose-test 프로젝트가 모두 보이는 것을 확인할 수 있습니다.
# docker-compose ls -a
// 프로젝트 내 컨테이너 및 네트워크 종료 및 제거
# docker-compose down
// 프로젝트 내 컨테이너, 네트워크 및 볼륨 종료 및 제거
# docker-compose down -v
docker-compose 명령어 : 서비스 확장
docker-compose ls 명령어와 docker-compose ps 명령어를 통해 현재 실행되고 있는 프로젝트와 컨테이너를 확인합니다.
현재 docker-compose-test 프로젝트가 실행되어 있고,
2개의 컨테이너 docker-compose-test-redis-1, docker-compose-test-web-1가 실행되어 있음을 확인할 수 있습니다.
현재의 상태에서 web 서비스 컨테이너를 3개로 확장해보도록 하겠습니다.
# docker-compose -p docker-compose-test up --scale web=3 -d
해당 명령어 입력 시, web-1, web-2, web-3 컨테이너가 생성되고 실행되었다는 메시지를 확인할 수 있습니다.
docker-compose ps 명령어로 확인 시 web-1, web-2, web-3 컨테이너가 정상적으로 구동되고 있음을 확인할 수 있고, 포트의 경우 호스트에 따로 지정해주지 않았기 때문에 5000번 컨테이너 포트가 호스트의 각각 사용가능한 포트로 지정된 것도 확인할 수 있습니다.
docker-compose 명령어 : log 확인
프로젝트 내 서비스 로그를 확인할 수 있는 명령어입니다.
# docker-compose logs
// -f 옵션 사용 시 실시간으로 로그를 확인할 수 있습니다.
# docker-compose logs -f
docker-compose 명령어 : events 확인
프로젝트 내 컨테이너 이벤트를 확인할 수 있는 명령어입니다.
# docker-compose events
docker-compose 명령어 : image 확인
프로젝트 내 이미지 목록을 확인할 수 있는 명령어입니다.
# docker-compose images
docker-compose 명령어 : 컨테이너 확인
프로젝트 내 컨테이너 목록을 확인할 수 있는 명령어입니다.
# docker-compose ps
docker-compose 명령어 : 프로세스 확인
프로젝트 내 실행중인 프로세스 목록을 확인할 수 있는 명령어입니다.
# docker-compose top
docker-compose.yml 파일 예제
version: '3.9' // 버전 명시
services:
db:
image: mysql:5.7 // 실행시킬 컨테이너 이미지명과 태그를 지정 가능
volumes: // 볼륨마운트 옵션을 배열을 통해 여러개 지정할 수 있다.
- db:/var/lib/mysql // db 볼륨을 /var/lib/mysql 경로로 마운트 하겠다고 지정
restart: always // restart 옵션은 컨테이너의 재시작 전략을 지정. alway 옵션을 사용함으로써 컨테이너가
에러가 나도 계속적으로 재시작하도록 설정이 가능
environment: // 환경변수 전달 옵션 (배열을 통한 환경변수 지정방식 예시. - key=value 형식)
- MYSQL_ROOT_PASSWORD=wordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
networks: // 네트워크 옵션을 사용하여 연결할 네트워크를 지정할 수 있다. 단일, 여러개 모두 가능.
- wordpress
wordpress:
depends_on: // 컨테이너 실행할 순서를 지정할 수 있음. wordpress는 db서비스가 실행된 후에 실행되어야한다고 정의.
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment: // 환경변수 전달 옵션 (오브젝트 형식의 환경변수 지정방식 예시. key=column)
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
networks:
- wordpress
volumes: // volumes의 경우 따로 옵션을 지정해주지 않으면 defaults 값으로 생성된다. docker doc를
db: {} 참고하여 필요한 옵션을 넣어서 지정해서 설정이 가능하다.
networks: // networks의 경우 따로 옵션을 지정해주지 않으면 defaults 값으로 생성된다. docker doc를 참고하여
wordpress: {} 필요한 옵션을 넣어서 지정해서 설정이 가능하다.
해당 yml 파일에 작성되어있지 않은 옵션들은 docker doc 문서를 참고하시면 버전에 따라 더욱 다양한 옵션을 확인하실 수 있습니다.
https://docs.docker.com/compose/compose-file/compose-file-v3/#build
Compose file version 3 reference
Find a quick reference for Docker Compose version 3, including Docker Engine compatibility, memory limitations, and more.
docs.docker.com