본문 바로가기
관심 기술/container

도커 네트워크: 드라이버 종류와 활용법

by se-dong 2025. 4. 8.

 

네트워크는 컴퓨터 혹은 다른 장치들이 데이터를 주고받기 위해 통신을 할 수 있도록 연결하는 시스템을 말합니다.

 

도커에서 네트워크는 도커 컨테이너 간의 통신 또는 컨테이너와 외부 호스트 네트워크 간의 연결이 가능하도록 연결하는 시스템을 의미합니다.

오늘은 도커의 네트워크에 대해서 알아보도록 하겠습니다.


도커 네트워크 드라이버

도커는 네트워크로 통신을 가능하게 하기 위해 네트워크 드라이버를 사용합니다.

이 드라이버는 네트워크 인터페이스를 구현하여 각각 목적에 맞는 네트워킹 방식을 제공합니다.


Bridge Driver

Bridge 드라이버는 명시적인 선언없이 기본적으로 적용되는 네트워크 드라이버입니다. 단일한 호스트 내에서 컨테이너 간의 통신을 가능하게 하며, 각각의 컨테이너는 해당 드라이버를 사용하는 네트워크를 통해 서로 연결됩니다.

도커 네트워크 생성 시 사용하는 드라이버를 명시하지 않고 네트워크를 생성하면 bridge 네트워크 드라이버를 사용해 네트워크를 생성합니다.

docker network create --driver bridge my-bridge
docker network create my-bridge

 

--network 옵션을 통해 생성한 네트워크를 사용해서 컨테이너를 실행할 수 있습니다.

docker container run \\ 
          -d --rm  \\
          --name my-nginx \\
          --network my-bridge \\
          nginx:latest

 

도커에서 각각의 네트워크는 독립적이기 때문에 두 컨테이너간 통신이 불가능합니다.

두 컨테이너를 bridge 드라이버를 사용하는 네트워크에 연결하여 컨테이너간 통신을 가능하게 합니다.

# 동일한 네트워크를 가지는 컨테이너 실행
docker container run \\
            -it --rm \\
            --network my-bridge \\
            busybox \\
            /bin/sh
wget -O- <http://my-nginx>

Host Driver

Host 네트워크 드라이버는 컨테이너가 호스트의 네트워크 스택을 직접 사용하도록 하는 드라이버입니다.

네트워크 스택이란 운영체제에서 네트워크 통ㅇ신을 처리하는 소프트웨어 계층으로 네트워크에 대한 전반적인 관리, 네트워크를 통한 데이터 송수신, 네트워크 연결 유지 등의 역할을 합니다.

 

Host 네트워크 드라이버를 사용하면 별도의 네트워크를 사용하지 않고 호스트와 동일한 IP 주소를 사용합니다. 컨테이너가 호스트에 직접 연결되기 때문에 컨테이너의 격리 수준이 낮아지며, 여러 컨테이너가 동일한 포트를 사용할 수 없기 때문에 포트 관리에도 어려움이 존재합니다.

 

Host 네트워크는 도커를 실행하는 경우 기본적으로 1개가 생성되어 있으며, 전체 네트워크에서 한 개의 Host 드라이버만 가질 수 있습니다.

 

다음 명령어를 통해 도커 네트워크 목록을 확인해 볼 수 있습니다.

docker network ls

NETWORK ID     NAME                            DRIVER    SCOPE
66a98de55db7   bridge                          bridge    *local*
0490076f948f   host                            host      *local*
f514d98a172e   none                            null      *local*

 

생성된 호스트 네트워크와 컨테이너를 연결하여 컨테이너를 실행할 수 있습니다.

docker container run \\
            -d --rm \\
            --name my_nginx \\
            --network host \\
            nginx:lastet

 

Host 네트워크를 사용한 컨테이너는 포트 매핑 없이도 http://localhost 로 접근이 가능합니다.

호스트 네트워크 스택을 공유하기 때문입니다.


None

네트워크 연결이 필요 없는 컨테이너는 None 드라이버를 사용할 수 있습니다. None 드라이버는 컨테이너가 네트워크 인터페이스를 가지지 않으며, 외부와의 통신이 불가능합니다. 파일 변환, 데이터 처리, 로컬 파일 시스템과 상호작용 등 네트워크 처리 없이 독립적인 작업이 필요한 네트워크에 적합한 드라이버입니다.


ETC

이 외에도 도커는 여러가지 네트워크 드라이버를 제공하고 있습니다.

  • Docker swarm 등 클러스터 환경에서 사용하는 Overlay 드라이버
  • 다른 컨테이너의 네트워크 스택을 공유하는 Container 드라이버
  • 컨테이너에 고유 MAC 주소를 부여해 물리 네트워크에 직접 연결하는 Macvlan 드라이버

이런 네트워크 드라이버들은 용도와 활용에 맞는 컨테이너 네트워크를 구성할 수 있도록 도와주는 도커 네트워크의 핵심적인 부분입니다.


네트워크 기본 사용 방법

도커 네트워크를 다양한 명령어를 알아보도록 하겠습니다.


네트워크 생성

기본 네트워크 드라이버인 bridge 드라이버를 사용해서 네트워크를 생성합니다. 드라이버를 명시하면 특정한 드라이버를 사용하는 네트워크를 생성할 수 있습니다.

docker network create my-network
docker network create --driver bridge br-network

네트워크 정보 확인

현재 사용중인 도커 네트워크와 그에 연결된 컨테이너를 확인하기 위해선 다음과 같은 명령어를 사용할 수 있습니다.

docker network ls
docker network inspect my-network

ls는 list의 약어로 현재 시스템에 존재하는 도커 네트워크 목록을 보여주고, 특정 네트워크에 대한 상세 정보를 제공합니다.


네트워크에 컨테이너 연결

컨테이너를 생성할 때 생성되어 있는 특정한 네트워크에 연결하기 위해선 --network 옵션을 사용할 수 있습니다.

docker container run \\
            -d --rm \\
            --name my-nginx \\
            --network my-network \\
            nginx:latest

네트워크 삭제

더 이상 연결된 컨테이너가 존재하지 않는 네트워크를 삭제하기 위해선 다음과 같은 명령어를 사용할 수 있습니다.

docker network rm <삭제할 이름 혹은 ID>
docker network prune

 

rm 은 remove 의 약어로 해당 오브젝트를 삭제합니다. prune 은 가지치기란 뜻으로 더 이상 참조되지 않는 네트워크를 한 번에 삭제합니다.


컨테이너간 통신

앞서 살펴본 바와 같이 동일한 네트워크를 사용하는 (Bridge 드라이버) 컨테이너 간 통신이 가능합니다.

그리고 중요한 점은 동일한 네트워크로 구성되어 있는 컨테이너는 다른 컨테이너에 요청을 보낼 때 컨테이너의 이름을 도메인으로 사용해 요청이 가능합니다.

 

이 과정의 흐름은 다음과 같습니다.

  1. 컨테이너 생성 및 네트워크 연결 도커는 각 컨테이너가 생성될 때 고유한 컨테이너의 이름을 부여합니다. (혹은 사용자가 고유한 이름을 설정할 수 있습니다.)
  2. dns 도커 네트워크는 내장된 dns 서비스를 제공합니다. dns 서비스는 같은 네트워크에 연결된 모든 컨테이너의 이름과 ip 주소를 관리합니다.
  3. dns 매핑 하나의 컨테이너에서 다른 컨테이너에 컨테이너 이름의 도메인을 사용해 요청을 보내는 경우, 컨테이너 이름으로 사용된 부분을 dns 서비스를 이용해 ip 주소로 해석합니다.
  4. 통신 요청 해석된 ip 주소로 요청을 보내게 됩니다.

도커 네트워크의 dns 서비스 덕분에 컨테이너 이름의 도메인 호출이 가능합니다.

 

도커는 각 네트워크에서 dns 서비스를 자동으로 설정하고, 동일 네트워크에 속한 컨테이너에 대한 이름과 ip 주소 관리 역할을 수행합니다.

컨테이너는 컨테이너 이름으로 다른 컨테이너에 요청할 수 있기 때문에 복잡하고 컨테이너가 삭제되고 재실행 되는 경우 계속해서 바뀌는 컨테이너 ip 주소를 사용하는 대신 이름으로 통신을 수행할 수 있습니다.


docker compose 에서 네트워크

docker compose 를 사용하면 여러 컨테이너를 정의하고 함께 실행할 수 있습니다. 선언적 방식으로 컨테이너를 구동하기 때문에 많은 이점들이 있습니다.

 

compose를 사용해서 컨테이너를 실행하는 경우 bridge 드라이버를 사용하는 default 네트워크가 생성됩니다. docker-compose.yaml 에 선언된 각 서비스는 생성된 default 네트워크에 연결됩니다. 모든 서비스를 묶어줄 수 있는 하나의 네트워크를 생성하고, 해당 네트워크에서 서비스들이 서로의 서비스 이름을 도메인처럼 사용하여 통신할 수 있게 합니다.

 

version: '3.9'

services:
  my-lovely-app:  # app 서비스 명
    image: my-app
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=power-db  # 서비스 이름으로 db 접근
      - DB_PORT=5432
      - DB_USER=postgres
      - DB_PASSWORD=yourpassword
      - DB_NAME=mydb
    depends_on:
      - power-db
    restart: unless-stopped

  power-db:  # db 서비스 명
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: yourpassword
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "postgres", "-d", "mydb"]
      start_period: 10s
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

 

위 도커 컴포즈를 실행하면 다음과 같이 _default 접미사가 붙은 네트워크가 생성됩니다.

4d993ee6866e   docker-network-sample_default   bridge    *local*

사용자 정의 네트워크

기본 네트워크 이외에도 사용자가 정의한 네트워크를 통해서 더 세분화된 네트워크 구성을 만들 수 있습니다.

통신이 가능한 서비스를 명확하게 정의하여 보안성을 강화할 수 있으며, 서비스 간 통신을 제어할 수 있습니다.

이는 도커 cli 명령어를 통해서도 가능하나 모든 설정을 순차적으로 처리해야 하는 점이 불편하기 때문에 compose section에서 설명합니다.

version: '3.9'

services:
  web:
    image: nginx:latest
    networks:
      - web-net

  app:
    image: myapp
    networks:
      - web-net
      - db-net

  db:
    image: postgres
    networks:
      - db-net

networks:
  web-net:
  db-net:

위 예시는 사용자 네트워크 설정을 통해 적절하게 격리된 네트워크 환경에서 특정 서비스만 통신 가능하도록 설정한 예시입니다.

web 서비스와 app 서비스는 web-net으로 연결되어 있어 서로 통신이 가능합니다.

web 은 db 서비스와 동일 네트워크로 연결되어 있지 않기 때문에 통신이 불가능하며, db는 app 서비스만 통신이 가능합니다.


네트워크 설정 옵션

단순히 네트워크를 명시하면 기본적인 옵션으로 네트워크가 생성됩니다. 세밀한 설정이 필요한 경우 다음과 같은 방식을 사용합니다.

networks:
  my-external-network:
    external: true
  custom-network:
    driver: overlay
    driver_opts:
      encrypted: 'true'
    attachable: true
  • external
    • compose에 선언된 네트워크는 컴포즈가 실행될 때 생성됩니다. 이미 생성된 네트워크 사용을 원하는 경우 해당 속성을 사용할 수 있습니다.
    • 해당 네트워크는 미리 생성되어 있어야 하며, 도커 컴포즈가 관리하는 네트워크 라이프 사이클에 영향을 받지 않습니다.
  • driver
    • 네트워크 드라이버를 명시합니다.
  • driver_opts
    • 드라이버의 옵션에 대해서 설정할 수 있습니다.
  • attachable
    • 컨테이너를 수동으로 연결할 수 있도록 설정합니다.