소개
이 랩에서는 docker-compose alpha viz 명령을 사용하여 Docker Compose 파일을 효과적으로 시각화하는 방법을 배우게 됩니다. 이 실습을 통해 서비스들을 나타내는 기본적인 그래프를 생성하는 방법을 배우고, 서비스 이미지, 네트워크 및 포트를 포함하여 이러한 시각화를 점진적으로 향상시킬 것입니다. 또한, 가독성을 높이기 위해 출력 그래프의 들여쓰기를 사용자 정의하는 방법도 배우게 됩니다.
이 랩을 마치면, Docker Compose 구성을 명확하고 유익하게 시각적으로 표현하여, 다중 컨테이너 애플리케이션 내의 관계와 종속성을 더 쉽게 이해할 수 있게 될 것입니다.
compose 파일에서 기본 그래프 생성
이 단계에서는 Docker Compose 파일의 기본 그래프 표현을 생성하는 방법을 배우게 됩니다. 이는 서비스, 네트워크 및 볼륨 간의 관계를 시각화하는 데 유용합니다.
먼저, Docker Compose 를 설치해야 합니다. LabEx 환경에는 미리 설치되어 있지 않으므로 pip를 사용하여 설치합니다.
sudo apt update
sudo apt install -y python3-pip
pip install docker-compose
설치가 완료되면 Docker Compose 의 버전을 확인하여 설치를 확인할 수 있습니다.
docker-compose --version
docker-compose version 1.29.2, build 5becea4c와 유사한 출력을 볼 수 있습니다.
이제 간단한 Docker Compose 파일을 만들어 보겠습니다. 프로젝트 디렉토리로 이동하여 docker-compose.yml이라는 파일을 생성합니다.
cd ~/project
nano docker-compose.yml
다음 내용을 docker-compose.yml 파일에 추가합니다.
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
image: ubuntu:latest
command: sleep infinity
이 docker-compose.yml 파일은 nginx:latest 이미지를 사용하는 web 서비스와 ubuntu:latest 이미지를 사용하는 app 서비스, 두 개의 서비스를 정의합니다. web 서비스는 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑합니다. app 서비스는 컨테이너를 계속 실행하기 위해 단순히 sleep infinity 명령을 실행합니다.
이 compose 파일에서 기본 그래프를 생성하려면 --graph 플래그와 함께 docker-compose config 명령을 사용합니다. 이 명령은 compose 파일을 구문 분석하고 DOT 형식으로 그래프 표현을 출력합니다.
docker-compose config --graph
출력은 그래프 설명 언어인 DOT 언어로 표시됩니다. 서비스와 기본 연결을 보여줍니다. 예를 들어 다음과 같은 내용을 볼 수 있습니다.
digraph {
compound=true
"web" [label="web"]
"app" [label="app"]
"web" -> "app" [label="depends_on"]
}
이 DOT 출력은 web과 app이 노드이고 "depends_on" 레이블이 지정된 web에서 app으로의 방향성 엣지가 있는 방향성 그래프를 나타냅니다. 이 간단한 예제는 종속성을 명시적으로 정의하지 않지만, docker-compose config --graph는 일부 관계를 추론할 수 있습니다.
그래프에 서비스 이미지 포함
이 단계에서는 생성된 그래프에 서비스 이미지를 포함하는 방법을 배우게 됩니다. 기본적으로 기본 그래프는 서비스 이름만 표시합니다. 이미지 이름을 포함하면 각 서비스가 무엇을 나타내는지에 대한 더 많은 컨텍스트를 제공합니다.
이전 단계에서 생성한 docker-compose.yml 파일을 계속 사용합니다.
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
image: ubuntu:latest
command: sleep infinity
그래프 출력에 서비스 이미지를 포함하려면 docker-compose config --graph 명령과 함께 --images 플래그를 사용해야 합니다.
docker-compose config --graph --images
이 명령을 실행하면 DOT 그래프 출력이 생성되지만, 이번에는 서비스를 나타내는 노드에 이미지 이름도 포함됩니다. 출력은 이전 단계와 유사하지만 노드 정의 내에 추가 정보가 포함됩니다.
예를 들어, 이제 출력은 다음과 같이 보일 수 있습니다.
digraph {
compound=true
"web" [label="web\nnginx:latest"]
"app" [label="app\nubuntu:latest"]
"web" -> "app" [label="depends_on"]
}
각 노드의 label 속성에는 서비스 이름과 이미지 이름이 모두 포함되어 있으며, 줄 바꿈 문자 (\n) 로 구분되어 있습니다. 이렇게 하면 각 서비스에 어떤 Docker 이미지가 사용되는지 보여줌으로써 그래프의 정보를 더 풍부하게 만들 수 있습니다.
이는 Docker Compose 그래프 시각화에 더 많은 세부 정보를 추가하여 애플리케이션의 구성 요소를 한눈에 파악하는 데 도움이 되는 간단한 방법입니다.
그래프에 서비스 네트워크 포함
이 단계에서는 생성된 그래프에 서비스가 연결된 네트워크를 포함하는 방법을 배우게 됩니다. 네트워크 토폴로지를 이해하는 것은 컨테이너 간의 통신 흐름을 디버깅하고 시각화하는 데 매우 중요합니다.
docker-compose.yml 파일을 수정하여 네트워크를 명시적으로 정의하고 서비스가 연결되도록 합니다.
프로젝트 디렉토리에서 docker-compose.yml 파일을 엽니다.
nano ~/project/docker-compose.yml
네트워크 정의를 포함하고 서비스를 이 네트워크에 연결하도록 내용을 수정합니다.
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- my_network
app:
image: ubuntu:latest
command: sleep infinity
networks:
- my_network
networks:
my_network:
driver: bridge
이 업데이트된 docker-compose.yml에서 최상위 수준에 networks 섹션을 추가하여 bridge 드라이버를 사용하여 my_network라는 네트워크를 정의했습니다. 또한 각 서비스 (web 및 app) 아래에 networks 키를 추가하여 my_network에 연결해야 함을 지정했습니다.
이제 그래프 출력에 네트워크 정보를 포함하려면 --graph 플래그와 함께 --networks 플래그를 사용합니다.
docker-compose config --graph --networks
이 명령을 실행하면 DOT 그래프 출력이 생성되며, 이제 네트워크를 나타내는 노드와 어떤 서비스가 연결되어 있는지 보여주는 엣지가 포함됩니다. 출력은 이전보다 더 복잡해져 네트워크 연결을 보여줍니다.
서비스 (web 및 app) 에 대한 노드와 네트워크 (my_network) 에 대한 노드가 표시됩니다. 서비스와 네트워크를 연결하는 엣지가 있어 해당 네트워크의 멤버십을 나타냅니다. 이 시각화는 서비스가 네트워크 수준에서 어떻게 격리되거나 연결되는지 확인하는 데 도움이 됩니다.
그래프에 서비스 포트 포함
이 단계에서는 생성된 그래프에 서비스의 노출 및 게시된 포트를 포함하는 방법을 배우게 됩니다. 포트를 시각화하면 서비스가 Docker 네트워크 외부 또는 다른 서비스에서 어떻게 액세스 가능한지 이해하는 데 도움이 됩니다.
이전 단계의 docker-compose.yml 파일을 계속 사용합니다.
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- my_network
app:
image: ubuntu:latest
command: sleep infinity
networks:
- my_network
networks:
my_network:
driver: bridge
그래프 출력에 서비스 포트를 포함하려면 --graph 플래그와 함께 --ports 플래그를 사용합니다. 그래프에 다양한 유형의 정보를 포함하기 위해 여러 플래그를 결합할 수 있습니다. 이미지, 네트워크 및 포트를 그래프에 포함해 보겠습니다.
docker-compose config --graph --images --networks --ports
이 명령을 실행하면 DOT 그래프 출력이 생성되며, 이제 각 서비스의 포트에 대한 정보가 포함됩니다. 출력은 훨씬 더 자세해져 서비스 이름, 이미지 이름, 네트워크 연결 및 포트 매핑을 표시합니다.
web 서비스의 경우 노드 정의에 포트 매핑 80:80이 포함된 것을 볼 수 있습니다. 이는 호스트의 포트 80 이 web 컨테이너 내부의 포트 80 에 매핑되었음을 나타냅니다.
web 서비스 노드에 대한 DOT 출력은 다음과 같이 보일 수 있습니다.
"web" [label="web\nnginx:latest\n80:80"]
그래프에 포트를 포함하면 서비스가 어떻게 노출되고 외부 트래픽 또는 다른 컨테이너의 트래픽이 어떻게 서비스에 도달할 수 있는지에 대한 더 명확한 그림을 얻을 수 있습니다. 이는 연결 문제를 디버깅하거나 서비스의 외부 인터페이스를 이해하는 데 특히 유용합니다.
출력 그래프 들여쓰기 사용자 정의
이 단계에서는 생성된 DOT 그래프 출력의 들여쓰기를 사용자 정의하는 방법을 배우게 됩니다. 기본 들여쓰기는 일반적으로 허용되지만, 가독성을 높이거나 출력을 추가로 처리하려는 경우 특정 형식 표준을 준수하기 위해 조정할 수 있습니다.
이전 단계의 docker-compose.yml 파일을 계속 사용합니다.
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- my_network
app:
image: ubuntu:latest
command: sleep infinity
networks:
- my_network
networks:
my_network:
driver: bridge
그래프 출력의 들여쓰기를 사용자 정의하려면 --indent 플래그를 사용하고 그 뒤에 들여쓰기에 사용할 공백 수를 입력합니다. 이미지, 네트워크 및 포트를 포함하여 그래프를 생성하고 들여쓰기를 4 개의 공백으로 설정해 보겠습니다.
docker-compose config --graph --images --networks --ports --indent 4
이 명령을 실행하면 이전 단계와 동일한 그래프 내용이 생성되지만 DOT 출력의 줄은 4 개의 공백으로 들여쓰기됩니다. 이 명령의 출력과 이전 단계의 출력을 비교하여 들여쓰기의 차이점을 확인하십시오.
예를 들어, 출력의 일부는 4 개의 공백 들여쓰기로 다음과 같이 표시될 수 있습니다.
digraph {
compound=true
"web" [label="web\nnginx:latest\n80:80"]
"app" [label="app\nubuntu:latest"]
"my_network" [label="my_network"]
"web" -> "my_network" [label="network"]
"app" -> "my_network" [label="network"]
"web" -> "app" [label="depends_on"]
}
다양한 들여쓰기 값을 실험하여 출력 형식에 미치는 영향을 확인할 수 있습니다. 이 옵션은 주로 미적 목적으로 사용되거나 DOT 파일에 특정 들여쓰기 스타일이 필요한 도구에 사용됩니다.
요약
이 랩에서는 docker-compose config --graph 명령을 사용하여 Docker Compose 파일을 시각화하는 방법을 배웠습니다. 먼저 Docker Compose 를 설치하고 두 개의 서비스가 있는 기본 docker-compose.yml 파일을 만들었습니다. 그런 다음 이 파일의 기본 그래프 표현을 DOT 형식으로 생성하여 서비스와 서비스 간의 관계를 시각적으로 나타냈습니다.
기본 시각화를 기반으로, 그래프에 추가 세부 정보를 포함하는 방법을 탐구했습니다. 여기에는 서비스 이미지, 네트워크 및 포트를 시각적 출력에 통합하여 compose 파일의 구성을 보다 포괄적으로 보여주는 것이 포함되었습니다. 마지막으로, 가독성을 향상시키기 위해 출력 그래프의 들여쓰기를 사용자 정의하는 방법을 배웠습니다.



