Docker允许来自多个容器的服务器通过链接和服务发现相互连接。然而,据我所知,这个服务发现是主机本地的。我想实现一个使用其他托管在不同机器上的服务的服务。
在Docker中有几种方法可以解决这个问题,比如CoreOS的< code>jumpers,本质上代理其他机器的主机本地服务,以及一大堆用于管理Docker部署的github项目,这些项目似乎都试图支持这个用例。
鉴于发展速度,很难遵循当前的最佳实践。因此,我的问题本质上是:
Weave是一种新的Docker虚拟网络技术,它充当TCP/IP上的虚拟以太网交换机-您所需要的只是在主机上运行Weave的Docker-container。
有趣的是
这导致了有趣的场景,比如
例如,有一个关于如何在您的笔记本电脑和一些云(EC2)主机上创建多节点Cassandra集群的示例指南,每个主机有两个命令。我用AWS CloudFormation启动了一个CoreOS集群,在每个in /home/core上安装了weave,加上我的笔记本电脑vacator docker VM,不到一个小时就完成了一个集群。我的笔记本电脑有防火墙,但Weave似乎没问题,它只是连接到它的EC2同行。
更新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实现后,以更简单的方式来实现它。
更新
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 群集功能强大。第三方解决方案包括:
问题内容: 我找不到将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