替代Docker Compose实现容器双向联通的三种方法

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

Docker 是目前最热门的技术平台之一,他在产生后很短的时间内就获得了社会的广泛关注。简单的说,他使得开发者和系统管理员能够用一种简易的方法去部署分布式应用。Docker 的生态系统非常庞大,有很多的工具协同工作,比如最常用的工具之一:Docker Compose。他使你可以在单个文件中定义并运行多容器应用,然后通过一个命令执行。

一个 docker-compose.yml 文件看起来是这样的:

links 选项使容器能够在一个运行中创建的内部网络中通讯,并且在运行终止后销毁。在上面的例子中,当这个应用启动时,将在 web 容器中的 /etc/hosts 文件中建立一个别名为“redis”的入口,这使web容器能接通 redis 容器的服务。

问题

到目前为止,这个工具使你能够通过一个命令运行多容器服务应用。但是,如果你的容器间有复杂的连通,这就有可能会导致问题甚至应用无法运行。这里复杂的意思是多于一个的容器通过 links 选项共用另一个容器的服务。举例来说,在上面的应用中,web 容器想使用 redis 容器中的服务,如果在 redis 容器中添加“links:-web”并且通过 docker-compose 来运行他,你会看到如下信息:

事实上,这是 Docker 的一个历史问题,Docker 的网络系统曾有一些问题,而这正是一个典型体现。社区建议使用 ambassador pattern 作为解决这个问题的方法,但是这个解决方法增加了你应用的开销,毕竟这只是一个变通方法,不是一个 docker 化的解决方式。

因为我在自己的应用开发中面临这个问题,所以我寻找了一些基于 Docker 平台和 Docker 工具的方法,下面是我尝试成功的三种解决方法。

解决方案1:使用新的 Docker 网络接口

Docker 在DockerCon 2015上宣布了很多新的特性和工具,其中一个进步就是新的网络系统。新的网络类型使我能够采用一个简单的方法来实现一个有复杂通讯的多容器应用。

使用下面的方法使在同一个私有网络中的两个容器相互可见。

创建一个网络


 
 
  1. docker network create mynetwork 

通过列举所有的网络,确保这个网络成功创建。


 
 
  1. docker network ls 

把容器连接到你的网络上

打开一个终端,执行以下命令来运行一个容器:


 
 
  1. docker run -it --publish-service web.mynetwork web 

打开另一个终端并且运行另一个容器:


 
 
  1. docker run -it --publish-service redis.mynetwork redis 

容器相互可见

现在,你可以从第一个终端 ping redis.mynetwork 并且收到回复。同样,从第二个终端,你可以 ping web.mynetwork 并收到回复。这是发布在.下的服务。

通过这种方法,你无需将自己的应用与 Docker Compose 链接,你只需创建一个网络并且在这个网络上发布服务。换句话说,我们将 docker-compose.yml 的连接替换为一个网络。

虽然这个功能还在试验中(在本文写作时),但我认为这种灵活的方式就是运行多容器应用的未来,所以,建议你遵循 Docker 发展的方向。

解决方案2:在多主机网络中使用 Docker Swarm 和 Compose

在多主机网络中使用 Swarm 和 Compose 也是一个实验性的功能。这个解决方案比前一个需要做更多的工作,但是,如果你有很多容器需要连接并且你打算让他们运行在集群中,这是最好的解决方法。

关于解决的详细流程,请参照 GitHub 里的原始功能介绍。首先,在多主机网络中安装 Swarm,然后你可以在去掉 links 选项后立即运行一个组合应用。为什么?因为从这个使用 Swarm 集群的多主机网络上启动的每一个容器都默认使用“overlay:multihost”网络,这意味着他们可以通过容器名相互访问。

因为这是实验性功能,所以请在 GitHub 给作者反馈。

解决方案3:使用外部 DNS 容器

一个经典的解决方法(我觉得是临时方法)是在你的 docker-compose.yml 文件中添加一个额外的容器。添加如下的容器到你的文件中。


 
 
  1. dnsdock: 
  2.  
  3. image: tonistiigi/dnsdock 
  4.  
  5. volumes: 
  6.  
  7. - /var/run/docker.sock:/run/docker.sock 
  8.  
  9. ports: 
  10.  
  11. 172.17.42.1:53:53/udp 

并且,在每个容器中你需要做如下的操作:

告诉容器 DNS 服务在什么位置:


 
 
  1. dns: 172.17.42.1 

命名每个容器使其对于服务发现可见


 
 
  1. environment: 
  2.  
  3. - DNSDOCK_NAME=web 
  4.  
  5. - DNSDOCK_IMAGE=web 

使用环境变量来完成这个命名。对 redis 容器做同样的操作(不管你的其他容器是什么)。

现在容器在..docker下相互可见。这就是 redis 容器和 web 容器中的服务在 web.docker 下通信的方法。


本文作者:邵长钰

来源:51CTO

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
282 93
|
25天前
|
存储 安全 算法
Java容器及其常用方法汇总
Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。
Java容器及其常用方法汇总
|
6天前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
27天前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
64 23
|
26天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
328 15
|
2月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
212 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
2月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
76 17
|
2月前
|
运维 Java 虚拟化
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
135 12
|
2月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
298 11
|
3月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
339 78