docker compose alpha publish 명령을 사용하여 Compose 애플리케이션 게시하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker compose alpha publish 명령을 사용하여 Docker Compose 애플리케이션을 게시하는 방법을 배우게 됩니다. 먼저 docker-compose.yaml 파일을 사용하여 간단한 멀티 컨테이너 애플리케이션을 준비하는 것으로 시작합니다.

준비가 완료되면, 해결된 이미지 다이제스트 (image digest) 로 게시하고, 게시된 아티팩트 (artifact) 에 환경 변수를 포함하는 등, 애플리케이션을 리포지토리 (repository) 에 게시하는 다양한 방법을 탐색할 것입니다. 이 실습을 통해 Compose 애플리케이션을 패키징하고 공유하는 과정을 안내받을 수 있습니다.

간단한 Docker Compose 애플리케이션 준비

이 단계에서는 간단한 Docker Compose 애플리케이션을 준비합니다. Docker Compose 는 멀티 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다. Compose 를 사용하면 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음, 단일 명령으로 구성에서 모든 서비스를 생성하고 시작합니다.

먼저 Docker Compose 를 설치해야 합니다. LabEx 환경에 미리 설치되어 있지 않으므로, 바이너리를 다운로드하여 실행 가능하게 만들 것입니다.

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
sudo chmod +x /usr/local/bin/docker-compose

다운로드하여 실행 가능하게 만든 후, 버전을 확인하여 설치를 확인합니다.

docker-compose --version

Docker Compose version v2.20.2와 유사한 출력을 볼 수 있습니다.

이제 간단한 Docker Compose 애플리케이션을 만들어 보겠습니다. ~/project 디렉토리에 docker-compose.yaml 파일을 생성합니다. 이 파일은 Nginx 웹 서버를 실행하는 단일 서비스를 정의합니다.

nano 편집기를 사용하여 파일을 생성하고 편집합니다.

nano ~/project/docker-compose.yaml

docker-compose.yaml 파일에 다음 내용을 추가합니다.

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

docker-compose.yaml 파일에서:

  • version: '3.8'은 Compose 파일 형식 버전을 지정합니다.
  • services:는 애플리케이션의 서비스를 정의합니다.
  • web:은 서비스의 이름입니다.
  • image: nginx:latest는 이 서비스에 사용할 Docker 이미지를 지정합니다. 공식 Nginx 이미지의 최신 버전을 사용하고 있습니다.
  • ports:는 호스트 머신의 포트를 컨테이너에 매핑합니다. "80:80"은 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑합니다.

Ctrl + S를 눌러 파일을 저장하고, Ctrl + X를 눌러 편집기를 종료합니다.

애플리케이션을 실행하기 전에 nginx:latest 이미지를 pull 해야 합니다.

docker pull nginx:latest

이제 docker-compose up 명령을 사용하여 애플리케이션을 시작할 수 있습니다. -d 플래그는 컨테이너를 detached 모드 (백그라운드) 에서 실행합니다.

docker-compose up -d

서비스가 생성되고 시작되고 있음을 나타내는 출력을 볼 수 있습니다.

컨테이너가 실행 중인지 확인하려면 docker ps 명령을 사용합니다.

docker ps

nginx 이미지와 Up 상태의 web 서비스에 대한 항목을 볼 수 있습니다.

마지막으로, Nginx 서버에 액세스하여 테스트할 수 있습니다. 컨테이너의 포트 80 이 호스트의 포트 80 에 매핑되므로 curl을 사용하여 localhost에 액세스할 수 있습니다.

curl localhost

기본 Nginx 환영 페이지 HTML 출력을 볼 수 있습니다.

Compose 애플리케이션을 레포지토리 (repository) 에 게시

이 단계에서는 Docker Compose 애플리케이션을 리포지토리에 게시하는 방법을 배우게 됩니다. Compose 애플리케이션을 게시하는 것은 일반적으로 docker-compose.yaml 파일을 공유하고, 필요한 Docker 이미지가 컨테이너 레지스트리 (container registry) 에서 접근 가능하도록 하는 것을 포함합니다.

먼저, 이전 단계에서 실행 중인 Docker Compose 애플리케이션을 중지해 보겠습니다. 아직 ~/project 디렉토리에 있지 않다면 해당 디렉토리로 이동합니다.

cd ~/project

이제 docker-compose down 명령을 사용하여 실행 중인 서비스를 중지합니다. 이 명령은 up으로 생성된 컨테이너, 네트워크 및 볼륨을 중지하고 제거합니다.

docker-compose down

서비스가 중지되고 제거되고 있음을 나타내는 출력을 볼 수 있습니다.

Compose 애플리케이션을 게시하려면 docker-compose.yaml 파일을 공유해야 합니다. 실제 시나리오에서는 일반적으로 이 파일을 Git 과 같은 버전 관리 시스템에 저장하고 리포지토리 (예: GitHub, GitLab, Bitbucket) 에 푸시합니다.

이 랩에서는 docker-compose.yaml 파일의 내용을 포함하는 간단한 텍스트 파일을 생성하여 게시를 시뮬레이션합니다. 이는 구성을 공유하는 핵심 아이디어를 보여줍니다.

~/project 디렉토리에 compose_app.txt라는 파일을 생성하고 docker-compose.yaml의 내용을 복사해 보겠습니다.

cat ~/project/docker-compose.yaml > ~/project/compose_app.txt

이제 새 파일의 내용을 확인하여 docker-compose.yaml과 동일한지 확인할 수 있습니다.

cat ~/project/compose_app.txt

Compose 파일의 YAML 내용을 볼 수 있습니다.

실제 게시 시나리오에서는 docker-compose.yaml 파일에서 참조하는 Docker 이미지가 다른 사용자가 접근할 수 있는 컨테이너 레지스트리에 있는지 확인해야 합니다. 이 경우, nginx:latest 이미지는 Docker Hub 에서 공개적으로 사용할 수 있으므로 이 특정 이미지에 대한 추가 단계는 필요하지 않습니다. 사용자 지정 이미지를 사용하는 경우, 해당 이미지를 빌드하여 레지스트리에 푸시해야 합니다.

예를 들어, my-custom-app이라는 사용자 지정 이미지가 있는 경우, docker build를 사용하여 빌드한 다음 docker push your-dockerhub-username/my-custom-app를 사용하여 Docker Hub 와 같은 레지스트리에 푸시합니다.

Compose 파일을 공유하는 것을 시뮬레이션하기 위해, compose_app.txt 파일을 누군가와 공유한다고 가정해 보겠습니다. 그러면 그들은 이 파일을 다운로드하여 Docker 와 Docker Compose 가 설치되어 있고 필요한 이미지에 접근할 수 있는 경우, 자신의 머신에서 애플리케이션을 실행하는 데 사용할 수 있습니다.

이를 시연하기 위해, 원래의 docker-compose.yaml 파일을 제거한 다음 compose_app.txt에서 다시 생성해 보겠습니다.

rm ~/project/docker-compose.yaml
cat ~/project/compose_app.txt > ~/project/docker-compose.yaml

이제 docker-compose.yaml 파일이 다시 생성되었는지 확인할 수 있습니다.

cat ~/project/docker-compose.yaml

이전과 동일한 YAML 내용을 볼 수 있습니다.

이 단계에서는 Compose 파일을 공유하는 개념에 중점을 두었습니다. 다음 단계에서는 이미지 다이제스트 (image digests) 사용 및 환경 변수 처리와 같은 게시의 보다 고급 측면을 탐색할 것입니다.

이미지 다이제스트 (digest) 를 포함하여 Compose 애플리케이션 게시

이 단계에서는 해결된 이미지 다이제스트를 사용하여 Compose 애플리케이션을 게시하는 방법을 배우게 됩니다. 태그 (예: latest) 대신 이미지 다이제스트를 사용하면 항상 동일한 이미지 버전을 사용하도록 보장하는 보다 신뢰할 수 있는 방법을 제공합니다. 태그는 새 이미지를 가리키도록 업데이트될 수 있지만, 다이제스트는 특정 이미지 레이어를 고유하게 식별합니다.

먼저, 이전 단계에서 사용한 nginx:latest 이미지의 다이제스트를 얻어보겠습니다. docker inspect 명령을 사용하여 이미지에 대한 자세한 정보를 얻을 수 있습니다.

docker inspect nginx:latest --format='{{.RepoDigests}}'

이 명령은 nginx:latest 이미지에 대한 리포지토리 다이제스트를 출력합니다. 출력은 [nginx@sha256:...]와 유사합니다. @ 뒤의 부분이 이미지 다이제스트입니다. 이 다이제스트를 복사합니다.

이제 docker-compose.yaml 파일을 수정하여 태그 대신 이미지 다이제스트를 사용하도록 하겠습니다. nano를 사용하여 ~/project 디렉토리에서 docker-compose.yaml 파일을 엽니다.

nano ~/project/docker-compose.yaml

image 줄을 image: nginx:latest에서 image: nginx@<your_image_digest>로 변경하고, <your_image_digest>를 복사한 다이제스트로 바꿉니다. 예를 들어, 다이제스트가 sha256:abcdef123456...인 경우, 해당 줄은 image: nginx@sha256:abcdef123456...가 됩니다.

version: "3.8"
services:
  web:
    image: nginx@sha256:your_image_digest_here
    ports:
      - "80:80"

Ctrl + S를 눌러 파일을 저장하고, Ctrl + X를 눌러 편집기를 종료합니다.

이제 이 docker-compose.yaml 파일을 공유하면, 이를 사용하는 모든 사람은 latest 태그가 현재 가리키는 것과 관계없이 다이제스트로 식별된 정확한 이미지를 pull 하게 됩니다.

Compose 가 다이제스트를 사용한다는 것을 보여주기 위해, 수정된 docker-compose.yaml을 사용하여 애플리케이션을 다시 실행해 보겠습니다.

docker-compose up -d

Compose 는 다이제스트로 지정된 이미지를 사용합니다. 이미지가 시스템에 아직 없는 경우, pull 됩니다.

실행 중인 컨테이너를 검사하여 컨테이너가 실행 중이고 다이제스트로 지정된 이미지를 사용하고 있는지 확인할 수 있습니다. 먼저, docker ps를 사용하여 컨테이너 ID 를 찾습니다.

docker ps

nginx 이미지를 실행하는 컨테이너를 찾고 해당 컨테이너 ID 를 기록합니다. 그런 다음, 컨테이너 ID 와 함께 docker inspect를 사용하고 출력을 형식화하여 이미지 다이제스트를 표시합니다.

docker inspect < container_id > --format='{{.Image}}'

<container_id>를 실행 중인 Nginx 컨테이너의 실제 ID 로 바꿉니다. 출력은 docker-compose.yaml 파일에서 지정한 이미지 다이제스트여야 합니다.

Compose 파일에서 이미지 다이제스트를 사용하는 것은 재현성을 보장하고 이미지 업데이트로 인해 애플리케이션에 예기치 않은 변경이 발생하는 것을 방지하는 좋은 방법입니다.

환경 변수를 포함하여 Compose 애플리케이션 게시

이 단계에서는 Docker Compose 애플리케이션에 환경 변수를 포함하는 방법과 이것이 게시에 미치는 영향을 배우게 됩니다. 환경 변수는 애플리케이션을 구성하는 일반적인 방법이며, Docker Compose 는 이를 관리하는 여러 가지 방법을 제공합니다.

먼저, 이전 단계에서 실행 중인 Nginx 컨테이너를 중지해 보겠습니다. 아직 ~/project 디렉토리에 있지 않다면 해당 디렉토리로 이동합니다.

cd ~/project

docker-compose down 명령을 사용하여 실행 중인 서비스를 중지합니다.

docker-compose down

이제 환경 변수를 사용하도록 docker-compose.yaml 파일을 수정해 보겠습니다. web 서비스에 간단한 환경 변수를 추가할 것입니다. nano를 사용하여 ~/project 디렉토리에서 docker-compose.yaml 파일을 엽니다.

nano ~/project/docker-compose.yaml

web 서비스 정의에 environment 섹션을 추가합니다. MY_VARIABLE이라는 변수를 값과 함께 추가합니다.

version: "3.8"
services:
  web:
    image: nginx@sha256:your_image_digest_here ## 실제 다이제스트로 교체
    ports:
      - "80:80"
    environment:
      - MY_VARIABLE=HelloFromCompose

your_image_digest_here를 이전 단계에서 얻은 실제 이미지 다이제스트로 바꾸는 것을 잊지 마십시오.

Ctrl + S를 눌러 파일을 저장하고, Ctrl + X를 눌러 편집기를 종료합니다.

이제 docker-compose up으로 애플리케이션을 시작하면 MY_VARIABLE 환경 변수가 Nginx 컨테이너 내부에 설정됩니다.

docker-compose up -d

환경 변수가 컨테이너 내부에 설정되었는지 확인하기 위해, docker exec를 사용하여 실행 중인 컨테이너 내부에서 명령을 실행할 수 있습니다. 먼저, docker ps를 사용하여 컨테이너 ID 를 찾습니다.

docker ps

실행 중인 Nginx 컨테이너의 컨테이너 ID 를 기록합니다. 그런 다음, docker exec를 사용하여 컨테이너 내부에서 printenv 명령을 실행하고 MY_VARIABLE에 대한 출력을 필터링합니다.

docker exec < container_id > printenv | grep MY_VARIABLE

<container_id>를 실행 중인 Nginx 컨테이너의 실제 ID 로 바꿉니다. MY_VARIABLE=HelloFromCompose와 유사한 출력을 볼 수 있습니다.

환경 변수를 사용하는 Compose 애플리케이션을 게시할 때는 대상 환경에서 이러한 변수를 어떻게 제공할지 고려해야 합니다.

일반적인 접근 방식 중 하나는 .env 파일을 사용하는 것입니다. Docker Compose 는 docker-compose.yaml 파일이 있는 디렉토리에서 .env라는 파일을 자동으로 찾습니다. 이 파일에서 환경 변수를 정의할 수 있으며, Compose 는 이를 로드합니다.

~/project 디렉토리에 .env 파일을 생성해 보겠습니다.

nano ~/project/.env

.env 파일에 다음 내용을 추가합니다.

ANOTHER_VARIABLE=ThisIsFromDotEnv

파일을 저장하고 nano를 종료합니다.

이제 이 새로운 환경 변수를 사용하도록 docker-compose.yaml 파일을 수정해 보겠습니다. docker-compose.yaml 파일을 다시 엽니다.

nano ~/project/docker-compose.yaml

ANOTHER_VARIABLEenvironment 섹션에 추가합니다.

version: "3.8"
services:
  web:
    image: nginx@sha256:your_image_digest_here ## 실제 다이제스트로 교체
    ports:
      - "80:80"
    environment:
      - MY_VARIABLE=HelloFromCompose
      - ANOTHER_VARIABLE

ANOTHER_VARIABLE의 경우, 변수 이름만 나열했음을 알 수 있습니다. Compose 는 .env 파일에서 로드된 변수를 포함하여 docker-compose up이 실행되는 환경에서 이 변수를 찾습니다.

파일을 저장하고 nano를 종료합니다.

이제 Compose 애플리케이션을 중지하고 다시 시작하여 변경 사항을 적용합니다.

docker-compose down
docker-compose up -d

docker ps를 사용하여 새 컨테이너 ID 를 가져옵니다.

docker ps

이제 docker exec를 사용하여 컨테이너 내부에서 두 환경 변수를 모두 확인합니다.

docker exec < container_id > printenv | grep MY_VARIABLE
docker exec < container_id > printenv | grep ANOTHER_VARIABLE

<container_id>를 새 컨테이너 ID 로 바꿉니다. 출력에서 MY_VARIABLE=HelloFromComposeANOTHER_VARIABLE=ThisIsFromDotEnv를 모두 볼 수 있습니다.

게시할 때는 일반적으로 docker-compose.yaml 파일을 공유하고, .env 파일을 통해 또는 Compose 가 실행되는 환경에서 직접 설정하여 필요한 환경 변수를 설정하는 방법에 대한 지침을 제공합니다. 민감한 정보는 docker-compose.yaml 또는 .env 파일에 하드코딩해서는 안 되며, 보안 관리 솔루션을 사용하여 관리해야 합니다.

요약

이 랩에서는 간단한 Docker Compose 애플리케이션을 준비하는 방법을 배웠습니다. 여기에는 Docker Compose 설치, 설치 확인, 기본 Nginx 웹 서비스를 정의하기 위한 docker-compose.yaml 파일 생성이 포함되었습니다. 또한 애플리케이션 실행을 준비하기 위해 필요한 Docker 이미지 (nginx:latest) 를 pull 했습니다.

제공된 내용에서 자세히 설명되지 않은 후속 단계에서는 docker compose alpha publish 명령을 사용하여 이 Compose 애플리케이션을 레포지토리 (repository) 에 게시하는 방법을 다룰 것입니다. 여기에는 해결된 이미지 다이제스트 (image digests) 로 게시하고 게시된 애플리케이션 정의에 환경 변수를 포함하는 것과 같은 옵션을 탐색하는 것이 포함됩니다.