도커 네트워크 Bridged Network

로로·2025년 4월 27일
post-thumbnail

Docker Bridged Network❓

  • 도커에서 가장 기본적으로 사용되는 가상 네트워크
  • 컨테이너끼리 통신할 수 있도록 해주는 가상의 Switch 같은 것

📍 기본 개념

  • 도커를 설치하면 기본으로 bridge 라는 이름의 네트워크 자동 생성
  • 네트워크를 지정하지 않고 만들면,bridge 네트워크가 기본 연결
  • 네트워크 안에서는 컨테이너들이 서로 IP 주소로 통신 가능
# 브리지 네트워크 목록 보기
docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
d38bc9d35e7c   bridge    bridge    local # default
ebb7a44afb02   host      host      local # host
ff684a37f436   none      null      local # 안씀

📍 구조

  • 도커는 컨테이너에 내부 IP를 순차적으로 할당
    (재 시작 할 때마다 변경 될 수 있음)
  • 컨테이너 간 통신은 같은 브리지 네트워크 안에서만 가능
    (다른 네트워크에 있는 컨테이너랑은 기본적으로 통신 불가)
  • 외부(호스트나 인터넷)와 통신하려면 포트 포워딩 필요
  • 도커가 자동으로 veth로 시작하는 가상 네트워크 인터페이스를 호스트에 생성
ip addr

# 결과
# 호스트 머신
docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    inet 172.17.0.1/16 scope global docker0

34: veth12345@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
# veth12345 : 호스트 쪽에 보이는 veth 이름 (랜덤하게 붙여짐)
# @if33 : 연결된 반대편 인터페이스 번호 (컨테이너 쪽)
  • 컨테이너 이름으로 서로 통신하려면 사용자 정의 브리지 네트워크 만들어야함 (기본 브리지는 이름 통신X)

docker info
Client: Docker Engine - Community
 Version:    28.0.4
...
Server:
 Containers: 7
  Running: 1
  Paused: 0
  Stopped: 6
 Images: 2
 Server Version: 28.0.4
 Storage Driver: overlay2
...
  ** Network: bridge host ipvlan macvlan null overlay ** 
# 도커가 현재 사용할 수 있는 네트워크 드라이버 종류
...
docker network inspect bridge

#결과
"IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    # 브리지 네트워크 대역
                    "Subnet": "172.17.0.0/16", 
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        # 이 네트워크에 연결된 컨테이너 목록
        "Containers": {
            "d3b5f45a1cbe23ff1234...": {
                "Name": "my-nginx",
                "EndpointID": "a12b12345cd...",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            ...
        },

📍 컨테이너 내부 네트워크

docker exec test06 ip a

# 결과
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 86:7e:81:b0:2b:c5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet **172.17.0.2/16** brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

👉🏻 172.17.0.1은? host에서 ip a 명령어 해보면 docker0 이 사용

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:a0:f9:17:02:a1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::a0:f9ff:fe17:2a1/64 scope link
       valid_lft forever preferred_lft forever


📍 nginx 외부 포워딩으로 띄워보기 실습

  1. 컨테이너 띄우기
# 현재 기동중인 컨테이너 전체 삭제
$ docker container rm -f $(docker ps -aq)
# q : 컨테이너의 id 보여줌

# netbr00 컨테이너 시작
$ docker run -d --name=netbr00 -p 8080:80 nginx

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
860b0faf7811   nginx     "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   netbr00
# 8080 으로 들어온 요청을 80으로 기동중인 어플리케이션으로 전달

$ curl -v http://localhost:8080
정상 응답
  1. 방화벽 해제 후

  2. 퍼블릭ip:8080 로 접속

정상 배포 확인

$ iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    7   372 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0
    0     0 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.2:80
docker inspect netbr00

# 결과
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "9be23bdd154c0a748eafdce17491dbf4813b926590b9cfab67051fd353794c62",
            "SandboxKey": "/var/run/docker/netns/9be23bdd154c",
            "Ports": {
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "8080"
                    },
                    {
                        "HostIp": "::",
                        "HostPort": "8080"
                    }
                ]
            },
profile
청로하~🏝️

0개의 댓글