在说docker network之前,先说一个很重要的概念,namespace,下面详细描述网络命名空间:
namespace
#ip netns help ------关于网络命名空间的操作
#ip netns add n1 -----------创建网络命名空间
#ip netns list -----------列出当前网络命名空间
#ip netns exec n1 ifconfig -a ---------进入到n1这个命名空间中执行命令
下面对namespace举例说明:
-
1.添加一对虚拟网卡(type为veth,成对出现):
#ip link add name veth1.1 type veth peer name veth1.2
可以发现两个虚拟网卡添加成功。 -
2.将其中一块虚拟网卡放在命名空间n1:
#ip link set dev veth1.2 netns n1 进入n1命名空间内,可以看到veth1.2这个虚拟网卡,已经放在命名空间内;
-
3.可以给命名空间内虚拟网卡改名字:
#ip netns exec n1 ip link set dev veth1.2 name eth0
-
4.将该网卡激活 #ifconfig veth1.1 10.1.0.1/24 up
#ip netns exec n1 ifconfig eth0 10.1.0.2/24 up -
5.验证宿主机和n1命名空间内是否可以通信:
#ping 10.1.0.2 -
6.将宿主机这个veth1.1这个虚拟网卡放在n2这个命名空间:
#ip link set dev veth1.1 netns n2 注意:移过去后,默认不被激活,将他激活
#ip netns exec n2 ifconfig veth1.1 10.1.0.1/24 up -
7.在n2命名空间ping n1 地址:
#ip netns exec n2 ping 10.1.0.2
容器网络
回顾下,之前讲过容器4重网络容器类型:closed container,bridge container,joined container,open container;下面单个详细描述这几种类型:
- 1.closed container:
不能与外部容器通信,是个封闭容器,–rm意思是退出后删除容器。 - 2.bridge container
-h 后面加主机名,代表容器启动时给容器注入主机名。 也可以加入:–dns 加dns地址代表可以在容器启动时,注入dns地址。 具体参数很多,可以通过docker run --help查询。 - 3.open container Docker0为NAT桥,
- 4.joined container 联盟式容器:User,Pid,Mount,各命名空间有自己的,UTS,IPC,Net,为共享。 先启动第一个容器:
#docker run --name b1 -it --rm busybox
在启动一个容器:
#docker run --name b2 --network container:b1 -it --rm busybox
注:–network container:b1:表示b2这个容器要共享容器b1的网络命令空间
可以看到b1和b2ip地址都一样
在b1容器下操作:
#mkdir /tmp/smallboy
在b2容器上面查看,发现没有:
说明Mount是隔离的
验证网络共享:
在b1操作:
#echo “The small boy likes writing codes” > /tmp/index.html
启动http服务:
在b2上面访问:
#wget -O - -q 127.0.0.1
发现是可以访问到,说明net名称空间确实共享了。类似于一台主机上面运行两个进程。
想让外部直接访问容器,把该容器的network设置为host模式,外部直接就可以访问容器了。
修改docker0默认ip地址
#systemctl stop docker -----停掉docker服务
#vim /etc/docker/daemon.json -------修改配置,定义网络ip地址
{
“insecure-registries”: [ “10.0.38.77”],
“bip”: “10.0.0.1/16” --------增加:bip为bridge ip 为docker0的ip 地址
}
#systemctl daemon-reload
#systemctl start docker
想让其他主机连入本地docker机器,配置如下
#vim /usr/lib/systemd/system/docker.service
在ExecStart后面添加 -H tcp://0.0.0.0:2375
#systemctl daemon-reload
#systemctl restart docker
从其他主机执行命令:
#docker -H <对方主机IP> :2375 ps -----查看对方主机运行容器
创建自定义网络类型:
#docker network create -d bridge --subnet “172.26.0.0/16” --gateway “172.26.0.1” mybridge
用自定义网络创建容器: