TIL_20250304_Docker

Kim jisu·2025년 3월 4일

TIL

목록 보기
11/43

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을 사용했습니다.

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 Network는 컨테이너 간 통신을 가능하게 해주는 가상 네트워크입니다. 기본적으로 Docker는 bridge, host, none 세 가지 네트워크 드라이버를 제공합니다. 그중 bridge 네트워크는 가장 일반적으로 사용되며, 같은 Docker 호스트 내에서 컨테이너 간 통신이 필요할 때 사용됩니다.

사용자 정의 네트워크를 생성하면:
1. 컨테이너 간에 DNS 이름 확인이 가능해집니다 (컨테이너 이름으로 접근 가능)
2. 컨테이너를 격리된 네트워크 환경에 배치할 수 있습니다
3. 컨테이너 간 안전한 통신이 가능합니다

실습 과정

1. Docker Network 생성

docker network create my-network

2. 애플리케이션 빌드

./gradlew clean bootJar

3. Docker 이미지 생성

docker build -t img-service-b .

4. Docker 컨테이너 실행

docker run -d --name service-b \
  --network my-network \
  -p 18081:8080 \
  img-service-b

5. 컨테이너 상태 확인

docker ps

Docker Compose 활용하기

Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 정의하고 실행하기 위한 도구입니다. YAML 파일을 통해 서비스, 네트워크, 볼륨 등을 선언적으로 정의할 수 있어 복잡한 다중 컨테이너 애플리케이션을 간편하게 관리할 수 있습니다.

docker-compose.yml 작성

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 실행

docker compose up -d

Docker Compose의 장점

  1. 선언적 구성: 전체 애플리케이션 스택을 YAML 파일로 정의
  2. 환경 일관성: 개발, 테스트, 프로덕션 환경에서 동일한 구성 사용 가능
  3. 단순화된 명령어: 복잡한 Docker 명령어를 단순화
  4. 의존성 관리: 서비스 간 의존성 정의 가능 (depends_on)
  5. 스케일링: 서비스 인스턴스를 쉽게 확장 가능

실습 중 발생한 이슈 해결 방법

  • 기존 컨테이너와 이름이 충돌할 경우:
    docker rm -f service-b
  • 컨테이너 강제 삭제가 필요하지 않은 경우:
    1. 컨테이너 중지: docker stop service-b
    2. 컨테이너 삭제: docker rm service-b

마이크로서비스 통신 확인 요점

Docker 네트워크를 통해 service-a는 http://service-b:8080와 같이 컨테이너 이름만으로 service-b에 접근할 수 있습니다. 이는 Docker의 내장 DNS 서버가 컨테이너 이름을 해당 컨테이너의 IP 주소로 변환해 주기 때문입니다.

💡 Tip: Windows PowerShell에서의 줄바꿈

Windows PowerShell에서 명령어 줄바꿈을 할 때는 백슬래시(\) 대신 백틱(`) 을 사용해야 합니다:

docker run -d --name service-b `
  --network my-network `
  -p 18081:8080 `
  img-service-b

이 차이점을 모르면 Linux/macOS 환경의 명령어를 Windows에서 그대로 복사해 실행할 때 "invalid reference format" 오류가 발생할 수 있습니다.

profile
Dreamer

0개의 댓글