默认情况下,启动容器不加--net参数启动容器是可以通过docker0获取ip地址并连接网络的
手动配置更加灵活,并能了解原理和细节
1、启动容器,指定--net=none
[root@v77 run]# docker run -it --net=none -d tomcat:v3
24ca74a9f2a81478f1989035374cc059effe18b0644a3530de56d8b4abd65a12
此时容器无法连接网络
[root@v77 ~]# docker exec -it 24ca74a9f2a8 bash
root@24ca74a9f2a8:/usr/local/tomcat# ping www.sina.com.cn
ping: www.sina.com.cn: Temporary failure in name resolution
root@24ca74a9f2a8:/usr/local/tomcat#
root@24ca74a9f2a8:/usr/local/tomcat# ping www.baidu.com
ping: www.baidu.com: Temporary failure in name resolution
2、查询容器的进程ID
[root@v77 run]# docker inspect -f '{{.State.Pid}}' 24ca74a9f2a8
6663
3、为容器的进程创造命名空间
[root@v77 run]# mkdir -p /var/run/netns
[root@v77 run]# ln -s /proc/6663/ns/net /var/run/netns/6663
4、查询docker0的IP
[root@v77 ~]# ip addr | grep docker0
docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
inet 172.17.0.1/16 scope global docker0
5、创建veth peer的接口A和B,将接口A桥接到docker0,将接口B放到容器的第三步定义的命名空间,并命名为eth0,指定IP地址,并指定网络缺省的下一跳地址为物理机的docker0的IP
[root@v77 run]# ip link add A type veth peer name B #创建veth peer的接口A和B
[root@v77 run]# brctl addif docker0 A #将接口A桥接到docker0
[root@v77 run]# ip link set A up #UP该端口
[root@v77 run]# ip link set B netns 6663 #将接口B放到容器的第三步定义的命名空间
[root@v77 run]# ip netns exec 6663 ip link set dev B name eth0 #命名为eth0
[root@v77 run]# ip netns exec 6663 ip link set eth0 up #UP该端口
[root@v77 run]# ip netns exec 6663 ip addr add 172.17.0.99/16 dev eth0 #指定容器的IP地址
[root@v77 run]# ip netns exec 6663 ip route add default via 172.17.0.1 #指定网络缺省下一跳地址为物理机docker0的IP
6、测试网络,eth0为上一步指定的IP,下一跳物理机docker0也将数据包转发出去,可以ping通外网
root@24ca74a9f2a8:/usr/local/tomcat# ip addr | grep eth0
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 172.17.0.99/16 scope global eth0
root@24ca74a9f2a8:/usr/local/tomcat# ping www.baidu.com
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=127 time=16.8 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=127 time=12.8 ms