Docker基础<7>---容器通信及跨主机容器网络

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值