새소식

Docker

docker - docker compose networks 옵션과 드라이버 종류

  • -

개요

프로젝트를 진행하던 중 나의 작고 소중한 php 서버가 mysql 서버를 접근하지 못하여 찾아보니 컨테이너간 네트워크가 연결되어있지 않아 발생한 해프닝이었다.
딸깍만 하면 모든게 자동으로 되는 환경을 원하기 때문에 docker compose의 networks 옵션에 대해서 찾아보았다.

Docker Compose 네트워크 옵션

옵션 설명 예시
external 이미 만들어진 네트워크를 사용한다.(새로 만들지 않음) external: true
name 네트워크의 이름을 정한다. name: my_custom_network
driver 컨테이너들이 서로 연결되는 방식을 정한다.(default: bridge) driver: overlay
driver_opts 드라이버가 필요로 하는 추가 설정한다. driver_opts: com.docker.network.driver.mtu: "1200"
ipam 네트워크에서 사용할 IP 주소 범위, 서브넷, 게이트웨이를 정한다. ipam: driver: default; config: - subnet: "192.168.1.0/24", gateway: "192.168.1.1"
internal 네트워크를 내부 전용으로 만들어 외부와 연결되지 않게 한다. internal: true
attachable Docker Swarm 모드에서 일반 컨테이너도 네트워크에 연결할 수 있게 한다. attachable: true
labels 네트워크에 태그(이름표)를 붙여 쉽게 관리할 수 있게 한다. labels: project: my_project

Docker 네트워크 드라이버 종류

드라이버 설명
bridge 한 컴퓨터 안에서 컨테이너끼리 서로 연결할 때 가장 기본적으로 사용하는 방식
overlay 여러 컴퓨터(서버)에서 컨테이너가 서로 연결될 수 있도록 한다.
host 컨테이너가 컴퓨터의 네트워크를 직접 사용한다. 속도가 빠르지만, 다른 컨테이너와 격리되지 않는다.
macvlan 컨테이너마다 고유한 네트워크 주소(MAC 주소)를 주어, 실제 다른 기기처럼 보이게 한다.
none 네트워크 연결을 하지 않는다. 컨테이너는 자기 자신만 사용할 수 있다.

옵션 사용 예시

version: '3.8'

services:
  app:
    image: nginx:latest
    networks:
      - external_net
      - custom_net

networks:
  # 이미 만들어진 네트워크 사용
  external_net:
    external: true

  # 이 Compose가 만드는 네트워크
  custom_net:
    name: custom_bridge_network  # 네트워크 이름
    driver: bridge               # bridge 드라이버 사용
    driver_opts:
      com.docker.network.driver.mtu: "1200"  # 추가 옵션 설정(최대 전송 단위를 1200로 제한)
    ipam:
      driver: default          # 기본 IP 관리 드라이버 사용
      config:
        - subnet: "192.168.10.0/24"  # 서브넷 범위 설정
          gateway: "192.168.10.1"     # 게이트웨이 설정
    internal: true             # 내부 전용 네트워크로 만듦
    attachable: true           # 일반 컨테이너도 연결 가능하게
    labels:
      project: my_project      # 태그

컨테이너간 네트워크 연결 예시 코드

mysql/docker-compose.yml

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: mysql_dev
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD
      TZ: Asia/Seoul
    networks:
      - mysql_net  # 사용할 네트워크 지정

networks:
  mysql_net:
    name: mysql_net  # 생성할 네트워크 이름

php/docker-compose.yml

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
    networks:
      - mysql_net # 사용할 네트워크 지정

networks:
  mysql_net:
    external: true # 네트워크가 외부에 이미 존재함을 지정

후기

나는 단순히 컨테이너간 네트워크를 최대한 편하게 연결하고 싶었을 뿐인데 생각보다 깊어진 것 같다...

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.