管理swarm(18) – 部署服务

创建服务

简单地在swarm中创建一个服务,你仅需要提供一个镜像名称:

  1. $ docker service create <IMAGE>

这时协调器开始调度任务给一个可用节点。任务基于你给的镜像来运行一个容器。例如,你可以执行如下命令来创建一个nginx web服务器的实例服务:

  1. $ docker service create --name my_web nginx
  2.  
  3. anixjtol6wdfn6yylbkrbj2nx

在这个示例中–name参数命名服务为my_web。
在管理节点上执行docker service ls来列出服务:

  1. $ docker service ls
  2.  
  3. ID            NAME    REPLICAS  IMAGE  COMMAND
  4. anixjtol6wdf  my_web  1/1       nginx

要让web服务器在swarm外部可用,你需要发布一个swarm监听web请求的端口。
你可以在指定镜像后添加一个命令来运行在容器内部:

  1. $ docker service create <IMAGE> <COMMAND>

例如启动一个alpine镜像来执行ping docker.com:

  1. $ docker service create --name helloworld alpine ping docker.com
  2.  
  3. 9uk4639qpg7npwf3fn2aasksr

配置运行环境

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

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

    1. $ docker service create --name helloworld \
    2.   --env MYVAR=myvalue \
    3.   --workdir /tmp \
    4.   --user my_user \
    5.   alpine ping docker.com
    6.  
    7. 9uk4639qpg7npwf3fn2aasksr

    控制服务规模和布局

    swarm模式有两种类型的服务,副本(replicated)和全局(global)。对于副本服务,你可以指定任务副本的数量。对于全局服务,调度器将在每个可用节点都执行一个相同的任务。
    你可以使用–mode参数来设置服务类型。如果不指定,默认服务类型为副本。对于副本服务,你可以使用–replicas参数为设置副本数量。例如,启动一个副本数为3的nginx服务:

    1. $ docker service create --name my_web --replicas 3 nginx

    要启动一个全局服务,在创建服务执行docker service create时传递–mode global参数。当任何时候一个新的节点可用,调度器会调度全局服务的任务到该新节点。例如在每个节点上执行alpine服务:

    1. $ docker service create --name myservice --mode global alpine top

    控制服务规模和布局

    swarm模式中有两种可以访问服务的方法:

  • 使用ingress网络来发布端口到swarm外部
  • 在swarm的覆盖网络内部连接服务和任务
  • 发布端口到swarm外部网络

    你可以使用–publish:参数来发布服务端口到swarm外部网络。发布服务端口时,无论该节点上是否有任务运行,swarm都会使服务在每个节点的目标端口上可访问。
    例如,假设你想部署一个3个副本的nginx服务到一个10个节点的swarm:

    1. docker service create --name my_web --replicas 3 --publish 8080:80 nginx

    调度器会把nginx任务分配到三个可用节点。不过swarm会设置10个节点都监听8080端口,访问此端口时会把请求转发到nginx容器的80端口。你可以使用curl在任意的节点上测试服务:

    1. $ curl localhost:8080
    2.  
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6. <title>Welcome to nginx!</title>
    7. <style>
    8.     body {
    9.         width: 35em;
    10.         margin: 0 auto;
    11.         font-family: Tahoma, Verdana, Arial, sans-serif;
    12.     }
    13. </style>
    14. </head>
    15. <body>
    16. <h1>Welcome to nginx!</h1>
    17. <p>If you see this page, the nginx web server is successfully installed and
    18. working. Further configuration is required.</p>
    19.  
    20. <p>For online documentation and support please refer to
    21. <a>nginx.org</a>.<br/>
    22. Commercial support is available at
    23. <a>nginx.com</a>.</p>
    24.  
    25. <p><em>Thank you for using nginx.</em></p>
    26. </body>
    27. </html>

    添加一个覆盖网络

    使用覆盖网络可以在swarm内连接一个或多个服务。
    首先在管理节点执行docker network create来创建一个覆盖网络:

    1. $ docker network create --driver overlay my-network
    2.  
    3. etjpu59cykrptrgw0z0hk5snf

    当你在swarm模式创建一个覆盖网络后,所有的管理节点都可以访问这个网络。
    可以在创建服务时传递–network参数过去指定服务加入的覆盖网络:

    1. $ docker service create \
    2.   --replicas 3 \
    3.   --network my-network \
    4.   --name my-web \
    5.   nginx
    6.  
    7. 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秒钟:

    1. $ docker service create \
    2.   --replicas 10 \
    3.   --name my_web \
    4.   --update-delay 10s \
    5.   --update-parallelism 2 \
    6.   --update-failure-action continue \
    7.   alpine
    8.  
    9. 0u6a4s31ybk7yw2wyvtikmu50

    配置挂载

    你可以创建两种类型的swarm服务挂载,volume挂载或bind挂载。在创建服务时传递–mount参数指定挂载类型。默认挂载类型是volume。

  • Volumes存储在容器任务被删除时仍然会保留。
    挂载volumes首先方法是利用已存在的volumes:
    1. $ docker service create \
    2.   --mount src=<VOLUME-NAME>,dst=<CONTAINER-PATH> \
    3.   --name myservice \
    4.   <IMAGE>

    下面的方法是在部署服务时创建一个volume:

    1. $ docker service create \
    2.   --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=<DRIVER>,volume-opt=<KEY0>=<VALUE0>,volume-opt=<KEY1>=<VALUE1>
    3.   --name myservice \
    4.   <IMAGE>
  • Bind挂载是把容器中的目录挂载到运行容器所在的主机上的目录。在swarm初始化任务容器时,主机文件系统路径必须存在。
    下面的示例显示bind挂载的语法:
    1. # Mount a read-write bind
    2. $ docker service create \
    3.   --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH> \
    4.   --name myservice \
    5.   <IMAGE>
    6.  
    7. # Mount a read-only bind
    8. $ docker service create \
    9.   --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>,readonly \
    10.   --name myservice \
    11.   <IMAGE>
  • 标签:部署Swarm 发布于:2019-11-20 06:08:14