让外网能否访问容器的端口映射方法:
1. 手动指定端口映射关系
两台虚拟机, 第一台映射端口 (第二台访问宿主机端口, 就是访问容器端口 curl 192.168.1.1:90 .)
docker run -itd --name web1 -p 90:80 nginx:latest
2 > 从宿主机随机映射端口到容器,
docker run -itd --name web2 -p 80 nginx:latest
3》从宿主机随机映射端口到容器, 容器内所有暴漏端口, 都会一一映射.
docker run -itd --name web4 -P nginx:latest
Join 容器: container(共享网络协议栈)
容器和容器之间.
- docker run -itd --name web5 busybox
- docker run -itd --name web6 --network container:web5 busybox:latest
- docker exec -it web6 /bin/sh
- echo 6666666> /tmp/index.html
- httpd -h /tmp/
- docker exec -it web5 /bin/sh
- get -O - -q 127.0.0.1
- 6666666
这时会发现, 两个容器的 ip 地址一样.
PS: 这种方法的使用场景:
由于这种网络的特殊性, 一般在运行同一服务, 并且合格服务需要做监控, 以及日志收集, 或者网络监控的时候, 可以选择这种网络.
Docker 的跨主机网络解决方案.
overlay 的解决方案.
实验:
作业:
1) 实现容器的跨主机通信, 使用 Overlay 网络的方式实现.
2) 准备 3 台 dockerHost, 基于上述创建的 Overlay 网络创建容器服务. docker01 上基于 busybox 镜像运行服务, 名称为: 自己名称 + t1. docker02 上基于 busybox 镜像运行服务, 名称为: 自己名称 + t2. docker03 上基于 busybox 镜像运行服务, 名称为: 自己名称 + t3.
3) 要求容器使用指定网段, 10.10.10.0/16 网段. IP 地址分别为:
t1: 10.10.10.6 t2: 10.10.10.8 t3: 10.10.10.10
4) 要求 3 个容器可以分别实现 IP 和容器名称的通信.
myprogrium-consul.tar
实验环境 consul : 是数据中心
- docker01 docker02 docker03
- 192.168.1.1 ,192.168.1.20 ,192.168.1.30
暂时不考虑防火墙, 和 selinux 安全问题.
将三台 dockerhost 防火墙和 selinux 全部关闭, 并且分别更改主机名为, docker01 docker02 docker03
更改主机名.
- hostnamectl set-hostname docker01
- su -
关闭防火墙.
- systemctl stop firewalld.service
- systemctl disable firewalld.service
- setenforce 0
在 docker 上操做
导入
docker run -d -p 8500:8500 -h consul --name consul --restart always progrium/consul -server -Bootstrap
PS: 容器生产, 之后, 我们可以通过浏览器访问 consul 服务, 验证 consul 服务是否正常, 访问 dockerHost 加映射端口.
如果出现这个, 是因为刚更改防火墙需重启 docker
- systemctl restart docker
- docker start consul
访问 consul
http://192.168.1.1:8500/ui/#/dc1/services
修改 docker02 和 docker03 上的 docker 配置文件,
VIM /usr/lib/systemd/system/docker.service (加)
- /var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store
- =consul://192.168.1.1:8500 --cluster-advertise=ens33:2376
保存退出
重启
- systemctl daemon-reload
- systemctl restart docker (重启 docker)
返回浏览器 192.168.1.1 的 consul 界面
在, docker02 上创建一个自定义网络,
- docker network create -d overlay --subnet 10.10.10.0/16 ov_net1
- docker network create -d overlay ov_net1
- docker network ls(2,3 台都会有)
在 docker02 上创建的网络, 我们可以看到它的 scope 定义的是 global(全局), 意味着加入到 consul 这个服务的 docker 服务, 都可以看到我们自定义的网络,
同理如果是用此网络创建的容器, 会有两张网卡.
默认这张网卡, 的网段是 10.0.0.0 网段, 如果想要 docker01 也可能看到这个网络, 那么也只在 docker01 的 docker 配置文件添加相应内容即可
注意 global; 表示全局的意思
同理, 因为是自定义网络, 符合自定义网络的特性, 可以直接通过 docker 容器的名称相互通信, 当然也可以在自定义网络的时候, 指定它的网段, 那么使用此网络的容器也可以指定 IP 地址.
在 docker01 上也添加
并重启
- systemctl stop docker.service
- systemctl start docker.service
在 docker01 -----docker03 上创建 t1,t2,t3
自己的名称 + t1,t2,t3
指定 IP 地址
- docker run? -itd --name lbst1 --network ov_net1 --ip 10.10.10.6 busybox:latest
- docker run? -itd --name lbst1 --network ov_net1 --ip 10.10.10.8 busybox:latest
- docker run? -itd --name lbst1 --network ov_net1 --ip 10.10.10.10 busybox:latest
不指定 IP 地址
- docker run -itd --name t1 --network ov_net1 busybox:latest
- docker run -itd --name t2 --network ov_net1 busybox:latest
- docker run -itd --name t3 --network ov_net1 busybox:latest
进入 t1 ping docke02 到 03
docker exec -it t1 /bin/sh
进入 t2ping docker01 与 03
进入 t3ping docker01 与 02
另一种跨主机网络 MacVlan
Docker 跨主机网络方案之 MacVlan
实验环境: vlan(局域网)
- Docker01 docker02
- 192.168.1.1 192.168.1.20
关闭防火墙和禁用 selinux, 更改主机名.
- systemctl stop firewalld.service
- systemctl disable firewalld.service
- setenforce 0
关闭防火墙与 selinux, 需要重启一下 docker
- systemctl daemon-reload
- systemctl restart docker
Macvlan 的单网络通信
1》打开网卡的混杂模式 (需要在 docker02 到 docker01 都需要开启)
ip link show ens33(查看网卡)
开启混杂模式
ip link set ens33 promisc on
2》在 docker01 上创建 macvlan 网络
docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
PS: -o parent = 绑定在那张网卡之上.
3》基于创建的 macvlan 网络运行一个容器
docker run -itd --name bbox1 --ip 172.22.16.10 --network mac_net1 busybox
4 > 在 dcker02 上创建的 macvlan 网络, 注意与 docker1 上的 macvlan 网络一摸一样
docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
5》在 docker2 上, 基于创建的 macvlan 网络运行一个容器, 验证与 docker01 容器的通信
docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox
Macvlan 的多网络通信 (真实接口不够用的问题)
验证内核模块 8021q 封装
Macvlan 需要解决的问题, 基于真实的 ens33 网卡, 生产新的虚拟网卡
1》Docker01 到 docker02 验证内核模块
modinfo 8021q
如果内核模块没有开启, 加载内核模块
modprobe 8021q
> 2》基于 ens33 创建虚拟网卡
- cd /etc/sysconfig/network-scripts/
- VIM /etc/sysconfig/network-scripts/ifcfg-ens33
修改 ens33 网卡的配置文件
手动添加虚拟网卡的配置文件
cp -p ifcfg-ens33 ifcfg-ens33.10
PS: -p 保留源文件或目录的属性
修改 ens33.10
创建第二个虚拟网卡配置文件
- cp -p ifcfg-ens33.10 ifcfg-ens33.20
- VIM ifcfg-ens33.20
3》Docker01 上的操做启用创建的虚拟网卡
- ifup ifcfg-ens33.10
- ifup ifcfg-ens33.20
4》基于虚拟网卡, 创建 macvlan 的网络
- docker network create -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10
- docker network create -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20
- scp -p ifcfg-ens33.10 ifcfg-ens33.20 192.168.1.20:/etc/sysconfig/network-scripts/
创建容器 (docker01 到 docker02)
- docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.1:5000/test:latest
- docker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.1:5000/test:latest
5》基于上述创建的 macvlan 网络, 运行对应的容器, 不过这里需要注意, 运行的容器与网络对应的网段相符合, 还需注意, ip 地址的唯一性.
6》在 docker02 上进行操做, 创建网络机容器
这里只需要, 我们在这里的操做跟 docker01 上的一摸一样, 操做顺序大致为:
1. 验证 8021q 内核封装
2. 基于 ens33 网卡创建新的虚拟网卡, esn33.10 和 ens33.20(注意和 docker01 上 ens33.10 和 ens33.20 必须是在同一网段, 且 ip 不能冲突)
3. 基于此网络运行容器,(注意和 docker01 上的容器, 都是基于刚刚创建的 macvlan 网络, 但 ip 地址不能冲突)
7》验证:
注意: Vmware 的网络必须是桥接 (Bridge)
在 docker01 上进入容器 bbox10 和 docker02 上的 bbox1 进行通信
在 docker01 上进入容器 bbox20 和 docker02 上的 bbox21 进行通信
个人总结: macVlan 网络的实现原理及步骤
原理:
1. 基于宿主机的网卡的修改配置多个虚拟网卡.
2. 基于虚拟网卡创建 macvlan 网络
3. 基于虚拟网络创建要求的容器
步骤: 1. 验证 8021q 内核封装
2. 基于 ens33 网卡创建新的虚拟网卡, esn33.10 和 ens33.20(注意和 docker01 上 ens33.10 和 ens33.20 必须是在同一网段, 且 ip 不能冲突)
3. 基于此网络运行容器,(注意和 docker01 上的容器, 都是基于刚刚创建的 macvlan 网络, 但 ip 地址不能冲突)
来源: http://www.bubuko.com/infodetail-3397311.html