Docker实现与主机同网段其他设备互通过程

 更新时间:2025年12月19日 15:36:49   作者:微技术  
本文介绍了如何使用Docker网络功能,包括默认网络、自定义网络和Overlay网络,并通过实践操作展示了如何在多台机器上创建和验证Overlay网络

Docker与主机同网段其他设备互通

对开发者而言,随着容器的普遍使用,开发者可以很方便的搭建项目的简易测试环境。

有时候为了项目可以在任意机器一键运行,不用配置连接IP等信息。所以希望可以提前固定容器的IP地址,而且一个项目有时候涉及多个容器,可能还会部署在多台机器上。所以如果容器间可以固定IP跨机器通信的话,会有很大方便。

1、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,都是动态的。

2、自定义网络使用

自定义创建网段。docker network create --subnet=172.18.0.0/16 spark-net。

指定网络驱动docker network create -d overlay --subnet 10.22.1.0/24 --gateway 10.22.1.1 spark-net-0。

创建容器固定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. 跨主机创建容器验证

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • Docker swarm集群部署过程详解(包含compose.yml文件详情)

    Docker swarm集群部署过程详解(包含compose.yml文件详情)

    Docker Swarm是Docker的集群管理工具,支持服务部署、副本调度、Stack管理(基于Compose文件),包含初始化集群、节点添加、服务更新、资源清理等操作,确保容器化应用的高效运行,本文给大家介绍Docker swarm集群部署包含compose.yml文件详情,感兴趣的朋友一起看看吧
    2025-07-07
  • 国内可用的Docker镜像源测试指南

    国内可用的Docker镜像源测试指南

    在使用 Docker 时,由于网络原因,直接从 Docker Hub 拉取镜像可能会遇到速度缓慢甚至无法访问的情况,因此,使用国内的 Docker 镜像源可以显著提升镜像拉取速度,本文将介绍如何选择和测试国内可用的 Docker 镜像源,需要的朋友可以参考下
    2025-02-02
  • docker build 和compose 学习笔记

    docker build 和compose 学习笔记

    Docker build构建镜像,docker-compose up -d启动多容器应用,前者需Dockerfile,后者需docker-compose.yml,Compose可自动调用Build或使用现有镜像,协同提升开发效率与环境一致性,本文给大家分享docker build 和compose 学习笔记,感兴趣的朋友一起看看吧
    2025-07-07
  • docker 手动构建新镜像的方法

    docker 手动构建新镜像的方法

    这篇文章主要介绍了docker 手动构建新镜像的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 如何解决docker logs无法实时输出脚本打印的内容

    如何解决docker logs无法实时输出脚本打印的内容

    这篇文章主要介绍了如何解决docker logs无法实时输出脚本打印的内容问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Docker如何安装Oracle 19c

    Docker如何安装Oracle 19c

    这篇文章主要介绍了Docker如何安装Oracle 19c问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Docker AIGC等大模型深度学习环境搭建步骤最新详细版

    Docker AIGC等大模型深度学习环境搭建步骤最新详细版

    这篇文章主要介绍了Docker AIGC等大模型深度学习环境搭建步骤最新详细版,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 使用Docker快速运行Firefox并实现远程访问本地火狐浏览器的详细过程

    使用Docker快速运行Firefox并实现远程访问本地火狐浏览器的详细过程

    文章介绍了如何在Docker中运行Firefox浏览器,并通过Cpolar内网穿透工具实现远程访问,步骤包括部署Firefox、本地访问、安装Cpolar、配置公网地址、设置固定二级子域名等,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-02-02
  • 使用docker运行jenkins期间遇到的问题及解决方案

    使用docker运行jenkins期间遇到的问题及解决方案

    文章介绍了在使用Docker运行Jenkins时遇到的一些问题及其解决方法,包括使用jenkins/jenkins镜像、解决多分支流水项目创建问题、以及解决Docker容器内部调用宿主机Docker权限问题,感兴趣的朋友一起看看吧
    2025-03-03
  • docker和k8s中实现批量删除不要的资源

    docker和k8s中实现批量删除不要的资源

    文章介绍了在Docker和K8s中批量删除不是running状态的容器或pod的四种方法,包括根据容器状态删除Exited状态的容器、显示所有容器并过滤出Exited状态的容器、删除所有未运行的容器以及使用docker containers prune命令删除孤立的容器
    2025-12-12

最新评论