Docker Network와 Docker Compose를 활용해 여러 서비스를 연결하는 방법.
이번 실습에서는 두 개의 스프링 부트 서비스(service-a, service-b)를 Docker 컨테이너로 실행하고 서로 통신하도록 구성했습니다.
Service A (application.properties)
spring.application.name=service-a
server.port=8080
service.b.url=http://service-b:8080
Service B (application.properties)
spring.application.name=service-b
server.port=8080
두 서비스 모두 동일한 구조의 Dockerfile을 사용했습니다.
Dockerfile (공통)
FROM openjdk:17-jdk-slim
VOLUME /tmp
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Docker Network는 컨테이너 간 통신을 가능하게 해주는 가상 네트워크입니다. 기본적으로 Docker는 bridge, host, none 세 가지 네트워크 드라이버를 제공합니다. 그중 bridge 네트워크는 가장 일반적으로 사용되며, 같은 Docker 호스트 내에서 컨테이너 간 통신이 필요할 때 사용됩니다.
사용자 정의 네트워크를 생성하면:
1. 컨테이너 간에 DNS 이름 확인이 가능해집니다 (컨테이너 이름으로 접근 가능)
2. 컨테이너를 격리된 네트워크 환경에 배치할 수 있습니다
3. 컨테이너 간 안전한 통신이 가능합니다
docker network create my-network
./gradlew clean bootJar
docker build -t img-service-b .
docker run -d --name service-b \
--network my-network \
-p 18081:8080 \
img-service-b
docker ps
Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 정의하고 실행하기 위한 도구입니다. YAML 파일을 통해 서비스, 네트워크, 볼륨 등을 선언적으로 정의할 수 있어 복잡한 다중 컨테이너 애플리케이션을 간편하게 관리할 수 있습니다.
version: '3.8'
services:
service-a:
image: img-service-a
ports:
- "18080:8080"
environment:
- SERVICE_B_URL=http://service-b:8080
depends_on:
- service-b
service-b:
image: img-service-b
ports:
- "18081:8080"
networks:
default:
driver: bridge
docker compose up -d
depends_on)docker rm -f service-bdocker stop service-bdocker rm service-bDocker 네트워크를 통해 service-a는 http://service-b:8080와 같이 컨테이너 이름만으로 service-b에 접근할 수 있습니다. 이는 Docker의 내장 DNS 서버가 컨테이너 이름을 해당 컨테이너의 IP 주소로 변환해 주기 때문입니다.
Windows PowerShell에서 명령어 줄바꿈을 할 때는 백슬래시(\) 대신 백틱(`) 을 사용해야 합니다:
docker run -d --name service-b `
--network my-network `
-p 18081:8080 `
img-service-b
이 차이점을 모르면 Linux/macOS 환경의 명령어를 Windows에서 그대로 복사해 실행할 때 "invalid reference format" 오류가 발생할 수 있습니다.