docker stack config 명령을 사용하여 병합된 Compose 파일 검사 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker stack config 명령을 사용하여 Docker Compose 파일의 최종 병합된 구성을 검사하는 방법을 배우게 됩니다. 이는 여러 파일 또는 환경 변수를 다룰 때 특히 Docker 가 Compose 정의를 어떻게 해석하는지 이해하는 데 필수적인 기술입니다. 먼저 LabEx 환경에 Docker Compose 를 설치하는 데 필요한 단계를 포함하여 단일 Compose 파일의 구성을 출력하는 것으로 시작합니다.

그 후, 여러 Compose 파일에서 구성을 병합하고 출력하는 방법을 탐구하여 Docker 가 서로 다른 소스의 정의를 결합하는 방식을 보여줍니다. 또한 표준 입력에서 직접 구성을 출력하고 구성 출력을 생성할 때 환경 변수의 보간 (interpolation) 을 건너뛰는 방법도 배우게 됩니다. 이러한 단계는 Docker Compose 설정을 디버깅하고 검증하기 위한 docker stack config 명령의 기능을 포괄적으로 이해하는 데 도움이 될 것입니다.

단일 Compose 파일에서 최종 구성 출력하기

이 단계에서는 단일 Docker Compose 파일에서 최종 구성을 출력하는 방법을 배우게 됩니다. 이는 모든 변수와 확장이 처리된 후 Compose 파일의 최종 상태를 디버깅하거나 이해하는 데 유용합니다.

먼저 Docker Compose 를 설치해 보겠습니다. LabEx VM 환경에 미리 설치되어 있지 않으므로 다운로드하여 설치해야 합니다. 최신 안정 버전을 다운로드합니다.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

이 명령은 공식 GitHub 저장소에서 Docker Compose 바이너리를 다운로드합니다. $(uname -s)$(uname -m)은 VM 의 운영 체제와 아키텍처를 가져와 올바른 바이너리를 다운로드하도록 합니다.

다음으로, 다운로드한 바이너리에 실행 권한을 부여해야 합니다.

sudo chmod +x /usr/local/bin/docker-compose

이 명령은 docker-compose 명령을 실행 가능하게 만듭니다.

이제 버전을 확인하여 설치를 확인해 보겠습니다.

docker-compose --version

설치된 Docker Compose 의 버전이 콘솔에 출력되는 것을 볼 수 있습니다.

구성을 출력하기 전에 Docker Compose 파일이 필요합니다. ~/project 디렉토리에 간단한 파일을 만들어 보겠습니다.

nano ~/project/docker-compose.yaml

다음 내용을 docker-compose.yaml 파일에 붙여넣습니다.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

이것은 nginx:latest 이미지를 사용하고 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑하는 web이라는 단일 서비스를 정의하는 간단한 Compose 파일입니다.

Ctrl + X, Y, Enter를 눌러 파일을 저장합니다.

이제 docker-compose.yaml 파일을 저장한 ~/project 디렉토리로 이동합니다.

cd ~/project

이 Compose 파일에서 최종 구성을 출력하려면 docker-compose config 명령을 사용합니다.

docker-compose config

이 명령은 현재 디렉토리의 docker-compose.yaml 파일을 읽고 최종 병합된 구성을 표준 출력으로 출력합니다. docker-compose.yaml 파일의 YAML 내용이 출력되는 것을 볼 수 있으며, Docker Compose 에서 추가한 몇 가지 기본값이 포함될 수 있습니다.

여러 Compose 파일에서 구성 병합 및 출력

이 단계에서는 여러 Docker Compose 파일에서 구성을 병합하고 최종 결합된 구성을 출력하는 방법을 배우게 됩니다. 이는 기본 구성을 정의한 다음 추가 파일로 재정의하거나 확장할 수 있는 강력한 기능으로, 서로 다른 환경 (예: 개발, 스테이징, 프로덕션) 을 관리하는 데 유용합니다.

~/project 디렉토리에서 계속 작업합니다. 이전 단계에서 docker-compose.yaml 파일을 만들었습니다. 이제 기본 구성을 확장하기 위해 다른 Compose 파일을 만들어 보겠습니다. 이름을 docker-compose.override.yaml로 지정합니다.

nano ~/project/docker-compose.override.yaml

다음 내용을 docker-compose.override.yaml 파일에 붙여넣습니다.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html

이 재정의 파일은 docker-compose.yaml에 정의된 web 서비스를 수정합니다. 호스트 포트 매핑을 80 에서 8080 으로 변경하고 html이라는 로컬 디렉토리에서 정적 HTML 콘텐츠를 제공하기 위해 볼륨 마운트를 추가합니다.

Ctrl + X, Y, Enter를 눌러 파일을 저장합니다.

이제 html 디렉토리와 그 안에 간단한 index.html 파일을 만들어 보겠습니다.

mkdir ~/project/html
nano ~/project/html/index.html

다음 내용을 ~/project/html/index.html에 붙여넣습니다.

<h1>Hello from Nginx!</h1>

Ctrl + X, Y, Enter를 눌러 파일을 저장합니다.

기본적으로 Docker Compose 는 현재 디렉토리에서 docker-compose.yamldocker-compose.override.yaml을 자동으로 찾아 병합합니다. 재정의 파일의 구성이 우선합니다.

병합된 구성을 보려면 ~/project 디렉토리에 있는지 확인하고 docker-compose config 명령을 다시 실행합니다.

cd ~/project
docker-compose config

이제 web 서비스에 포트 매핑 8080:80과 볼륨 마운트 ./html:/usr/share/nginx/html이 있는 결합된 구성을 볼 수 있습니다.

-f 플래그를 사용하여 사용할 Compose 파일을 명시적으로 지정할 수도 있습니다. 파일을 지정하는 순서가 중요하며, 이후 파일이 이전 파일을 재정의합니다.

예를 들어, docker-compose.yamldocker-compose.override.yaml을 명시적으로 병합하려면 다음을 실행할 수 있습니다.

docker-compose -f docker-compose.yaml -f docker-compose.override.yaml config

이 경우 docker-compose.override.yamldocker-compose.yaml 다음에 자동으로 감지되고 병합되므로, 이는 -f 플래그 없이 docker-compose config를 실행하는 것과 동일한 병합된 출력을 생성합니다.

stdin 에서 구성 출력

이 단계에서는 표준 입력 (stdin) 을 통해 제공된 Docker Compose 파일에서 최종 구성을 출력하는 방법을 배우게 됩니다. 이는 Compose 파일을 동적으로 생성하거나 다른 명령의 출력을 docker-compose config로 직접 파이프하려는 경우에 유용합니다.

~/project 디렉토리에서 계속 작업합니다. 파일에서 읽는 대신, Compose 구성의 내용을 docker-compose config 명령으로 직접 파이프합니다.

cat 명령을 사용하여 docker-compose.yaml 파일의 내용을 출력하고 이를 docker-compose config로 파이프해 보겠습니다.

cd ~/project
cat docker-compose.yaml | docker-compose config -f -

이 명령에서:

  • cat docker-compose.yamldocker-compose.yaml 파일의 내용을 표준 출력으로 출력합니다.
  • |는 파이프 연산자이며, cat 명령의 표준 출력을 docker-compose config 명령의 표준 입력으로 리디렉션합니다.
  • docker-compose config -f -docker-compose config에 파일 대신 표준 입력 (-) 에서 구성을 읽도록 지시합니다.

첫 번째 단계에서 docker-compose config를 실행했을 때와 동일한 출력을 볼 수 있습니다. 즉, docker-compose.yaml의 구성입니다.

다른 구성을 직접 파이프할 수도 있습니다. 예를 들어, redis 서비스에 대한 간단한 구성을 파이프해 보겠습니다.

echo "version: '3.8'\nservices:\n  redis:\n    image: redis:latest" | docker-compose config -f -

이 명령에서:

  • echo "version: '3.8'\nservices:\n redis:\n image: redis:latest"redis 서비스가 있는 간단한 Compose 파일에 대한 YAML 문자열을 출력합니다. \n은 출력에 새 줄을 만듭니다.
  • |는 이 문자열을 docker-compose config 명령으로 파이프합니다.
  • docker-compose config -f -는 표준 입력에서 구성을 읽습니다.

출력은 redis 서비스에 대한 YAML 구성이어야 합니다.

이 방법은 Compose 구성을 프로그래밍 방식으로 생성하거나 파일을 저장하지 않고 구성을 빠르게 테스트하려는 경우 특히 유용합니다.

변수 보간 없이 병합된 구성 출력

이 단계에서는 변수 보간을 건너뛰면서 여러 Docker Compose 파일에서 병합된 구성을 출력하는 방법을 배우게 됩니다. 기본적으로 docker-compose config는 환경 변수를 보간합니다. 보간을 건너뛰는 것은 디버깅하거나 템플릿을 생성하는 경우와 같이 변수가 여전히 존재하는 원시 구성을 보려는 경우에 유용할 수 있습니다.

~/project 디렉토리에서 docker-compose.yamldocker-compose.override.yaml 파일을 사용하여 계속 작업합니다.

먼저, 보간을 시연하기 위해 환경 변수를 docker-compose.yaml 파일에 추가해 보겠습니다.

nano ~/project/docker-compose.yaml

docker-compose.yaml 파일을 수정하여 이미지 이름에 환경 변수를 포함합니다.

version: "3.8"
services:
  web:
    image: nginx:${NGINX_VERSION:-latest}
    ports:
      - "80:80"

여기서 ${NGINX_VERSION:-latest}NGINX_VERSION 환경 변수의 값으로 대체될 변수입니다. NGINX_VERSION이 설정되지 않은 경우 기본값은 latest입니다.

Ctrl + X, Y, Enter를 눌러 파일을 저장합니다.

이제 NGINX_VERSION 환경 변수를 설정한 다음 docker-compose config를 실행하여 보간이 작동하는 것을 확인해 보겠습니다.

cd ~/project
export NGINX_VERSION=1.21
docker-compose config

병합된 구성을 볼 수 있으며, web 서비스의 이미지 이름은 이제 nginx:1.21이어야 합니다.

변수를 보간하지 않고 병합된 구성을 출력하려면 docker-compose config 명령과 함께 --no-interpolate 플래그를 사용합니다.

docker-compose --no-interpolate config

이번에는 NGINX_VERSION 환경 변수가 설정되어 있더라도 출력에 이미지 이름이 nginx:${NGINX_VERSION:-latest}로 표시되어 변수 자리 표시자가 여전히 존재합니다.

이 플래그는 변수 대체가 발생하기 전에 Compose 파일에 작성된 정확한 구성을 보려는 경우에 유용합니다.

요약

이 랩에서는 docker-compose config 명령을 사용하여 Docker Compose 파일의 최종 구성을 검사하는 방법을 배웠습니다. LabEx VM 환경에서 Docker Compose 를 설치하는 것으로 시작하여 시스템 아키텍처에 맞는 올바른 바이너리를 다운로드하고 실행 권한을 부여했는지 확인했습니다. 그런 다음 버전을 확인하여 설치를 확인했습니다.

설치 후, 기본적인 웹 서비스를 정의하는 간단한 docker-compose.yaml 파일을 만들었습니다. 그런 다음 docker-compose config 명령을 사용하여 이 단일 Compose 파일에서 최종 구성을 출력하여 Compose 정의의 처리된 상태를 보는 방법을 시연했습니다.