docker 再认识2
docker-network
一.从底层命令了解network-namespaces的连接机制
实验要求:通过在本地创建network-namespaces,模拟docker之间的网络连接状态
查看本地的network-namespace:ip netns list
创建本地network-namespaces(创建两个网络命名空间):
ip netns add ceshi1
ip netns add ceshi2
查看ceshi1和ceshi2中的网络列表和ip地址:
ip netns exec ceshi1 ip a
ip netns exec ceshi1 ip link
在本地创建一对veth网络接口:
ip link add veth-ceshi1 type veth peer name veth-ceshi2
从本地查看网络接口:
ip link
本地查看网络接口将网络接口添加到网络命名空间中:
ip link set veth-ceshi1 netns ceshi1
ip link set veth-ceshi2 netns ceshi2
到网络空间中查看网络接口:
ip netns exec ceshi1 ip a
ceshi1的虚拟网络ip netns exec ceshi2 ip a
ceshi2的虚拟网络此时本地已经没有veth-ceshi1和veth-ceshi2了并且在网络命名空间中,网络接口还没有ip地址状态还是Down。
添加ip地址和将状态改为up状态
添加ip地址:
ip netns exec ceshi1 ip addr add 192.168.100.2 dev veth-ceshi1
ip netns exec ceshi2 ip addr add 192.168.100.3 dev veth-ceshi2
修改状态:
ip netns exec ceshi1 ip link set dev veth-ceshi1 up
ip netns exec ceshi2 ip link set dev veth-ceshi2 up
查看此时的ip地址和状态:
ceshi1的ip ceshi2的ip测试连通性:
ceshi1 ---->ping ceshi2:
pingceshi2----->ping ceshi1:
ping二.网络内部结构图:
网络内部结构图容器中的虚拟网络接口会和本地的一个虚拟网络接口连接,本地的虚拟网络接口再连接到docker0接口上,实现网络的连通。
查看有那些接口连接到docker0上:
yum install bridge-utils -y
brctl show ----->查看
三.网络接口信息如下:
本地:
本地虚拟网卡docker中虚拟网络接口:
虚拟网络接口docker0本地连接虚拟网络接口:
本地连接虚拟网络接口四.容器间的连通----->通过容器名而不是ip地址----> link
创建一个叫apache的容器:
docker run -itd --name apache ubuntu:14.04 /bin/bash
创建一个叫mysql的容器并且连接到apache容器上:
docker run -itd --name mysql --link apache ubuntu:14.04 /bin/bash
通过mysql容器ping apache容器:
link之间的连通性查看mysql容器中hosts文件内容:
注意:link之间是有方向性的,
hosts内容此处mysql可以通过ping容器名称apache连接到apache容器,但是反过来,apache容器通过mysql容器名是ping不同的,但是ip地址是通的。
五.自定义bridge网络:
创建自定义的bridge网络: docker network create -d bridge mybridge
查看新创建的bridge网络: docker network ls
创建新的容器并且使用新的bridge网络:
docker run -itd --name php --network mybridge ubuntu:14.04 /bin/bash
查看bridge网络详细信息: docker network inspect mybridge
将已存在的容器添加到自定义的bridge网络中:
docker network connect mybridge mysql
由于mysql和php都在自定义的bridge网络中,此时通过容器名称可以实现相互ping通
自定义网络连通性虚拟网络接口