Linux入门教程:管理swarm(18) – 部署服务,任务基于你给的镜像来


创建服务

简单地在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

配置运行环境

你可以使用如下选项来配置容器的运行环境:

使用–env参数配置环境变量 使用–workdir参数配置容器工作目录 使用–user参数配置程序运行使用的用户或ID

例如:

$ 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模式中有两种可以访问服务的方法:

使用ingress网络来发布端口到swarm外部 在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首先方法是利用已存在的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挂载是把容器中的目录挂载到运行容器所在的主机上的目录。在swarm初始化任务容器时,主机文件系统路径必须存在。
下面的示例显示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>

相关内容