2019独角兽企业重金招聘Python工程师标准>>>
要点:
1.首先需要在宿主机上虚拟出来一个真实可用桥接网卡比如br0
2.docker启动的时候默认使用br0进行桥接网络
3.创建docker容器的时候使用--net=none模式
4.手动为每个创建的容器生成静态ip。但是ip每次在重启容器的时候就会失效
这样的方式其实也是必须自己维护一个ip资源池,不然的话可能ip有问题就会导致不能访问
其实还是利用了docker桥接网络的模式,在宿主机创建一对虚拟网卡,然后将一块桥接到本地网桥上,经另外一块网卡通过容器的命名空间绑定到该容器上,然后对容器 命名空间中的网卡进行设置ip。
理解了netns相应的原理之后可以进行模拟实践:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jdk6-tomcat6-sshd-new latest ee3e2b60058d 4 days ago 970.3 MB创建一个无网络环境的容器sshd-test,该容器创建好后默认只会有一个lo回环网口。
# docker run -itd --name sshd-test -h testssh --net=none jdk6-tomcat6-sshd-new
3ceb61136590f1362be67f1911591d0b3ca41657c6b33f45982b0df4489f5f73获取该容器的PID为13157,后面会用到
# docker inspect -f "{{.State.Pid}}" 3ceb61136590f1362be67f1911591d0b3ca41657c6
13157添加一对虚拟网卡,分别为veth_3ceb6和eth0
# ip link add veth_3ceb6 type veth peer name eth0
将虚拟网卡veth_3ceb6桥接到br0上
# brctl addif br0 veth_3ceb6
激活veth_3ceb6网卡,并容器内部的网卡eth0绑定到该容器的网络命名空间内
# ip link set veth_3ceb6 up
# ip link set eth0 netns 13157
将该容器的网络命名空间暴露出来
# mkdir -p /var/run/netns
# ln -s /proc/13157/ns/net /var/run/netns/13157 此时查看该容器就会发现已经多了一块网卡eth0@if850
# docker exec sshd-test ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
849: eth0@if850: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN qlen 1000link/ether 46:0a:e8:5b:ac:c0 brd ff:ff:ff:ff:ff:ff查看网络状况,新加的网卡名称为eth0
# docker exec sshd-test ifconfig -a
eth0 Link encap:Ethernet HWaddr 46:0A:E8:5B:AC:C0 BROADCAST MULTICAST MTU:1500 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)通过netns激活该容器内部的eth0网卡,并添加网络信息
# ip netns exec 13157 ip link set dev eth0 name eth0
# ip netns exec 13157 ip link set eth0 up
# ip netns exec 13157 ip addr add 10.0.0.2/23 dev eth0
# ip netns exec 13157 ip route add default via 10.0.0.254
完成最后的网络信息的添加后,就可以实现给该容器附加一个独立vlan中的网络。
以上操作相当于是手工给容器设置了一个网络栈,并通过netns将可用的IP附加到容器内部,以实现最基本的容器内部固定ip,且和宿主机共享vlan。
参考文档: https://yaxin-cn.github.io/Docker/docker-container-use-static-IP.html https://www.xiaomastack.com/2015/02/06/docker-static-ip/ http://blog.csdn.net/samxx8/article/details/46776073