Docker Compose에서 네트워크 설정하기

Docker Compose에서 네트워크 설정하기

DevOps
Docker Compose
Docker Compose에서 네트워크 설정하기
Author

gabriel yang

Published

October 7, 2024


Docker Compose에서 네트워크 설정하기

Docker Compose는 여러 컨테이너를 쉽게 관리할 수 있게 해주는 도구입니다. 각 서비스(컨테이너)는 네트워크를 통해 서로 통신할 수 있으며, 네트워크 설정을 통해 애플리케이션 간 연결을 보다 유연하게 제어할 수 있습니다. 이 글에서는 Docker Compose에서 네트워크를 설정하는 방법을 단계별로 알아보겠습니다.

1. 기본 네트워크

Docker Compose를 사용할 때 네트워크를 명시적으로 정의하지 않으면, default라는 네트워크가 자동으로 생성됩니다. 모든 서비스는 이 기본 네트워크에 연결되어 서로 통신할 수 있습니다. 기본 네트워크 설정은 다음과 같은 경우에 적합합니다: - 컨테이너 간 네트워크 설정이 복잡하지 않을 때 - 기본적으로 모든 서비스가 서로 통신할 수 있도록 허용할 때

예를 들어, 아래의 Compose 파일은 기본 네트워크를 사용하여 webdb가 서로 통신할 수 있습니다.

version: '3'

services:
  web:
    image: nginx
  db:
    image: mysql

이 경우 별도로 네트워크를 정의하지 않았기 때문에, webdb 서비스는 자동으로 생성된 default 네트워크에서 서로 연결됩니다.

2. 사용자 정의 네트워크

좀 더 복잡한 네트워크 구성이 필요한 경우, 사용자 정의 네트워크를 통해 각 컨테이너가 연결될 네트워크를 지정할 수 있습니다. 예를 들어, 웹 서버와 데이터베이스를 분리된 네트워크에 연결하거나, 특정 컨테이너끼리만 통신할 수 있게 만들 수 있습니다.

네트워크 정의하기

Docker Compose에서 사용자 정의 네트워크를 설정하는 방법은 매우 간단합니다. 네트워크를 networks 섹션에 정의하고, 각 서비스에서 이 네트워크를 참조하면 됩니다.

예시:

version: '3'

services:
  web:
    image: nginx
    networks:
      - frontend

  db:
    image: mysql
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

설명:

  • web 서비스는 frontend 네트워크에 연결됩니다.
  • db 서비스는 backend 네트워크에 연결됩니다.
  • 두 네트워크는 bridge 드라이버를 사용하여 설정되었습니다. bridge는 기본 네트워크 유형으로, 로컬 머신의 가상 네트워크를 만들어 컨테이너 간 통신을 가능하게 합니다.

이렇게 설정하면 web 서비스는 db 서비스와 직접 통신할 수 없습니다. 두 네트워크가 다르기 때문에 분리된 상태로 동작하게 됩니다.

3. 여러 네트워크에 연결

특정 서비스가 여러 네트워크에 연결될 수도 있습니다. 이를 통해 해당 서비스가 다른 네트워크에 있는 컨테이너와 통신하거나 외부 네트워크와 상호작용할 수 있습니다.

예시:

version: '3'

services:
  web:
    image: nginx
    networks:
      - frontend
      - backend

  db:
    image: mysql
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

설명:

  • web 서비스는 frontendbackend 두 네트워크에 모두 연결되어 있습니다. 이를 통해 web 서비스는 두 네트워크에 있는 모든 서비스와 통신할 수 있습니다.
  • db 서비스는 backend 네트워크에만 연결되어 있어 web 서비스와는 통신할 수 있지만, frontend에 연결된 다른 서비스들과는 통신할 수 없습니다.

4. 외부 네트워크 사용하기

경우에 따라 이미 Docker에서 생성된 네트워크를 Docker Compose에서 재사용할 수 있습니다. 이를 통해 여러 프로젝트가 동일한 네트워크를 공유하게 할 수 있습니다.

예시:

version: '3'

services:
  app:
    image: myapp
    networks:
      - external_network

networks:
  external_network:
    external: true

설명:

  • external: true를 사용하여 Docker 외부에서 이미 존재하는 네트워크 external_networkapp 서비스가 연결됩니다.
  • 이는 네트워크가 여러 Compose 프로젝트에서 공유되어야 할 때 유용합니다.

5. 네트워크 옵션 설정

네트워크 설정에서 추가적인 옵션을 통해 네트워크의 동작을 세부적으로 제어할 수 있습니다. 예를 들어, 네트워크에 대한 서브넷, 게이트웨이 등의 정보를 설정할 수 있습니다.

예시:

version: '3'

services:
  web:
    image: nginx
    networks:
      - custom_network

networks:
  custom_network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.16.238.0/24
          gateway: 172.16.238.1

설명:

  • ipam(IP Address Management)을 통해 네트워크의 서브넷과 게이트웨이를 지정할 수 있습니다.
  • web 서비스는 172.16.238.0/24 서브넷에 속하는 IP 주소를 할당받고, 해당 네트워크의 게이트웨이는 172.16.238.1로 설정됩니다.

6. 네트워크 모드

네트워크 모드를 통해 컨테이너가 호스트 네트워크를 사용할 수 있도록 설정할 수도 있습니다. 이는 호스트의 네트워크 설정을 그대로 사용할 때 유용합니다.

예시:

version: '3'

services:
  app:
    image: myapp
    network_mode: host

설명:

  • network_mode: host는 컨테이너가 호스트의 네트워크 스택을 그대로 사용하도록 설정합니다. 이는 컨테이너가 호스트와 같은 IP 주소를 사용하게 된다는 것을 의미합니다.
  • 주로 성능상의 이유나 네트워크 설정이 매우 민감한 애플리케이션에서 사용됩니다.

7. 정리

Docker Compose에서 네트워크를 설정하는 것은 컨테이너 간의 통신을 효과적으로 관리하고, 보안과 성능을 최적화하는 데 매우 중요합니다. 기본 네트워크 설정 외에도, 사용자 정의 네트워크와 네트워크 옵션을 활용하여 복잡한 애플리케이션 아키텍처를 쉽게 구성할 수 있습니다.

  • 기본 네트워크는 간단한 애플리케이션에 유용합니다.
  • 사용자 정의 네트워크를 통해 서비스 간 통신을 명확하게 제어할 수 있습니다.
  • 외부 네트워크나 여러 네트워크에 연결하여 복잡한 구조를 유연하게 설정할 수 있습니다.

Docker Compose에서 네트워크를 적절히 활용하면, 다중 컨테이너 환경에서도 원활한 애플리케이션 개발이 가능합니다.