연결된 서비스 시작 없이 명령 실행
이 단계에서는 다른 연결된 서비스를 시작하지 않고, 다중 컨테이너 애플리케이션의 일부인 Docker 컨테이너에서 명령을 실행하는 방법을 배우겠습니다. 이는 전체 애플리케이션 스택을 시작할 필요 없이 한 서비스에서 데이터베이스 마이그레이션, 설정 스크립트 또는 디버깅 명령을 실행하는 데 특히 유용합니다.
Docker Compose 는 다중 컨테이너 애플리케이션을 관리하기 위한 표준 도구이며 특정 서비스에서 일회성 명령을 실행하기 위한 기능이 있지만, 여기서는 기본 Docker 개념을 시연합니다. 이 환경에는 Docker Compose 가 미리 설치되어 있지 않으므로 네트워킹과 함께 docker run 명령을 사용하는 데 집중하겠습니다.
웹 애플리케이션과 데이터베이스의 두 컨테이너가 있는 간단한 시나리오를 시뮬레이션해 보겠습니다. 웹 애플리케이션을 나타내기 위해 일반적인 ubuntu 이미지를 사용하고 데이터베이스에 postgres 이미지를 사용합니다.
먼저, postgres 이미지를 가져옵니다.
docker pull postgres:latest
이미지가 가져와지고 있음을 나타내는 출력을 볼 수 있습니다.
Using default tag: latest
latest: Pulling from library/postgres
...
Status: Downloaded newer image for postgres:latest
docker.io/library/postgres:latest
이제 컨테이너가 이름으로 서로 통신할 수 있도록 Docker 네트워크를 생성해 보겠습니다.
docker network create my-app-network
네트워크 ID 가 출력되는 것을 볼 수 있습니다.
<network_id>
다음으로, postgres 컨테이너를 실행하고 네트워크에 연결해 보겠습니다. 또한 PostgreSQL 사용자의 비밀번호를 설정합니다.
docker run -d --network my-app-network --name my-database -e POSTGRES_PASSWORD=mypassword postgres
데이터베이스 컨테이너가 백그라운드에서 실행 중임을 나타내는 컨테이너 ID 가 출력되는 것을 볼 수 있습니다.
<container_id>
이제 "웹 애플리케이션" 컨테이너가 데이터베이스 마이그레이션 스크립트와 같이 데이터베이스와 상호 작용하는 명령을 실행해야 한다고 가정해 보겠습니다. 일반적으로 Docker Compose 를 사용하는 경우 웹 서비스에서 명령을 실행할 수 있으며 Docker Compose 가 네트워크 설정 및 연결을 처리합니다.
docker run만 사용하면 웹 애플리케이션 컨테이너를 실행하고 my-database에 연결하려고 하면 일반적으로 동일한 네트워크에 있어야 합니다.
동일한 네트워크에 연결된 ubuntu 컨테이너에서 데이터베이스와 상호 작용할 수 있는 명령을 시뮬레이션하여 명령을 실행해 보겠습니다. 데이터베이스 컨테이너를 이름 (my-database) 으로 ping 하려고 합니다.
docker run --network my-app-network ubuntu ping -c 4 my-database
이 명령은 다음을 수행합니다.
ubuntu 이미지에서 새 컨테이너를 생성합니다.
my-app-network에 연결합니다.
- 컨테이너 내에서
ping -c 4 my-database 명령을 실행합니다.
ubuntu 컨테이너가 my-database 컨테이너와 동일한 네트워크에 있으므로 my-database 이름을 데이터베이스 컨테이너의 IP 주소로 확인하고 ping 할 수 있습니다.
ping 요청 및 응답을 보여주는 출력을 볼 수 있습니다.
PING my-database (172.18.0.2) 56(84) bytes of data.
64 bytes from my-database.my-app-network (172.18.0.2): icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from my-database.my-app-network (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from my-database.my-app-network (172.18.0.2): icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from my-database.my-app-network (172.18.0.2): icmp_seq=4 ttl=64 time=0.054 ms
--- my-database ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3060ms
rtt min/avg/max/mdev = 0.050/0.053/0.054/0.001 ms
이는 컨테이너에서 일회성 명령을 실행하고 명령을 실행하는 컨테이너의 기본 서비스 (이 경우 ubuntu 컨테이너에는 일반적인 "서비스"가 없음) 를 시작할 필요 없이 동일한 네트워크의 다른 컨테이너와 상호 작용할 수 있음을 보여줍니다. 핵심은 명령을 실행하는 컨테이너를 상호 작용해야 하는 서비스와 동일한 네트워크에 연결하는 것입니다.
마지막으로, 실행 중인 데이터베이스 컨테이너와 네트워크를 정리해 보겠습니다.
docker stop my-database
my-database
docker rm my-database
my-database
docker network rm my-app-network
my-app-network