场景描述:在vm1和vm2上各部署一个docker容器,默认情况下,一个容器宿主机上的容器能够直接用私网IP地址通信,因为它们利用一个网桥接在一起。而不同宿主机上的容器无法直接用私网IP地址通信。k8s等docker部署软件中的网络组建实际上完成了这部分工作,让不同宿主机的容器能够直接通信。本节使用原生docker,以及在宿主机上自建的vxlan网络接口,来打通不同宿主机上容器,让它们可以直接利用内网IP通信。
注意:因为实验在云上的虚拟机上完成,上面提到的容器宿主机,用的是云上的虚拟机。容器宿主机也可以是物理机,实验效果不变。
准备docker容器安装docker的过程不展开了,docker官方文档有详细的描述。在Linux安装了docker后,可以看到多了一个docker0的网络接口,默认在172.17.0.0/16网段。这个是连接本地多个容器的网桥。
# ifconfig docker0 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 ether 02:42:44:e8:74:e8 txqueuelen 0 (Ethernet) RX packets 6548 bytes 360176 (351.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 7489 bytes 40249455 (38.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
使用默认172.17.0.0/16网段,docker容器的IP地址都会从172.17.0.2开始分配。为了能使vm1和vm2上的容器使用不同的IP地址,在利用docker run启动容器的时候需要能自定义IP地址,而利用--ip参数自定义IP地址的功能只能在自定网络中支持,所以先创建一个自定义网络,指定网段172.18.0.0/16。
# docker network create --subnet 172.18.0.0/16 mynetwork 3231f89d69f6b3fbe2550392ebe4d00daa3d19e251f66ed2d81f61f2b9184362 # docker network ls NETWORK ID NAME DRIVER SCOPE 1cb284a6cb33 bridge bridge local 069538be0246 host host local 3231f89d69f6 mynetwork bridge local 0b7934996485 none null local
利用docker network ls查看,可以看到一个新的bridge网络被创建,名称为我指定的mynetwork。利用ifconfig可以看到多了一个网络接口,名字不是dockerXX,而直接以br开头,是一个网桥。
br-3231f89d69f6: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255 ether 02:42:97:22:a5:f9 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
创建一个新的容器,如下:
# docker run -itd --net mynetwork --ip 172.18.0.2 centos 16bbaeaaebfccd2a497e3284600f5c0ce230e89678e0ff92f6f4b738c6349f8d
--net指定自定义网络
--ip指定IP地址
centos指定image
查看容器ID和状态,并且登录SHELL,如下:
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 16bbaeaaebfc centos "/bin/bash" 2 minutes ago Up 2 minutes condescending_swartz # docker exec -it 16bbaeaaebfc /bin/bash [root@16bbaeaaebfc /]# ifconfig bash: ifconfig: command not found
注意:docker为了创建容器的效率,通常都用了size很小的image,意味着很多常用工具需要安装,比如centos image里面的ifconfig。可以利用yum whatprovides ifconfig命令查看ifconfig输入哪个包,查到属于net-tools-2.0-0.22.20131004git.el7.x86_64包,直接用yum install net-tools -y安装即可。再执行ifconfig命令,可以看到容器eth0网卡的IP地址为172.18.0.2。
[root@16bbaeaaebfc /]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.0.2 netmask 255.255.0.0 broadcast 172.18.255.255 ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet) RX packets 3319 bytes 19221325 (18.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2015 bytes 132903 (129.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0