로그인 회원가입
모두인포
전체IT경제사회생활스포츠시사여행연애

Docker 네트워크 완벽 이해: Bridge, Host, Port Mapping과 장애 분석

admin · 2026-10-28 · 조회 5
Docker 네트워크 완벽 이해: Bridge, Host, Port Mapping과 장애 분석

Docker 네트워크 완벽 이해: Bridge, Host, Port Mapping과 장애 분석


1. Docker 네트워크란 무엇인가?

Docker를 이용해 웹 서버나 데이터베이스를 운영하다 보면 다음과 같은 문제가 발생할 수 있습니다.


  • 컨테이너는 실행 중인데 외부에서 접속할 수 없다.
  • 호스트에서는 애플리케이션에 접속되지만 다른 컨테이너에서는 접속되지 않는다.
  • localhost로 데이터베이스에 연결했는데 접속이 실패한다.
  • 포트 매핑을 설정했는데도 서비스가 열리지 않는다.
  • 컨테이너에서 인터넷에 접속할 수 없다.
  • 컨테이너 IP 주소가 변경된 후 서비스 연결이 실패한다.

이러한 문제를 해결하려면 Docker가 컨테이너에 네트워크를 제공하는 방식을 이해해야 합니다.

일반적인 물리 서버에서는 NIC에 IP 주소를 설정하고 라우팅 테이블을 통해 네트워크를 구성합니다. Docker는 여기에 Linux Network Namespace, 가상 Ethernet 인터페이스, Bridge, NAT 등의 기술을 결합해 컨테이너별 네트워크 환경을 구성합니다.

Docker 네트워크의 기본 구조는 다음과 같습니다.


                    외부 클라이언트
                          |
                          v
                   [Host NIC]
                 192.168.10.10
                          |
                          v
                  Docker Host
                          |
                   Docker Bridge
                    docker0
                  172.17.0.1/16
                     /       \
                    /         \
                   v           v
             [Container A] [Container B]
              172.17.0.2    172.17.0.3
               Web Server    App Server

위 구조는 기본 Bridge 네트워크를 단순화한 예시입니다. 실제 IP 주소와 인터페이스 이름은 Docker 설정 및 네트워크 구성에 따라 달라질 수 있습니다.

핵심은 컨테이너가 호스트와 동일한 네트워크 환경을 사용하는 것이 아니라, 기본적으로 별도의 네트워크 네임스페이스와 가상 네트워크 인터페이스를 통해 통신한다는 점입니다.


2. Docker 네트워크의 핵심 구성 요소

Docker 네트워크를 이해하려면 다음 네 가지 개념을 먼저 알아야 합니다.


2-1. Network Namespace

Linux Network Namespace는 네트워크 인터페이스, 라우팅 테이블, 소켓, 방화벽 관련 네트워크 상태 등을 분리하는 기능입니다.

컨테이너는 자체 네트워크 네임스페이스를 사용할 수 있으므로 호스트와 별도의 IP 주소 및 라우팅 테이블을 가질 수 있습니다.

예를 들어 호스트와 컨테이너에서 다음 명령을 실행해 봅니다.

호스트:


ip addr
ip route

컨테이너:


docker exec -it web01 ip addr
docker exec -it web01 ip route

두 환경의 IP 주소와 라우팅 테이블이 다르게 나타날 수 있습니다.

이러한 분리 덕분에 여러 컨테이너가 각각 독립적인 네트워크 환경에서 실행될 수 있습니다.


2-2. veth Pair

veth(Virtual Ethernet)는 서로 연결된 가상 Ethernet 인터페이스 쌍입니다.

Docker Bridge 네트워크에서는 일반적으로 한쪽 인터페이스가 컨테이너의 네트워크 네임스페이스 안에 있고, 다른 쪽은 호스트의 네트워크 네임스페이스에 존재합니다.


Container Network Namespace
       eth0
        |
        | veth pair
        |
Host Network Namespace
      vethXXXX
        |
        v
    Docker Bridge

컨테이너에서 발생한 Ethernet 프레임은 veth를 통해 호스트 쪽으로 전달되고, Bridge의 전달 기능을 통해 목적지로 이동할 수 있습니다.


2-3. Linux Bridge

Linux Bridge는 여러 네트워크 인터페이스를 Layer 2 수준에서 연결하는 가상 스위치와 유사하게 동작합니다.

Docker의 기본 Bridge 네트워크에서는 일반적으로 docker0라는 Bridge 인터페이스가 생성됩니다.

확인 명령어:


ip -br link
ip addr show docker0
bridge link

Bridge에 연결된 인터페이스와 상태를 확인할 수 있습니다.


2-4. NAT와 Port Mapping

컨테이너 IP는 호스트 내부의 사설 네트워크에 할당되는 경우가 많습니다. 외부 클라이언트가 컨테이너 서비스에 접속하도록 하려면 호스트의 포트를 컨테이너 포트에 연결할 수 있습니다.

예를 들어 다음 명령을 실행했다고 가정하겠습니다.


docker run -d \
  --name web01 \
  -p 8080:80 \
  nginx

이는 일반적으로 호스트의 TCP 8080번 포트를 컨테이너의 TCP 80번 포트에 연결한다는 의미입니다.


Client
  |
  | TCP 8080
  v
Docker Host
192.168.10.10:8080
  |
  | Port Mapping
  v
Container
172.17.0.2:80
  |
  v
Nginx

외부 클라이언트는 컨테이너 IP를 직접 알 필요 없이 호스트의 IP 주소와 공개된 포트로 접속할 수 있습니다.

다만 실제 패킷 처리 방식은 Docker의 네트워크 드라이버, 방화벽 백엔드, 사용자 공간 프록시 사용 여부 등에 따라 달라질 수 있습니다.


3. Docker 네트워크 종류

Docker에서 자주 사용하는 네트워크 드라이버는 다음과 같습니다.

네트워크 종류특징주요 사용 사례Bridge호스트 내부의 가상 Bridge를 통해 연결일반적인 단일 호스트 컨테이너Host컨테이너가 호스트의 네트워크 네임스페이스를 공유네트워크 분리가 필요하지 않은 특정 서비스None기본 외부 네트워크 연결을 제공하지 않음네트워크를 제한해야 하는 작업Overlay여러 Docker 호스트에 걸친 컨테이너 네트워크Swarm 등 다중 호스트 구성Macvlan컨테이너에 별도의 MAC 주소를 제공실제 네트워크에서 개별 장치처럼 연결해야 하는 경우

Overlay 네트워크의 제공 조건은 Docker 구성과 오케스트레이션 환경에 따라 달라집니다. 일반적인 단일 호스트 Docker 환경에서는 Bridge 네트워크부터 이해하는 것이 좋습니다.


4. Bridge 네트워크 실습

4-1. Docker 네트워크 목록 확인

docker network ls

예시:


NETWORK ID     NAME      DRIVER    SCOPE
xxxxxxxxxxxx   bridge    bridge    local
yyyyyyyyyyyy   host      host      local
zzzzzzzzzzzz   none      null      local

Docker를 설치하면 기본 네트워크가 제공됩니다.

기본 Bridge의 상세 정보를 확인합니다.


docker network inspect bridge

출력에서 다음 정보를 확인할 수 있습니다.


  • 네트워크 이름과 ID
  • 서브넷 및 게이트웨이
  • 연결된 컨테이너
  • 네트워크 드라이버
  • 관련 옵션

4-2. 컨테이너 생성

Nginx 컨테이너를 생성합니다.


docker run -d \
  --name web01 \
  -p 8080:80 \
  nginx

상태를 확인합니다.


docker ps

호스트에서 접속을 테스트합니다.


curl -I http://127.0.0.1:8080

Nginx가 정상적으로 응답하면 HTTP 상태 코드가 반환됩니다.

외부 PC에서 접속하려면 다음 주소를 사용합니다.


http://호스트IP:8080

외부 접속이 되지 않는다면 Docker 포트 매핑뿐 아니라 호스트 방화벽, 상위 네트워크 방화벽, 라우팅도 확인해야 합니다.


4-3. 컨테이너 IP 확인

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web01

예를 들어 다음과 같은 IP가 출력될 수 있습니다.


172.17.0.2

이 주소는 예시일 뿐이며 실제 주소는 Docker 네트워크 구성에 따라 달라집니다.

컨테이너 IP는 재생성이나 네트워크 변경 시 달라질 수 있으므로 애플리케이션 설정에 고정 IP를 직접 입력하는 방식은 가급적 피하는 것이 좋습니다.


5. 사용자 정의 Bridge 네트워크를 사용해야 하는 이유

Docker의 기본 Bridge와 사용자 정의 Bridge는 중요한 차이가 있습니다.

사용자 정의 Bridge 네트워크에서는 일반적으로 같은 네트워크에 연결된 컨테이너 간에 Docker가 제공하는 이름 해석 기능을 이용할 수 있습니다.

반면 기본 Bridge에서는 사용자 정의 네트워크와 동일한 방식의 자동 컨테이너 이름 해석을 기대하기 어렵습니다.

따라서 애플리케이션과 데이터베이스를 함께 운영한다면 사용자 정의 Bridge를 사용하는 것이 편리합니다.


5-1. 네트워크 생성

docker network create app-net

확인:


docker network ls
docker network inspect app-net

5-2. 애플리케이션 컨테이너 생성

docker run -d \
  --name app01 \
  --network app-net \
  nginx

데이터베이스 컨테이너를 구성할 때도 같은 네트워크를 지정할 수 있습니다.

예를 들어 PostgreSQL 컨테이너를 실행하는 실습 환경에서는 다음과 같이 구성할 수 있습니다.


docker run -d \
  --name db01 \
  --network app-net \
  -e POSTGRES_PASSWORD='ChangeThisPassword!' \
  postgres

이 예제의 비밀번호는 실습용 문자열입니다. 운영 환경에서는 비밀번호를 명령행에 직접 기록하지 말고 적절한 비밀정보 관리 방식을 사용해야 합니다.

컨테이너가 같은 사용자 정의 Bridge에 연결되어 있다면 애플리케이션은 데이터베이스의 컨테이너 이름인 db01을 호스트명으로 사용해 연결할 수 있습니다.


app01
  |
  | TCP 5432
  v
db01:5432

이때 애플리케이션에서 사용하는 데이터베이스 주소는 다음과 같은 형태가 됩니다.


Host: db01
Port: 5432

중요한 점은 컨테이너 내부에서 localhost는 해당 컨테이너 자신을 가리킨다는 것입니다. app01에서 localhost:5432로 접속하면 별도의 설정이 없는 한 db01이 아니라 app01 내부를 대상으로 연결을 시도합니다.

또한 위 PostgreSQL 명령은 연결 구조를 설명하기 위한 실습 예제입니다. 데이터베이스 초기화, 데이터 영속성, 사용자 권한, 네트워크 접근 제어는 별도로 설정해야 합니다.


6. Docker Port Mapping과 외부 접속

Docker에서 -p 옵션은 호스트의 포트를 컨테이너 포트에 연결합니다.

기본 형식은 다음과 같습니다.


docker run -d \
  --name web02 \
  -p 호스트포트:컨테이너포트 \
  nginx

예를 들어 다음과 같이 실행합니다.


docker run -d \
  --name web02 \
  -p 8081:80 \
  nginx

이 경우 호스트의 TCP 8081번 포트를 통해 컨테이너의 TCP 80번 포트에 접속할 수 있습니다.


6-1. 특정 호스트 IP에만 포트 공개하기

다음과 같이 특정 주소에만 바인딩할 수 있습니다.


docker run -d \
  --name web-local \
  -p 127.0.0.1:8082:80 \
  nginx

이 구성에서는 호스트의 루프백 주소에 포트가 공개됩니다. 일반적으로 외부 PC가 호스트의 실제 IP 주소를 통해 직접 접속하는 용도로는 사용할 수 없습니다.

관리용 웹 인터페이스처럼 호스트 내부에서만 접근해야 하는 서비스에 유용할 수 있습니다.


6-2. 포트 매핑 확인

docker port web01

또는 다음 명령으로 전체 구성을 확인할 수 있습니다.


docker ps

출력 예시:


0.0.0.0:8080->80/tcp

이는 IPv4의 모든 호스트 인터페이스 주소에서 TCP 8080번 포트를 공개한다는 의미입니다.

외부에 공개되는 서비스라면 접근 가능한 네트워크 범위와 방화벽 정책을 반드시 검토해야 합니다.


7. Docker 네트워크 장애 분석

이제 실제 운영 환경에서 사용할 수 있는 장애 분석 절차를 살펴보겠습니다.


장애 1. 컨테이너는 실행 중인데 외부 접속이 안 된다

먼저 컨테이너 상태를 확인합니다.


docker ps
docker logs --tail 100 web01

포트 매핑을 확인합니다.


docker port web01

호스트 내부에서 접속을 테스트합니다.


curl -v --connect-timeout 3 http://127.0.0.1:8080

호스트 내부에서는 접속되지만 외부에서는 실패한다면 다음 항목을 확인합니다.


  1. 포트가 루프백 주소에만 바인딩되어 있는가?
  2. 호스트 방화벽에서 포트가 허용되어 있는가?
  3. 상위 방화벽 또는 네트워크 ACL에서 차단하고 있는가?
  4. 외부 클라이언트가 올바른 호스트 IP와 포트로 접속하고 있는가?
  5. Docker 네트워크 및 포트 매핑이 정상인가?

장애 2. 컨테이너끼리 통신되지 않는다

네트워크 연결 상태를 확인합니다.


docker network inspect app-net

각 컨테이너가 동일한 사용자 정의 네트워크에 연결되어 있는지 확인합니다.

컨테이너에서 DNS 조회를 시도할 수 있다면 다음과 같이 확인합니다.


docker exec app01 getent hosts db01

그다음 데이터베이스 포트에 연결할 수 있는지 확인합니다.


docker exec app01 nc -zv -w 3 db01 5432

단, nc가 컨테이너 이미지에 설치되어 있지 않을 수 있습니다. 운영 컨테이너에 진단 도구를 무분별하게 설치하기보다는 승인된 진단 컨테이너나 별도 도구를 사용하는 방법도 고려할 수 있습니다.

이름 해석은 되지만 TCP 연결이 실패한다면 다음을 확인합니다.


  • 데이터베이스 프로세스가 실행 중인가?
  • 올바른 포트에서 수신 중인가?
  • 데이터베이스가 적절한 인터페이스에서 수신하도록 설정되었는가?
  • 두 컨테이너가 동일한 네트워크에 연결되어 있는가?
  • 호스트의 방화벽이나 사용자 정의 네트워크 정책이 통신에 영향을 주는가?

장애 3. 컨테이너에서 외부 인터넷에 접속할 수 없다

먼저 컨테이너의 IP 주소와 라우팅 테이블을 확인합니다.


docker exec web01 ip addr
docker exec web01 ip route

컨테이너에 진단 도구가 없다면 컨테이너의 네트워크 네임스페이스를 별도의 진단 환경에서 확인하는 방법을 사용할 수 있습니다.

호스트에서도 다음 항목을 확인합니다.


ip route
docker network inspect bridge

DNS 문제와 네트워크 연결 문제를 분리해서 테스트하는 것이 중요합니다.


  • IP 주소를 직접 사용한 연결도 실패하는가?
  • 도메인 이름으로만 실패하는가?
  • 기본 게이트웨이와 외부 경로가 정상인가?
  • 호스트의 NAT 및 방화벽 규칙이 정상인가?

IP 기반 통신은 성공하지만 도메인 조회가 실패한다면 DNS 설정을 우선 확인합니다.


8. tcpdump로 Docker 패킷 흐름 분석하기

Docker 네트워크 장애를 정확하게 분석하려면 호스트와 컨테이너 사이의 패킷 흐름을 관찰해야 합니다.


8-1. 호스트에서 특정 포트 확인

sudo tcpdump -nn -i any 'tcp port 8080'

any는 Linux에서 여러 인터페이스의 패킷을 관찰할 때 사용할 수 있는 가상 캡처 인터페이스입니다. 환경에 따라 중복 관찰이나 링크 계층 정보의 제한이 있을 수 있으므로 필요하면 실제 인터페이스를 지정합니다.


8-2. Docker Bridge에서 확인

기본 Bridge를 사용하는 경우 다음과 같이 확인할 수 있습니다.


sudo tcpdump -nn -i docker0 'tcp port 80'

사용자 정의 Bridge를 사용한다면 실제 Bridge 인터페이스 이름을 확인해야 합니다.


ip -br link
bridge link

사용자 정의 Docker 네트워크에서는 인터페이스 이름이 br-... 형태로 나타날 수 있습니다.


8-3. 패킷 흐름 해석

외부 클라이언트가 호스트의 8080번 포트로 접속한다고 가정하겠습니다.


Client
  |
  | TCP SYN :8080
  v
Host NIC
  |
  v
Docker Port Mapping
  |
  v
Docker Bridge
  |
  v
Container :80

호스트 NIC에서는 SYN이 관찰되지만 컨테이너 쪽에서 요청이 관찰되지 않는다면 포트 매핑, 호스트의 패킷 처리 규칙, Docker 네트워크 구성을 확인해야 합니다.

반대로 컨테이너까지 SYN이 도달하지만 SYN-ACK가 나오지 않는다면 컨테이너 내부 서비스 상태, 수신 주소, 컨테이너 내부 방화벽 등을 확인합니다.

응답 패킷이 컨테이너에서 나가지만 클라이언트로 돌아오지 않는다면 NAT, 호스트 라우팅, 방화벽, 반환 경로 등을 조사합니다.

단, Docker는 NAT 규칙이나 사용자 공간 프록시 등 여러 방식으로 포트 매핑을 처리할 수 있으므로 실제 패킷 흐름은 환경에 따라 달라질 수 있습니다.


9. Docker 네트워크 운영 시 주의사항

9-1. 컨테이너 IP를 애플리케이션 설정에 직접 입력하지 않는다

컨테이너는 재생성되거나 네트워크가 변경되면 IP 주소가 달라질 수 있습니다.

따라서 사용자 정의 Bridge 네트워크에서 제공하는 서비스 이름을 사용하거나, 애플리케이션에 안정적인 DNS 이름을 제공하는 구조가 일반적으로 관리하기 쉽습니다.


9-2. 불필요한 포트를 외부에 공개하지 않는다

-p 8080:80처럼 포트를 공개하면 외부에서 접근할 수 있는 경로가 생길 수 있습니다.

관리용 서비스나 데이터베이스 포트는 필요한 네트워크에만 공개해야 합니다.

예를 들어 데이터베이스가 애플리케이션 컨테이너에서만 필요하다면 별도의 내부 네트워크에 배치하고, 호스트 외부에 포트를 공개하지 않는 구성을 고려할 수 있습니다.


9-3. Docker 네트워크와 호스트 방화벽을 함께 이해한다

Docker는 네트워크 드라이버와 환경에 따라 NAT 및 패킷 전달 규칙을 구성할 수 있습니다.

따라서 firewalld나 nftables를 운영할 때는 일반 호스트 서비스의 방화벽 규칙뿐 아니라 Docker가 생성하거나 사용하는 규칙과 체인도 확인해야 합니다.

운영 중인 방화벽 규칙을 충분히 이해하지 않은 상태에서 초기화하거나 삭제하면 컨테이너 통신과 외부 서비스가 동시에 중단될 수 있습니다.


9-4. IP 대역 중복을 피한다

Docker 네트워크의 서브넷이 사내망, VPN 또는 다른 라우팅 대역과 겹치면 예상치 못한 경로 선택이나 통신 장애가 발생할 수 있습니다.

네트워크를 생성하기 전에 현재 네트워크 대역을 확인하고 조직의 IP 주소 계획에 맞게 서브넷을 설계해야 합니다.


10. 핵심 정리

Docker 네트워크를 운영할 때 기억해야 할 내용은 다음과 같습니다.


  • Network Namespace는 컨테이너의 네트워크 환경을 분리합니다.
  • veth Pair는 컨테이너와 호스트 네트워크를 연결하는 가상 Ethernet 인터페이스 쌍입니다.
  • Linux Bridge는 여러 인터페이스를 Layer 2 수준에서 연결합니다.
  • Bridge 네트워크는 단일 호스트 컨테이너 통신에 널리 사용됩니다.
  • 사용자 정의 Bridge는 컨테이너 간 이름 기반 통신에 유용합니다.
  • -p 옵션은 호스트 포트와 컨테이너 포트를 연결합니다.
  • 컨테이너 내부의 localhost는 해당 컨테이너 자신을 가리킵니다.
  • docker network inspect, ip route, ss, curl, tcpdump를 조합하면 네트워크 장애를 단계적으로 분석할 수 있습니다.
  • Docker 네트워크를 변경할 때는 포트 공개 범위, IP 대역 중복, 방화벽 규칙을 함께 검토해야 합니다.

마무리

Docker 네트워크는 단순히 컨테이너에 IP 주소를 할당하는 기능이 아닙니다. Linux의 네트워크 네임스페이스, 가상 인터페이스, Bridge, 라우팅, NAT를 결합해 컨테이너 간 통신과 외부 연결을 구성하는 기술입니다.

이 원리를 이해하면 컨테이너가 실행 중인데도 접속되지 않는 문제를 단순히 애플리케이션 오류로 판단하지 않고, 어느 구간에서 통신이 끊겼는지 체계적으로 확인할 수 있습니다.

다음 편에서는 Docker 네트워크의 기반이 되는 Linux 기술인 Network Namespace와 Linux Bridge를 직접 구성하는 실습을 진행하겠습니다. 컨테이너를 사용하지 않고도 가상 네트워크를 만들고, IP 주소와 라우팅을 설정한 뒤 ping과 tcpdump로 통신 과정을 분석해 보겠습니다.

다음 편은 시스템 엔지니어 실전 교육 22편 — Linux Network Namespace와 Bridge 직접 구성하기입니다. Docker가 내부적으로 활용하는 네트워크 기술을 Linux 명령어로 직접 구현해 보는 단계로 이어가겠습니다.

댓글

아직 댓글이 없습니다.

로그인 후 댓글을 남길 수 있습니다.