【问题标题】:Docker-compose and Docker-swarmDocker-compose 和 Docker-swarm
【发布时间】:2015-12-10 20:10:31
【问题描述】:

我正在使用 docker-compose 和 docker swarm。我创建了一个 docker-mgt 服务器,从中我做了一个 docker-machine 来设置一个由一个 swarm master 和两个 swarm-agents 组成的 swarm 集群。

我创建了一个在容器中启动的 Express 应用程序,看来 swarm master 决定将它放在 agent1 上。然后我还有一个 Wordpress 站点(来自 docker compose 站点的示例),我在 Docker Swarm 上使用 docker-compose 运行。

cloud-user@docker-mgt:~/wordpress$ docker-compose up
wordpress_db_1 is up-to-date
Creating wordpress_web_1
ERROR: Error: image library/wordpress_web:latest not found

以下图片可用:

cloud-user@docker-mgt:~/wordpress$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
orchardup/php5      latest              c385b8a81cee        18 months ago       330.1 MB
swarm               latest              a9975e2cc0a3        19 hours ago        17.15 MB
orchardup/mysql     latest              5a45a5a953bb        16 months ago       292.4 MB
wordpress_web       latest              e484f88dc8c8        11 minutes ago      350.9 MB
node-ip             latest              d177af00338b        39 minutes ago      549.5 MB
centos              centos6             1a895dd3954a        8 weeks ago         190.6 MB

所以它确实有 wordpress_web:latest 可用,但它仍然抱怨。

当在单独的 docker 主机(不是 swarm 集群的一部分)上运行这个 wordpress 应用程序时,它运行得很好。为了排除 wordpress 应用程序上的错误,我还尝试了另一个完全不同的应用程序,该应用程序由两个容器(使用 docker-compose)组成,这是完全相同的问题。

我开始认为 docker compose 和 swarm 不能顺利协同工作,但这当然很难相信。

【问题讨论】:

    标签: docker docker-compose docker-swarm


    【解决方案1】:

    您可能想尝试一下 Rancher,它使用 compose 并使得在广泛类型的基础架构中部署应用程序变得简单,同时保持原生 docker 语法和使用 compose。 GitHubWebsite

    【讨论】:

    • 确实,还在我的待办事项清单上。试图让我的头脑围绕 docker 和围绕它的许多工具。此外,CoreOS 在我的待办事项列表中。
    • Rancher 使用类似 compose 的格式,但它实际上并不是 compose,您应该期望某些东西的行为会有所不同。
    【解决方案2】:

    问题在于 swarm 需要某种方式来检索图像以运行容器。如果镜像不存在于注册表(或 docker hub)中,那么它(当前)没有任何方法来获取该镜像,并且您最终会出现此错误。

    一种选择是用全名标记图像并将它们推送到集线器。然后 swarm 将能够拉取所有节点上的图像。

    另一种选择是使用docker savedocker load 传播图像,这会将图像发送到所有节点。

    另一种选择是添加image affinity 以强制容器在具有图像的节点上运行。

    在未来,swarm 应该能够在节点之间传播图像。

    【讨论】:

    • 谢谢,我使用了 docker hub,这似乎确实有效。但是,我很惊讶地看到 docker-compose up 会在 swarm-master 上启动两个容器,而不是两个代理之一?知道这是为什么吗?
    • swarm 有不同的调度策略 (docs.docker.com/swarm/scheduler/strategy)。默认值应该分散,所以我希望它使用不同的主机,但如果重新创建一个容器,它可能会放在一起。您可以使用关联或约束将其放置在不同的节点上:docs.docker.com/swarm/scheduler/filter