도커 컴포즈(Docker Compose)란?
여러 개의 도커 컨테이너들을 하나의 서비스로 정의하고 구성해 하나의 묶음으로 관리할 수 있게 도와주는 툴이다.
도커 컴포즈를 사용하는 이유
- 여러 개의 컨테이너를 관리하기 용이하다.
- 규모가 크거나 구성이 복잡한 애플리케이션은 1개의 컨테이너만 사용하지 않는다.
- 여러 개의 컨테이너를 하나의 환경에서 실행하고 관리할 수 있게 해준다.
- 복잡한 명령어로 실행시키던 것을 축약해서 사용할 수 있다.
- 기존 :
docker run --name mysql_volume_test -e MYSQL_ROOT_PASSWORD=mysql_password -p 3306:3306 -d -v /mysql_volume:/var/lib/mysql mysql
- 축약 :
docker compose up
- 기존 :
환경설정 파일 만들기
도커 컴포즈를 사용하기 위해서는 compose.yml
이라는 환경설정 파일이 필요하다.
확장자가 .yml
인 것을 보면 알 수 있듯이 들여쓰기를 통해 구분한다.
우선 작성 예시를 확인해보자.
services:
compose_practice:
container_name: compose_nginx
image: nginx
ports:
- 80:80
작성한 compose.yml
을 보면 구성한 환경에 대한 정보를 알 수 있다.
services
- 도커 컴포즈에서는 하나의 컨테이너를
서비스(Service)
라고 부른다. - 그런 서비스 목록을 정의하는 옵션이다.
- 서비스명은 업무 규칙에 따라 자유롭게 작성하면 된다.
- 도커 컴포즈에서는 하나의 컨테이너를
container_name
- 컨테이너의 이름을 정의하는 옵션이다.
- 컨테이너명은 업무 규칙에 따라 자유롭게 작성하면 된다.
docker run
의--name
옵션과 동일하다.
image
- 해당 컨테이너에서 사용하는 이미지를 정의하는 옵션이다.
- 기본적으로는
이미지명:태그명
이지만 당연히 태그명을 생략해도 된다.
ports
- 포트 매핑을 어떻게 할 지 정의하는 옵션이다.
[호스트 포트 번호]:[컨테이너 포트 번호]
처럼 작성한다.docker run
의-p
옵션과 동일하다.
만약 위와 같이 실행했다면 아래의 명령어와 동일한 역할을 한다.
docker run --name compose_nginx -p 80:80 nginx
참고로 compose.yml
파일은 이전의 DockerFile
처럼 프로젝트 루트에 만들면 된다.
그 외의 옵션
docker run
에서 사용했던 옵션은 모두 정의할 수 있다.
environment
옵션을 통해 환경변수를 사용할 수 있고,
volumes
옵션을 통해서 도커 볼륨을 설정할 수도 있다.
services:
compose_practice:
container_name: compose_mysql
image: mysql
environment:
MYSQL_ROOT_PASSWORD: mysql_password
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
그리고 build
옵션을 통해 어떤 DockerFile
을 통해 이미지를 생성해서 컨테이너를 띄울지 정할 수 있다.
build
옵션의 값에는 경로를 작성하게 되는데,
이는 compose.yml
파일을 기준으로 DockerFile
이 어디에 있는 지에 대한 경로를 적어주면 된다.
services:
compose_practice:
build: .
ports:
- 8080:8080
서비스 생성하기
docker compose create
명령문을 실행하면 서비스를 생성할 수 있다.
docker ps -a
명령문과 docker compose ps -a
명령문을 통해서
컨테이너 및 서비스가 생성된 것을 확인할 수 있다.
서비스 시작하기
docker compose start
명령문을 실행하면 서비스를 시작할 수 있다.
docker ps
명령문과 docker compose ps
명령문을 통해서
컨테이너 및 서비스가 시작된 것을 확인할 수 있다.
서비스 생성 및 실행하기
CMD나 PowerShell을 통해 해당 프로젝트 경로로 들어가자.
그런 다음에 docker compose up
를 실행하면 된다.
이제 CMD 창을 하나 열어서 docker ps
를 통해 확인해보면
아까 compose.yml
파일을 통해서 정의한 compose_nginx
라는 이름의 컨테이너가 있는 것을 확인할 수 있다.
-d 옵션
docker run
에는 백그라운드에서 실행하기 위한 -d
옵션이 존재했다.
그런데 도커 컴포즈의 docker compose up
의 경우에는 포그라운드에서 실행하게 된다.
당연히 도커 컴포즈도 도커의 기술이기 때문에 백그라운드에서 실행하게 하는 방법이 있다.
docker run -d
처럼 -d
옵션을 추가해서
docker compose up -d
라고 명령문을 실행하게 되면
도커 컴포즈를 백그라운드에서 실행할 수 있다.
–build 옵션
docker compose up
명령문은 기본적으로 이미지가 없을 때만 빌드해서 컨테이너를 실행시킨다.
이미지가 이미 존재한다면 이미지를 다시 빌드하지 않고 컨테이너를 실행시킨다.
그런데 --build
옵션을 추가해서 docker compose up --build
처럼 실행한다면
이미지 유무에 상관없이 무조건 다시 이미지를 빌드해서 컨테이너를 실행시킨다.
found character that cannot start any token
분명 yml 파일을 맞게 작성했는데 위와 같은 문구가 발생하면서 동작하지 않는 경우가 있다.
그럴 때는 당황하지 말고 탭을 스페이스로 바꿔주자.
기본적으로 yaml
이나 yml
에서는 탭을 사용한 들여쓰기를 지원하지 않는다.
이런 경우를 대비하려면 최초에 IDE 설치 시 들여쓰기를 스페이스로 바꾸도록 하자.
docker compose run이라는 명령문은 없을까?
사실 도커에 컴포즈를 얹은 것 뿐이지 결국은 도커라서
당장 이전의 docker compose create
나 docker compose start
처럼
도커에서 사용하던 명령문도 있고 각 명령문 마다의 옵션도 다 존재한다.
그래서 당연히 docker compose run
이라는 명령문도 존재하고 옵션도 다 있다.
다만 그런 옵션을 다 쓸 거면 도커 컴포즈를 쓰는 이유가 없다.
-d
옵션처럼 compose.yml
에 쓸 수 없는 게 아니라면
그냥 어지간한건 compose.yml
에 쓰고 docker compose up
을 쓰자.
사실상 docker compose up
과 docker compose run
을 동일하다.
물론 이 둘이 실제로 완전히 동일하다는 뜻이 아니고
서비스를 생성하고 실행하는 것이 동일하다는 뜻이다.
서비스 조회하기
컨테이너를 확인할 때는 docker ps
명렁문을 사용했다.
그렇다면 도커 컴포즈의 서비스를 확인하는 방법은 없을까?
그럴 때는 docker compose ps
를 사용하면 된다.
다만 docker ps
와 동일하게 실행 중인 서비스에 대해서만 확인할 수 있다.
-a 옵션
docker ps
처럼 docker compose ps
에서도 -a
옵션을 사용하면
정지 상태의 서비스도 확인할 수 있다.
서비스 중지하기
docker compose stop
명령문을 실행하면 서비스를 정지 상태로 만든다.
서비스 삭제하기
docker compose rm 서비스명
명령문을 실행하면 서비스를 삭제할 수 있다.
정지되어 있는 서비스에 한해 가능하다.
docker rm
과 다르게 CLI에서 정말 지울 것인지 물어보는 컨펌 메시지가 나온다.
-f 옵션
docker compose rm
의 -f
옵션은 docker rm
과 그 역할이 다르다.
docker rm
에서는 -f
옵션을 추가했을 때 실행 중인 컨테이너도 삭제할 수 있게 해주는 옵션이었다.
하지만 docker compose rm
에서는 -f
옵션을 추가해도 실행 중인 서비스를 삭제하는 건 안 된다.
다만 정지되어 있는 서비스를 삭제할 때 컨펌 메시지 없이 바로 삭제가 가능하다.
서비스 중지 및 삭제하기
docker compose down
명령문을 사용하면 서비스를 정지 상태로 만드는 것과 동시에
해당 서비스에 속해있는 컨테이너들을 완전히 삭제한다.
서비스 로그 조회하기
도커에서는 docker logs
명령문을 통해 해당 컨테이너의 로그를 확인할 수 있었다.
이는 도커 컴포즈에서도 가능한데 그 구조가 다르다.
도커 컴포즈에서는 docker compose losg
를 통해 로그를 확인할 수 있다.
하지만 docker logs
와 다르게 docker compose logs
는
해당 서비스의 속하는 모든 컨테이너의 로그
를 모아서 출력한다.
이미지 다운로드
서비스라는 것은 결국 컨테이너의 집합체라서 이미지를 바꿔야할 때가 있다.
그럴 때는 docker compose pull
이라는 명령문을 실행하면 된다.
docker compose pull
을 실행하게 되면
로컬 환경에 이미지가 없다면 이미지를 다운로드 받고,
로컬환경에 이미지가 이미 있다면 도커 허브의 이미지와 다른 이미지라는 가정 하에
이미지를 업데이트를 시켜준다.
도커 CLI와 도커 컴포즈 쉽게 작성하기
도커 CLI로 작성 가능한 것은 compose.yml
로 작성할 수 있고,
compose.yml
로 작성할 수 있는 것은 도커 CLI로 작성할 수 있다.
다만 이를 항상 고려하면서 변환하는 것은 귀찮은 작업이기에
이런 작업을 대신 해주는 사이트가 존재한다.