도커 컴포즈 (Docker Compose)
포스트
취소

도커 컴포즈 (Docker Compose)

도커 컴포즈(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 createdocker compose start처럼
도커에서 사용하던 명령문도 있고 각 명령문 마다의 옵션도 다 존재한다.
그래서 당연히 docker compose run이라는 명령문도 존재하고 옵션도 다 있다.

다만 그런 옵션을 다 쓸 거면 도커 컴포즈를 쓰는 이유가 없다.
-d 옵션처럼 compose.yml에 쓸 수 없는 게 아니라면
그냥 어지간한건 compose.yml에 쓰고 docker compose up을 쓰자.

사실상 docker compose updocker 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로 작성할 수 있다.
다만 이를 항상 고려하면서 변환하는 것은 귀찮은 작업이기에
이런 작업을 대신 해주는 사이트가 존재한다.

도커 CLI → compose.yml

Composerize

compose.yml → 도커 CLI

Decomposerize

출처

비전공자도 이해할 수 있는 Docker 입문/실전

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

도커 파일 (DockerFile)

도커 컴포즈를 활용한 복수의 컨테이너 관리하기