当前位置: 首页 > 知识库问答 >
问题:

如何在主机之间链接 Docker 服务?

鲜于光辉
2023-03-14

Docker允许来自多个容器的服务器通过链接和服务发现相互连接。然而,据我所知,这个服务发现是主机本地的。我想实现一个使用其他托管在不同机器上的服务的服务。

在Docker中有几种方法可以解决这个问题,比如CoreOS的< code>jumpers,本质上代理其他机器的主机本地服务,以及一大堆用于管理Docker部署的github项目,这些项目似乎都试图支持这个用例。

鉴于发展速度,很难遵循当前的最佳实践。因此,我的问题本质上是:

  1. Docker中当前跨主机链接的主要方法是什么(如果有),以及
  2. 有没有计划直接在Docker系统中支持此功能?

共有3个答案

李昌勋
2023-03-14

Weave是一种新的Docker虚拟网络技术,它充当TCP/IP上的虚拟以太网交换机-您所需要的只是在主机上运行Weave的Docker-container。

有趣的是

    < li >在虚拟网络中使用静态IP/主机名,而不是链接 < li >主机不需要完全连接,网状结构是根据可用的对等体形成的,数据包将通过多跳路由到它们需要去的地方

这导致了有趣的场景,比如

  • 创建一个跨WAN的虚拟网络,没有任何Docker容器会知道或关心它们所在的实际网络
  • 容器移动到不同的物理码头主机,Weave将相应地检测对等主机

例如,有一个关于如何在您的笔记本电脑和一些云(EC2)主机上创建多节点Cassandra集群的示例指南,每个主机有两个命令。我用AWS CloudFormation启动了一个CoreOS集群,在每个in /home/core上安装了weave,加上我的笔记本电脑vacator docker VM,不到一个小时就完成了一个集群。我的笔记本电脑有防火墙,但Weave似乎没问题,它只是连接到它的EC2同行。

潘宪
2023-03-14

更新3

Libswell已重命名为swell,现在是一个单独的应用程序。

这是用作起点的github页面演示:

# create a cluster
$ swarm create
6856663cdefdec325839a4b7e1de38e8

# on each of your nodes, start the swarm agent
#  <node_ip> doesn't have to be public (eg. 192.168.0.X),
#  as long as the other nodes can reach it, it is fine.
$ swarm join --token=6856663cdefdec325839a4b7e1de38e8 --addr=<node_ip:2375>

# start the manager on any machine or your laptop
$ swarm manage --token=6856663cdefdec325839a4b7e1de38e8 --addr=<swarm_ip:swarm_port>

# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ... 
$ docker -H <swarm_ip:swarm_port> ps 
$ docker -H <swarm_ip:swarm_port> logs ...
...

# list nodes in your cluster
$ swarm list --token=6856663cdefdec325839a4b7e1de38e8
http://<node_ip:2375>

更新2

官方方法现在是使用libswarm,请看这里的演示

更新

openvswitch主机在docker中使用相同的方法进行通信有一个很好的要点。

为了允许服务发现,有一种基于DNS的有趣方法称为skydock。

还有一个截屏。

这也是一篇不错的文章,使用相同的拼图部分,但也在顶部添加了vlans:

http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html

修补与解决方案的健壮性无关。Docker实际上只是一种基于Linux容器的DSL,这些文章中的两种解决方案都简单地绕过了一些Docker自动设置,直接回到了Linux容器。

因此,您可以安全地使用这些解决方案,并等待Docker实现后,以更简单的方式来实现它。

南门向荣
2023-03-14

更新

Docker最近宣布了一个名为Swell的新工具,用于Docker编排。

Swarm允许您“加入”多个docker守护程序:首先创建一个群,在一台机器上启动一个群管理器,然后让docker守护进程使用群标识符“加入”群管理器。docker客户端连接到群管理器,就好像它是一个常规的docker服务器一样。

当容器以 Swarm 启动时,它会自动分配给满足已定义任何约束的可用节点。以下示例摘自博客文章:

$ docker run -d -P -e constraint:storage=ssd mysql

支持的约束之一是< code >“node”,它允许您将容器固定到特定的主机名。swarm还可以解析节点间的链接。

在我的测试中,我得到的印象是Swarm还不能很好地处理固定位置的卷(或者至少链接它们的过程不是很直观),所以这是需要记住的。

群现在处于测试阶段。

直到最近,大使模式还是远程主机服务发现的唯一Docker本机方法。此模式仍然可以使用,并且除了普通的 Docker 之外不需要任何魔法,因为该模式由一个或多个充当代理的附加容器组成。

此外,还有几个第三方扩展可以使 Docker 群集功能强大。第三方解决方案包括:

    < li >连接两台主机上的Docker网桥,存在各种各样的轻量级解决方案,但一般都有一些注意事项 < li >基于DNS的发现,例如使用skydock和SkyDNS < li >码头管理工具,如造船厂和码头协调工具。有关详细列表,请参见此问题:如何在生产中扩展Docker容器
 类似资料:
  • 问题内容: 我找不到将Docker运行容器从一台主机移动到另一台主机的方法。 有什么办法可以像将图像一样将容器推入存储库吗?当前,我不使用数据卷来存储与在容器内运行的应用程序关联的数据。因此,一些数据驻留在容器内,我想在重新设计设置之前将其保留。 问题答案: 您无法将正在运行的Docker容器从一台主机移动到另一台主机。 您可以使用将容器中的更改提交到映像,将映像移到新主机上,然后使用启动新容器。

  • 问题内容: 我想将我的应用程序堆栈(由3个docker映像组成)并由docker- compose管理,将其全部从开发机器移至生产机器。我知道几种直接使用docker的方法: 将图像推送到注册表,然后将其从生产环境中撤回 docker从开发中保存,然后在生产中加载docker 在生产中重建映像(宁愿保持对生产的依赖性,所以不是一个好的选择。) 我目前倾向于先保存docker然后再加载docker,

  • 我想把我的应用程序堆栈,由3个docker映像组成,由docker-compose管理,并把它从开发机器整体转移到生产机器上。我知道用直上Docker做这件事的几种方法: null 提前致谢

  • 我已加载图像: 但现在我想运行它们,就像它们使用docker-compose运行一样,但我找不到任何示例。 下面是docker-compose.yml 所以,即使我有docker-compose yml文件,但由于我有来自另一个主机的构建映像,我可以运行docker命令来运行和执行映像吗?确保引用的是本地映像,而不是来自docker注册表的映像。 谢谢@tgogos,这确实给了我一个大致的概述,但

  • 有两个相关的问题,但他们没有完全回答问题。但如果国防部认为这是复制品,请告诉我。 编辑:我在Linux上使用docker,并且非常希望不在主机模式下运行容器。

  • 问题内容: TL; DR:为了允许一个容器通过自定义(非标准)端口使用另一个容器的服务,我必须如何更改以下内容? 我有一个非常普通的设置:Web应用程序的容器(Padrino [Ruby]),Postgres,Redis和一个排队框架(Sidekiq)。该Web应用程序带有其自定义的Dockerfile,其余服务来自标准映像(Postgres,Redis),或从Web应用程序装载数据(Sideki