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