将Docker Compose Services部署到集群

Docker 1.13引入了新版本的Docker Compose。 该版本的主要功能是,它允许将使用Docker Compose文件定义的服务直接部署到启用了Swarm模式的Docker引擎。 这样可以简化多容器应用程序在多主机上的部署。

将Docker Compose Services部署到集群_第1张图片

该博客将使用一个简单的Docker Compose文件显示如何在Docker 1.13中创建和部署服务。

这是用于启动Couchbase数据库节点的Docker Compose v2定义:

version: "2"
services:
  db:
    image: arungupta/couchbase:latest
    ports:
      - 8091:8091
      - 8092:8092
      - 8093:8093
      - 11210:11210

可以在没有Swarm模式的Docker引擎上启动此定义,如下所示:

docker-compose up

这将启动Compose文件中服务定义的单个副本。 该服务可以扩展为:

docker-compose scale db=2

这将在单个主机上正常工作。 如果在Docker Engine上启用了swarm模式,那么它将显示以下消息:

WARNING: The Docker Engine you're using is running in swarm mode.
 
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
 
To deploy your application across the swarm, use `docker stack deploy`.

Docker Compose为我们提供了多容器应用程序,但这些应用程序仍仅限于单个主机。 那就是单点故障。

Swarm模式允许创建Docker引擎集群。 在1.13版本中,可以使用docker stack deploy命令将Compose文件部署到Swarm模式。

这是Docker Compose v3的定义:

version: "3"
services:
  db:
    image: arungupta/couchbase:latest
    ports:
      - 8091:8091
      - 8092:8092
      - 8093:8093
      - 11210:11210

如您所见,唯一的变化是version属性的值。 Docker Compose v3中还有其他更改 。 此外,请阅读有关不同的Docker Compose版本以及如何从v2升级到v3的信息。

启用群模式:

docker swarm init

其他节点可以加入该群集集群,这也很容易允许将多容器应用程序部署到多主机。

将Compose文件中定义的服务部署为:

docker stack deploy --compose-file=docker-compose.yml couchbase

此处的Compose文件的默认值会使命令短一些。 #30352应该注意这一点。

可以使用docker service ls命令验证正在运行的服务列表:

ID            NAME          MODE        REPLICAS  IMAGE
05wa4y2he9w5  couchbase_db  replicated  1/1       arungupta/couchbase:latest

可以使用docker service ps命令查看服务中运行的容器的列表:

ID            NAME            IMAGE                       NODE  DESIRED STATE  CURRENT STATE           ERROR  PORTS
rchu2uykeuuj  couchbase_db.1  arungupta/couchbase:latest  moby  Running        Running 52 seconds ago

在这种情况下,单个容器将作为服务的一部分运行。 该节点被列为moby ,这是使用Docker for Mac运行的Docker Engine的默认名称。

现在可以将该服务扩展为:

docker service scale couchbase_db=2

然后可以再次将容器列表视为:

ID            NAME            IMAGE                       NODE  DESIRED STATE  CURRENT STATE           ERROR  PORTS
rchu2uykeuuj  couchbase_db.1  arungupta/couchbase:latest  moby  Running        Running 3 minutes ago          
kjy7l14weao8  couchbase_db.2  arungupta/couchbase:latest  moby  Running        Running 23 seconds ago

请注意,使用格式_n为容器_n 两个容器都在同一主机上运行。

还要注意,这两个容器是独立的Couchbase节点,尚未在群集中配置。 使用Docker在Couchbase Cluster中已经对此进行了解释,并且即将更新这些步骤。

一个服务通常将有多个运行在多个主机上的容器。 Docker 1.13引入了一个新命令docker service logs 以跨所有主机上的所有容器将服务日志流式传输到您的控制台。 在我们的例子中,这可以通过使用命令docker service logs couchbase_db看到,如下所示:

couchbase_db.1.rchu2uykeuuj@moby    | ++ set -m
couchbase_db.1.rchu2uykeuuj@moby    | ++ sleep 15
couchbase_db.1.rchu2uykeuuj@moby    | ++ /entrypoint.sh couchbase-server
couchbase_db.2.kjy7l14weao8@moby    | ++ set -m
couchbase_db.2.kjy7l14weao8@moby    | ++ sleep 15
couchbase_db.1.rchu2uykeuuj@moby    | Starting Couchbase Server -- Web UI available at http://:8091 and logs available in /opt/couchbase/var/lib/couchbase/logs
couchbase_db.1.rchu2uykeuuj@moby    | ++ curl -v -X POST http://127.0.0.1:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300
couchbase_db.2.kjy7l14weao8@moby    | ++ /entrypoint.sh couchbase-server
couchbase_db.2.kjy7l14weao8@moby    | Starting Couchbase Server -- Web UI available at http://:8091 and logs available in /opt/couchbase/var/lib/couchbase/logs
 
. . .
 
couchbase_db.1.rchu2uykeuuj@moby    | ++ '[' '' = WORKER ']'
couchbase_db.2.kjy7l14weao8@moby    | Content-Type: application/json
couchbase_db.1.rchu2uykeuuj@moby    | ++ fg 1
couchbase_db.2.kjy7l14weao8@moby    | Content-Length: 152
couchbase_db.1.rchu2uykeuuj@moby    | /entrypoint.sh couchbase-server
couchbase_db.2.kjy7l14weao8@moby    | Cache-Control: no-cache
couchbase_db.2.kjy7l14weao8@moby    | 
couchbase_db.2.kjy7l14weao8@moby    | ++ echo 'Type: '
couchbase_db.2.kjy7l14weao8@moby    | ++ '[' '' = WORKER ']'
couchbase_db.2.kjy7l14weao8@moby    | ++ fg 1
couchbase_db.2.kjy7l14weao8@moby    | {"storageMode":"memory_optimized","indexerThreads":0,"memorySnapshotInterval":200,"stableSnapshotInterval":5000,"maxRollbackPoints":5,"logLevel":"info"}Type: 
couchbase_db.2.kjy7l14weao8@moby    | /entrypoint.sh couchbase-server

log语句的前导使用格式.@ 然后显示来自容器的实际日志消息。

乍一看,附加容器ID似乎是多余的。 但是Docker服务是自我修复的。 这意味着,如果容器死亡,则Docker引擎将启动另一个容器以确保在给定时间指定数量的副本。 这个新的容器将有一个新的ID。 因此,它允许从正确的容器附加日志消息。

所以快速比较一下命令:

Docker Compose v2 Docker Compose v3
启动服务 docker-compose up -d docker stack deploy --compose-file=docker-compose.yml
规模服务 docker-compose scale = docker service scale =
关掉 docker-compose down docker stack rm
多主机 没有

想要开始使用Couchbase吗? 查看Couchbase入门套件 。

想更多地了解如何在容器中运行Couchbase?

  • 容器上的Couchbase
  • Couchbase论坛
  • Couchbase开发人员门户
  • @couchhasedev和@couchbase

翻译自: https://www.javacodegeeks.com/2017/01/deploy-docker-compose-services-swarm.html

你可能感兴趣的:(将Docker Compose Services部署到集群)