Docker networks
基于 namespace 的 network 网络隔离
一个样例
- # 创建两个 network namespace
- ip netns add ns1
- ip netns add ns2
- # 创建成对的网卡设备
- sudo ip link add veth-a type veth peer name veth-b
- # 将网卡分别放在两个 namespace 中
- sudo ip link set veth-a netns ns1
- sudo ip link set veth-b netns ns2
- # 启用两个网卡
- sudo ip netns exec ns1 ip link set dev veth-a up
- sudo ip netns exec ns2 ip link set dev veth-b up
- # 为两个网卡分配 ip 地址信息
- sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth-a
- sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth-b
- # 验证网络连通性
在 ns1 中执行 ping veth-b
- sudo ip netns exec ns1 ping 10.0.0.2
- overlay network
- consul
- docker run -d -p 8500:8500 --restart=always --name=consul progrium/consul -server -Bootstrap -advertise=172.17.0.200
- # nohup consul agent -server -Bootstrap -ui -data-dir /var/lib/consul -client=10.0.0.2 -bind=10.0.0.2 &> /var/log/consul.log &
其他节点 docker.service configure
- systemctl status docker.service # 查看 docker.service 在什么位置
- ExecStart=/usr/bin/dockerd -H fd:// --cluster-store=consul://172.17.0.200:8500 --cluster-advertise=ens33:2376
- # ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --cluster-store consul://10.0.0.2:8500 --cluster-advertise 10.0.0.2:2375
- # ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --cluster-store consul://10.0.0.2:8500 --cluster-advertise 10.0.0.3:2375
在 consul 中查看服务是否被发现
url: http://172.17.0.200:8500/ui/#/dc1/kv/docker/nodes/
创建 overlay 网络
- docker network create -d overlay ov1
- root@node1:~# docker network ls
- NETWORK ID NAME DRIVER SCOPE
- ba720f1ef854 bridge bridge local
- 5b69a097a085 host host local
- 9c19e28d7789 none null local
- baa622c89664 ov1 overlay global *
- root@master:~# docker network ls |grep ov1
- baa622c89664 ov1 overlay global *
- root@node2:/etc/apt# docker network ls | grep ov1
- baa622c89664 ov1 overlay global *
- # check logs
- [node2]docker run -itd --name busybox01 --network=ov1 busybox
- docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' f454d47dd873 ## 查找 ip
- # error
- docker: Error response from daemon: endpoint with name busybox01 already exists in network ov1.
- root@node1:~# docker run -itd --name busybox02 --network ov1 busybox
- d7f1a2c5d81c33513269ba99306b6f5cb7f64e02ab7583552f8fe71aab719952
- root@node1:~# docker exec busybox02 ping -c 4 busybox01
- PING busybox01 (10.0.0.2): 56 data bytes
- 64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.760 ms
- 64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.521 ms
- check netns
- ln -s /var/run/docker/netns /var/run/netns
- ip netns list
重启
如果 docker host 被关机了, 重启后没有原先创建的 overlay 网络, 此时就要查看 docker host 上的 consul/(k/v) 服务是否停掉了;
macvlan
打开网卡的混杂模式
- root@node2:~# ip link show ens33
- 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
- link/ether 00:0c:29:27:f1:72 brd ff:ff:ff:ff:ff:ff
- ip link set ens33 promisc on
- root@node2:~# ip link show ens33
- 2: ens33: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
- link/ether 00:0c:29:27:f1:72 brd ff:ff:ff:ff:ff:ff
vmware/VirtualBox 也需要打开混杂模式
- create macvlan
- root@node1:~# docker network create -d macvlan --subnet=172.16.0.0/24 --gateway=172.16.0.1 -o parent=ens33 macnet01 #在 node2 上同样运行此命令
- root@node1:~# docker network ls | grep macnet01
- 0f2f883adb06 macnet01 macvlan local
- docker run -itd --name busybox04 --ip 172.16.0.3 --network macnet01 busybox
- root@node1:~# docker exec busybox04 ping -c 4 172.17.0.4
- root@node2:~# docker exec busybox05 ping -c 4 172.17.0.3
docker network namespace 的开源管理工具
netenter https://github.com/jpetazzo/nsenter
pipework 网络
docker 容器网络配置工具
https://github.com/jpetazzo/pipework
Docker 高级网络实践
Linux network namespace(命令行下)
创建一个 network namespace
显示 network namespace
删除 network namespace
在 network namespace 中执行 shell 命令
来源: http://www.bubuko.com/infodetail-2876481.html