[Docker] 도커 네트워크

728x90

Docker Network

파일명으로 패키지 찾을 때

yum provides /usr/sbin/ip

ubuntu 에서는 apt-file search /usr/sbin/ip 로 찾을 수 있다.

VM 머신 안에 도커 브릿지가 컨테이너를 띄울 때 마다 veth 인터페이스를 컨테이너에 붙여준다. 그러면 VM 내부의 라우터를 통해 외부로 나갈 수 있다.

$ sudo apt install -y bridge-utils
$ brctl show 
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02423d0a04e3       no              veth35500bc
# nat 테이블 확인
$ sudo iptables -t nat -L -n  # -t 타입, -L 리스트, -n 숫자로 확인

ping 8.8.8.8, 핑 명령어를 보낼 때 위와 같은 과정을 거치게 된다.

netfilter 에서 MASQUERADE 로 인해 출발지 IP 를 변경한다. 왜냐하면 사설 IP 는 외부와 통신할 수 없기 때문이다.

즉, MASQUERADE 출발지의 사설 IP 를 공인 IP 로 변경해주는 것이다. 변경된 공인 IP - 사설 IP 정보는 NAT 테이블에 저장된다.

NAT 테이블에 저장된 사설 IP 정보를 보고 8.8.8.8 에서 보내준 response 가 들어오게 된다.

네트워크 플러그인 종류

  • bridge: private IP 로 컨테이너가 숨겨지고 포트 포워딩을 통해 외부로 노출시킬 수 있다.
  • host: 호스트 네트워크를 그대로 가져와서 사용한다.
  • null: 네트워크 셋팅을 하지 않는다.
  • ...

브릿지 네트워크

호스트 확인

인터페이스 확인

ip addr show
  • docker0: 브릿지
  • vethX: 가상 인터페이스

브릿지 확인 명령 설치

$ sudo apt install bridge-utils

포트 포워딩이 설정된 컨테이너

$ sudo iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.2:80
  • DNAT: Destination NAT

호스트 네트워크

호스트 네트워크를 공유해서 사용

$ docker run -d --network host httpd

Null 네트워크

네트워크가 없는 컨테이너 생성

$ docker run -d --network null httd

도커 호스트가 여러개 일 때 문제가 발생한다.

192.168.100.100 과 101 의 컨테이너 각각 한 대를 같은 호스트 네트워크 대역폭(192.168.100.100/24)에 놓고 싶다.

ipvlan 이나 macvlan 을 통해 구성을 해야 한다. 그래서 각각의 컨테이너를 192.168.100.103, 192.168.100.104 로 배치를 할 수 있게 된다.

ipvlan 이나 macvlan 은 컨테이너를 도커 호스트와 같은 네트워크 대역폭에 존재하게 해주는 방법이다.

하지만, 도커 호스트의 갯수가 엄청나게 많이 늘어나면(브로드 캐스트를 사용하기 때문에) 네트워크가 마비된다.

birdge 네트워크 생성

$ docker network create --driver bridge \\ 
--subnet 192.168.200.0/24 \\
--gateway 192.168.200.1 wordpress-network

도커 네트워크 확인

$ docker network inspect wordpress-network
[
    {
        "Name": "wordpress-network",
        "Id": "db07cfff76255ff417ae6b118e3233cf205b1dc60cc03c6f46f30e47118319bd",
        "Created": "2022-05-09T06:56:20.761463835Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.200.0/24",
                    "Gateway": "192.168.200.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

mysql 생성

$ docker run --platform linux/amd64 --name mysql -d -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=admin -e MYSQL_PASSWORD=1234 --restart always --cpus 0.5 --memory 1000m -v /tmp/docker/mysql:/var/lib/mysql --network wordpress-network --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci mysql:5.7

wordpress 생성

$ docker run --name wordpress -d --link mysql -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=admin -e WORDPRESS_DB_PASSWORD=1234 -e WORDPRESS_DB_NAME=wordpress --restart always --cpus 0.5 --memory 500m -p 80:80 -v /tmp/docker/wordpress:/var/www/html --network wordpress-network wordpress:5-apache

Docker Network

파일명으로 패키지 찾을 때

yum provides /usr/sbin/ip

ubuntu 에서는 apt-file search /usr/sbin/ip 로 찾을 수 있다.

VM 머신 안에 도커 브릿지가 컨테이너를 띄울 때 마다 veth 인터페이스를 컨테이너에 붙여준다. 그러면 VM 내부의 라우터를 통해 외부로 나갈 수 있다.

$ sudo apt install -y bridge-utils
$ brctl show 
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02423d0a04e3       no              veth35500bc
# nat 테이블 확인
$ sudo iptables -t nat -L -n  # -t 타입, -L 리스트, -n 숫자로 확인

ping 8.8.8.8, 핑 명령어를 보낼 때 위와 같은 과정을 거치게 된다.

netfilter 에서 MASQUERADE 로 인해 출발지 IP 를 변경한다. 왜냐하면 사설 IP 는 외부와 통신할 수 없기 때문이다.

즉, MASQUERADE 출발지의 사설 IP 를 공인 IP 로 변경해주는 것이다. 변경된 공인 IP - 사설 IP 정보는 NAT 테이블에 저장된다.

NAT 테이블에 저장된 사설 IP 정보를 보고 8.8.8.8 에서 보내준 response 가 들어오게 된다.

네트워크 플러그인 종류

  • bridge: private IP 로 컨테이너가 숨겨지고 포트 포워딩을 통해 외부로 노출시킬 수 있다.
  • host: 호스트 네트워크를 그대로 가져와서 사용한다.
  • null: 네트워크 셋팅을 하지 않는다.
  • ...

브릿지 네트워크

호스트 확인

인터페이스 확인

ip addr show
  • docker0: 브릿지
  • vethX: 가상 인터페이스

브릿지 확인 명령 설치

$ sudo apt install bridge-utils

포트 포워딩이 설정된 컨테이너

$ sudo iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.2:80
  • DNAT: Destination NAT

호스트 네트워크

호스트 네트워크를 공유해서 사용

$ docker run -d --network host httpd

Null 네트워크

네트워크가 없는 컨테이너 생성

$ docker run -d --network null httd

도커 호스트가 여러개 일 때 문제가 발생한다.

192.168.100.100 과 101 의 컨테이너 각각 한 대를 같은 호스트 네트워크 대역폭(192.168.100.100/24)에 놓고 싶다.

ipvlan 이나 macvlan 을 통해 구성을 해야 한다. 그래서 각각의 컨테이너를 192.168.100.103, 192.168.100.104 로 배치를 할 수 있게 된다.

ipvlan 이나 macvlan 은 컨테이너를 도커 호스트와 같은 네트워크 대역폭에 존재하게 해주는 방법이다.

하지만, 도커 호스트의 갯수가 엄청나게 많이 늘어나면(브로드 캐스트를 사용하기 때문에) 네트워크가 마비된다.

birdge 네트워크 생성

$ docker network create --driver bridge \\ 
--subnet 192.168.200.0/24 \\
--gateway 192.168.200.1 wordpress-network

도커 네트워크 확인

$ docker network inspect wordpress-network
[
    {
        "Name": "wordpress-network",
        "Id": "db07cfff76255ff417ae6b118e3233cf205b1dc60cc03c6f46f30e47118319bd",
        "Created": "2022-05-09T06:56:20.761463835Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.200.0/24",
                    "Gateway": "192.168.200.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

mysql 생성

$ docker run --platform linux/amd64 --name mysql -d -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=admin -e MYSQL_PASSWORD=1234 --restart always --cpus 0.5 --memory 1000m -v /tmp/docker/mysql:/var/lib/mysql --network wordpress-network --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci mysql:5.7

wordpress 생성

$ docker run --name wordpress -d --link mysql -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=admin -e WORDPRESS_DB_PASSWORD=1234 -e WORDPRESS_DB_NAME=wordpress --restart always --cpus 0.5 --memory 500m -p 80:80 -v /tmp/docker/wordpress:/var/www/html --network wordpress-network wordpress:5-apache
728x90