4

云原生之Docker容器跨主机指定IP通信

 1 year ago
source link: https://www.51cto.com/article/714443.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

云原生之Docker容器跨主机指定IP通信-51CTO.COM

3d0bfa812bfb512e581d90148681cb7b.jpg
云原生之Docker容器跨主机指定IP通信
作者:mc_开发者 2022-07-20 15:19:17
对开发者而言,随着容器的普遍使用,开发者可以很方便的搭建项目的简易测试环境。
6923d0855456878f61628608cf0ab05b87c177.png

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

1、使用场景

对开发者而言,随着容器的普遍使用,开发者可以很方便的搭建项目的简易测试环境。有时候为了项目可以在任意机器一键运行,不用配置连接IP等信息。所以希望可以提前固定容器的IP地址,而且一个项目有时候涉及多个容器,可能还会部署在多台机器上。所以如果容器间可以固定IP跨机器通信的话,会有很大方便。

2、docker网络

  • docker容器默认是一个有自己独立网络空间的虚拟系统。
  • docker安装后自动创建3中网络:bridge、host、none。
  • bridge:网桥模式,默认创建docker0网桥,172.17.0.0/16,宿主机可访问,外部机器不可见。
  • host:共享宿主机网络模式,外部主机与容器直接通信,容器缺少了隔离性。
  • none:禁用网络模式。
  • docker自定义网络
    docker提供了三种自定义网络驱动:bridge、overlay、macvlan。
  • bridge驱动类似默认的bridge网络模式。
  • overlay和macvlan是用于创建跨主机网络。
  • 支持自定义网段、网关,docker network create --subnet 172.77.0.0/24 --gateway 172.77.0.1 my_net。
  • docker创建容器使用默认docker0网络不支持自定义固定IP,都是动态的。

3、自定义网络使用

  1. 自定义创建网段。docker network create --subnet=172.18.0.0/16 spark-net。
  2. 指定网络驱动docker network create -d overlay --subnet 10.22.1.0/24 --gateway 10.22.1.1 spark-net-0。
  3. 创建容器固定IP。
docker run --name cloud1 \
--net spark-net --ip 172.18.0.2 \
-h cloud1 \
-it ubuntu
docker run --name cloud1_0 \
--network spark-net-0 --ip 10.22.1.26 \
-h cloud1 \
-it ubuntu

二、实践操作

1、Overlay网络模式详解

  • Overlay网络是目前比较主流的跨节点容器间数据传输和路由方案。
  • Overlay网络模式在主机网络之上,在多个Docker主机之间实现分布式网络,允许跨容器之间的交互。
  • Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。

2、Consul服务发现

  • Consul是一个分布式、高可用性和多数据中心感知工具,用于服务发现、配置和编排。Consul 支持大规模快速部署、配置和维护面向服务的架构。
  • 部署单节点的consul服务(可选择公网服务器,或者能与其他部署容器通信的主机)。
# 拉取镜像
docker pull progrium/consul
# 运行consul容器
docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -server -bootstrap
# -h:表示consul的主机名
# --name consul:表示为该容器名
# --restart=always表示可以随着docker服务的启动而启动;
# 运行consul容器,该服务的默认端口是8500;-p:表示将容器的8500端口映射到宿主机的8500端口
# -serve -bootstarp:表示当在群集中,加上这两个选项可以使其以master的身份出现
  • 管理访问地址
    http://IP:8500/ui/#/dc1/kv/docker/nodes/。

3、修改docker配置

# 所有需要通信的机器都需要修改
 vim /etc/docker/daemon.json
 # 增加 cluster-store、cluster-advertise两个参数
 {
  "registry-mirrors": ["https://xxxx.xxxx.aliyuncs.com","https://registry.docker-cn.com"],
  "cluster-store": "consul://IP:8500",
  "cluster-advertise": "ens33:2376"
 }
 # cluster-store,是配置sonsul集群的访问地址
 # cluster-advertise,是广播通信地址和端口
 # 重启docker
 systemctl daemon-reload
 systemctl restart docker
 #如果有端口拒绝访问问题,可直接关掉防火墙
 #停止firewall
 systemctl stop firewalld.service
 #禁止firewall开机启动
 systemctl disable firewalld.service
 #查看开放端口列表
 firewall-cmd --list-ports

4、实践机器规划

本文实践创建了3台虚机:192.168.17.150 192.168.17.151 192.168.17.152。

5、创建overlay网络

  • 选其中一台机器执行,例如在192.168.17.150执行
# 创建overlay网络,并自定义制定网段以及网关
# 可以通过制定不同的网段,以隔离不同的服务
docker network create -d overlay --subnet 10.22.1.0/24  --gateway 10.22.1.1 spark-net
# 每台机器查看创建的网络
docker network ls
# 查看具体信息
docker network inspect spark-net
  • 删除网络命令
# 删除自定义网络
docker network rm spark-net
# 如果有已连接的,先断开连接
docker network disconnect -f net-spark con1
  • 注意
    例如:在cloud1机器上,可以执行docker network disconnect -f spark-net cloud2但是执行docker network disconnect -f spark-net cloud1就无效,必须跨机器执行断连。

6. 跨主机创建容器验证

本文依赖上篇文章创建了3个容器, 可查看 ​​Docker搭建大数据平台之Hadoop,Spark,Hive初探​​。

192.168.17.150机器上执行。

docker run --name cloud1 \
 -p 50070:50070 \
 -p 8088:8088 \
 -p 8080:8080 \
 -p 7077:7077 \
 -p 9000:9000 \
 -p 16010:16010 \
 --network net-spark --ip 10.22.1.26 \
 -h cloud1 \
 --add-host cloud1:10.22.1.26 \
 --add-host cloud2:10.22.1.27 \
 --add-host cloud3:10.22.1.28 \
 -it spark:v4

192.168.17.151机器上执行。

docker run --name cloud2  \
 --network net-spark --ip 10.22.1.27 \
 -h cloud2 \
 --add-host cloud1:10.22.1.26 \
 --add-host cloud2:10.22.1.27 \
 --add-host cloud3:10.22.1.28 \
 -it spark:v4

192.168.17.152机器上执行。

docker run --name cloud3 \
 --network net-spark --ip 10.22.1.28 \
 -h cloud3 \
 --add-host cloud1:10.22.1.26 \
 --add-host cloud2:10.22.1.27 \
 --add-host cloud3:10.22.1.28 \
 -it spark:v4

可分别在三个容器内互相ping IP10.22.1.26、10.22.1.27、10.22.1.28验证。

三、常见问题

1、如遇错误常用命令

  • 如果网络改动,需要重启docker
systemctl daemon-reload
 systemctl restart docker
  • 关掉防火墙
# 停止firewall
 systemctl stop firewalld.service
 # 禁止firewall开机启动
 systemctl disable firewalld.service
 # 查看开放端口列表
 firewall-cmd --list-ports
 # 开放端口
 firewall-cmd --zone=public --add-port=2379/tcp --permanent 
 # 重新载入
 firewall-cmd --reload

2、将容器以指定IP链接到自定义网络中

#容器cloud3以IP10.22.1.28链接到overlay网络spark-net
 docker network connect --ip 10.22.1.28 spark-net cloud3

3、将容器从自定义网络中删除

# 注意不可在当前容器里执行断连
 # 例如 需要断连容器cloud2,则需要在容器cloud1中执行如下命令
 docker network disconnect -f spark-net cloud2

4、manager节点无法接入

docker.service配置 -H tcp://0.0.0.0:2376 --cluster-store=consul://121.4.138.199:8500 --cluster-advertise=ens33:2376 并不能正确执行,原理暂未知。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。

责任编辑:jianghua 来源: 鸿蒙社区
zanpc.bd208a1.pngzanpchover.fdd60ba.png
weixin.23cd8b3.png 分享到微信
weibo.16d6b4f.png 分享到微博

Recommend

  • 31

    前言由于docker技术的火爆,导致现在越来越多的企业都在使用docker这种虚拟化技术。企业中使用docker这种虚拟化技术,其目的就是为了让docker中的容器对外提供服务。因此,我们必须深入了解一下docker的网络知识,以满足更高的网络需求。我们安装Docker时,它会自...

  • 30

    一、MacVlan实现Docker的跨主机网络通信的方案有很多,如之前博文中写到的通过部署Consul服务实现Docker容器跨主机通信Macvlan工作原理:Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9–3.19和4.0+;通过为物理网卡创建Macvlan子接口,允许一块物理...

  • 22
    • www.cnblogs.com 3 years ago
    • Cache

    docker容器与宿主机的数据交互

    在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。 方式一、Docker cp命令 docker cp :用于容器与主机之间的数据拷贝。...

  • 17

    解密 Docker 挂载文件,宿主机修改后容器里文件没有修改

  • 4

    有时我们并没有配置某文件的映射关系, 当需要调整时, 就需要将文件进行复制. 所以本篇文章来记录下如何在docker容器和宿主机直接传输文件. 首先来确认下你的容器ID: docker ps 拿到需要传输文件...

  • 4

    Docker 容器时间如何与宿主机同步问题解决方案小结如果在启动 Docker 容器的过程中没有单独配置 localtime,很可能造成 Docker 容器时间与主机时间不一致的情况,比如 UTC 和 CST 相差 8 小时,换句话来说就是容器时间与北京时间相差 8 个小时。 2020 年...

  • 3

    docker容器显示完整主机名称PS1设置2017年12月14日 by anzhihe·0评论 · 2,087 人阅读 · 隐...

  • 4
    • rabbit52.com 2 years ago
    • Cache

    在 Docker 容器中访问主机

    在 Docker 容器中访问主机 发表于

  • 4
    • ijayer.github.io 2 years ago
    • Cache

    Docker | 跨主机通信

    Docker | 跨主机通信 2017-09-19 tech 5095 words 11 mins read 7 times read...

  • 6
    • qiankunli.github.io 2 years ago
    • Cache

    跨主机容器通信

    跨主机容器通信 | 李乾坤的博客 调试Kubernetes集群中的网络停顿问题

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK