Docker容器通信
一、docker除了ip通信还可以通过容器名称通信
1、dns前面例子
https://blog.csdn.net/YiSean96/article/details/105443895
2、joined容器:
一种较为特别的网络模式,使用–network container:vm1,和指定容器共用网络,可以使用localhost快速高效通信
docker run -it --name vm2 --network mynet2 --ip 192.168.0.100 busybox
docker run -it --name vm1 --network container:vm2 busybox #和容器共享ip
docker run -d --name vm1 --network mynet1 nginx
docker inspect vm1
"IPAddress": "172.22.0.2",
docker run -it --name vm2 --network container:vm1 busybox #两个容器ip共同
3、link
–link 可以链接两个容器
–link <要连接的容器name/id>:alias(别名)
docker run -d --name vm1 nginx #随机分配ip没有dns解析
docker run -it --rm --link vm1:nginx busybox
ping vm1
ping nginx #别名/容器名称均可通,两容器已链接
二、访问外网
通过iptables的SNAT实现
1、容器如何访问外网:
容器–docker0–NAT–enp0s3–network
2、外网访问容器。用docker-proxy实现,宿主机访问容器用iptables DNAT
(1)端口映射
docker run -d --name vm1 -p 80:80 nginx
curl 172.25.1.1 #外网访问
(2)host和宿主机共享ip,外网访问宿主机。
network–enp0s3–docker-proxy–docker0–容器
Docker跨主机容器网络
实现集群主机上容器节点互通
CNM:
Sandbox:容器网络栈,包括容器接口、DNS、路由器。
Endpoint:作用是将Sandbox接入network中。
Network:包含一组Endpoint,同一个network的Endpoint可以通信。
1、macvian网络方案实现
Linux kernel提供的一种网卡虚拟化技术
无需桥接,直接使用物理接口,性能好。
(1)两个虚拟机上各加一个网卡并配置网络
[root@server1 network-scripts]# cat ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
[root@server2 network-scripts]# cat ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
ifup eth1 #开机自动激活网络
ip link set eth1 promisc on
(2)在两台docker主机上创建macvian网络
ping server1 #首先确保两台主机通畅
server1:
docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=eth1 mynet1
docker run -it --name vm1 --rm --network mynet1 --ip 172.20.0.100 busybox #查看分配ip
问题
server2:
docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=eth1 mynet1
[root@server2 docker]# docker run -it --name vm2 --rm --network mynet1 --ip 172.20.0.200 busybox
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"write /proc/self/attr/keycreate: permission denied\"": unknown.
#“write /proc/self/attr/keycreate: permission denied” 表示文件没有写入权限,被拒绝访问了
selinux是linux为了系统安全性做的控制,会控制用户可以访问、读取、修改哪些文件,比如,前面的write /proc/self/attr/keycreate文件没有权限,就是被selinux控制了。
selinux有三种模式:enforcing 强制 permissive 宽容的 diabled 禁止的,顾名思义,权限限制,从高到低。
ping 172.20.0.100/200 #容器ip可以互通
问题:macvian独占主机网拉问题。可以使用vlan子接口实现多macvlan网络,vlan可将物理二层网络划分为4094个逻辑网络。
(3)vlan子接口实现多macvlan网络
server1:
docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth1.1 mynet2
server2:
docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth1.1 mynet2