创建服务
简单地在swarm中创建一个服务,你仅需要提供一个镜像名称:
- $ docker service create <IMAGE>
这时协调器开始调度任务给一个可用节点。任务基于你给的镜像来运行一个容器。例如,你可以执行如下命令来创建一个nginx web服务器的实例服务:
- $ docker service create –name my_web nginx
- anixjtol6wdfn6yylbkrbj2nx
在这个示例中–name参数命名服务为my_web。
在管理节点上执行docker service ls来列出服务:
- $ docker service ls
- ID NAME REPLICAS IMAGE COMMAND
- anixjtol6wdf my_web 1/1 nginx
要让web服务器在swarm外部可用,你需要发布一个swarm监听web请求的端口。
你可以在指定镜像后添加一个命令来运行在容器内部:
- $ docker service create <IMAGE> <COMMAND>
例如启动一个alpine镜像来执行ping docker.com:
- $ docker service create –name helloworld alpine ping docker.com
- 9uk4639qpg7npwf3fn2aasksr
配置运行环境
你可以使用如下选项来配置容器的运行环境:
例如:
- $ docker service create –name helloworld
- –env MYVAR=myvalue
- –workdir /tmp
- –user my_user
- alpine ping docker.com
- 9uk4639qpg7npwf3fn2aasksr
控制服务规模和布局
swarm模式有两种类型的服务,副本(replicated)和全局(global)。对于副本服务,你可以指定任务副本的数量。对于全局服务,调度器将在每个可用节点都执行一个相同的任务。
你可以使用–mode参数来设置服务类型。如果不指定,默认服务类型为副本。对于副本服务,你可以使用–replicas参数为设置副本数量。例如,启动一个副本数为3的nginx服务:
- $ docker service create –name my_web –replicas 3 nginx
要启动一个全局服务,在创建服务执行docker service create时传递–mode global参数。当任何时候一个新的节点可用,调度器会调度全局服务的任务到该新节点。例如在每个节点上执行alpine服务:
- $ docker service create –name myservice –mode global alpine top
控制服务规模和布局
swarm模式中有两种可以访问服务的方法:
发布端口到swarm外部网络
你可以使用–publish:参数来发布服务端口到swarm外部网络。发布服务端口时,无论该节点上是否有任务运行,swarm都会使服务在每个节点的目标端口上可访问。
例如,假设你想部署一个3个副本的nginx服务到一个10个节点的swarm:
- docker service create –name my_web –replicas 3 –publish 8080:80 nginx
调度器会把nginx任务分配到三个可用节点。不过swarm会设置10个节点都监听8080端口,访问此端口时会把请求转发到nginx容器的80端口。你可以使用curl在任意的节点上测试服务:
- $ curl localhost:8080
- <!DOCTYPE html>
- <html>
- <head>
- <title>Welcome to nginx!</title>
- <style>
- body {
- width: 35em;
- margin: 0 auto;
- font-family: Tahoma, Verdana, Arial, sans-serif;
- }
- </style>
- </head>
- <body>
- <h1>Welcome to nginx!</h1>
- <p>If you see this page, the nginx web server is successfully installed and
- working. Further configuration is required.</p>
- <p>For online documentation and support please refer to
- <a href="http://nginx.org/">nginx.org</a>.<br/>
- Commercial support is available at
- <a href="http://nginx.com/">nginx.com</a>.</p>
- <p><em>Thank you for using nginx.</em></p>
- </body>
- </html>
添加一个覆盖网络
使用覆盖网络可以在swarm内连接一个或多个服务。
首先在管理节点执行docker network create来创建一个覆盖网络:
- $ docker network create –driver overlay my-network
- etjpu59cykrptrgw0z0hk5snf
当你在swarm模式创建一个覆盖网络后,所有的管理节点都可以访问这个网络。
可以在创建服务时传递–network参数过去指定服务加入的覆盖网络:
- $ docker service create
- –replicas 3
- –network my-network
- –name my-web
- nginx
- 716thylsndqma81j6kkkb5aus
配置更新策略
你可以在创建服务或更新服务时指定swarm应用服务更新的策略。
–update-delay标志配置更新到服务任务或任务集之间的时间延迟。 你可以将时间T描述为秒数Ts,分钟Tm或小时Th的组合。 所以10m30s表示10分30秒的延迟。
默认情况下,调度器一次更新1个任务。 你可以传递–update-parallelism标志来配置调度器同时更新的最大服务任务数。
当对单个任务的更新返回RUNNING状态时,调度器通过继续执行另一个任务,直到所有任务都更新为止,继续更新。 如果在更新期间的任何时间任务返回FAILED,则调度器暂停更新。 你可以使用–update-failure-action标志控制docker服务创建或docker服务更新的行为。
在下面的示例服务中,调度器一次最多应用更新2个副本。 当更新的任务返回RUNNING或FAILED时,调度程序在停止下一个要更新的任务之前等待10秒钟:
- $ docker service create
- –replicas 10
- –name my_web
- –update-delay 10s
- –update-parallelism 2
- –update-failure-action continue
- alpine
- 0u6a4s31ybk7yw2wyvtikmu50
配置挂载
你可以创建两种类型的swarm服务挂载,volume挂载或bind挂载。在创建服务时传递–mount参数指定挂载类型。默认挂载类型是volume。
挂载volumes首先方法是利用已存在的volumes:
- $ docker service create
- –mount src=<VOLUME-NAME>,dst=<CONTAINER-PATH>
- –name myservice
- <IMAGE>
下面的方法是在部署服务时创建一个volume:
- $ docker service create
- –mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=<DRIVER>,volume-opt=<KEY0>=<VALUE0>,volume-opt=<KEY1>=<VALUE1>
- –name myservice
- <IMAGE>
下面的示例显示bind挂载的语法:
- # Mount a read-write bind
- $ docker service create
- –mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>
- –name myservice
- <IMAGE>
- # Mount a read-only bind
- $ docker service create
- –mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>,readonly
- –name myservice
- <IMAGE>