亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

directory search
Compose About versions and upgrading (Compose) ASP.NET Core + SQL Server on Linux (Compose) CLI environment variables (Compose) Command-line completion (Compose) Compose(組成) Compose command-line reference(組合命令行參考) Control startup order (Compose) Django and PostgreSQL (Compose) Docker stacks and distributed application bundles (Compose) docker-compose build(docker-compose構(gòu)建) docker-compose bundle docker-compose config docker-compose create docker-compose down docker-compose events docker-compose exec docker-compose help docker-compose images docker-compose kill docker-compose logs docker-compose pause docker-compose port docker-compose ps docker-compose pull docker-compose push docker-compose restart docker-compose rm docker-compose run docker-compose scale docker-compose start docker-compose stop docker-compose top docker-compose unpause docker-compose up Environment file (Compose) Environment variables in Compose Extend services in Compose Frequently asked questions (Compose) Getting started (Compose) Install Compose Link environment variables (deprecated) (Compose) Networking in Compose Overview of Docker Compose Overview of docker-compose CLI Quickstart: Compose and WordPress Rails and PostgreSQL (Compose) Sample apps with Compose Using Compose in production Using Compose with Swarm Engine .NET Core application (Engine) About images, containers, and storage drivers (Engine) Add nodes to the swarm (Engine) Apply custom metadata (Engine) Apply rolling updates (Engine) apt-cacher-ng Best practices for writing Dockerfiles (Engine) Binaries (Engine) Bind container ports to the host (Engine) Breaking changes (Engine) Build your own bridge (Engine) Configure container DNS (Engine) Configure container DNS in user-defined networks (Engine) CouchDB (Engine) Create a base image (Engine) Create a swarm (Engine) Customize the docker0 bridge (Engine) Debian (Engine) Default bridge network Delete the service (Engine) Deploy a service (Engine) Deploy services to a swarm (Engine) Deprecated Engine features Docker container networking (Engine) Docker overview (Engine) Docker run reference (Engine) Dockerfile reference (Engine) Dockerize an application Drain a node (Engine) Engine FAQ (Engine) Fedora (Engine) Get started (Engine) Get started with macvlan network driver (Engine) Get started with multi-host networking (Engine) How nodes work (Engine) How services work (Engine) Image management (Engine) Inspect the service (Engine) Install Docker (Engine) IPv6 with Docker (Engine) Join nodes to a swarm (Engine) Legacy container links (Engine) Lock your swarm (Engine) Manage nodes in a swarm (Engine) Manage sensitive data with Docker secrets (Engine) Manage swarm security with PKI (Engine) Manage swarm service networks (Engine) Migrate to Engine 1.10 Optional Linux post-installation steps (Engine) Overview (Engine) PostgreSQL (Engine) Raft consensus in swarm mode (Engine) Riak (Engine) Run Docker Engine in swarm mode Scale the service (Engine) SDKs (Engine) Select a storage driver (Engine) Set up for the tutorial (Engine) SSHd (Engine) Storage driver overview (Engine) Store service configuration data (Engine) Swarm administration guide (Engine) Swarm mode key concepts (Engine) Swarm mode overlay network security model (Engine) Swarm mode overview (Engine) Understand container communication (Engine) Use multi-stage builds (Engine) Use swarm mode routing mesh (Engine) Use the AUFS storage driver (Engine) Use the Btrfs storage driver (Engine) Use the Device mapper storage driver (Engine) Use the OverlayFS storage driver (Engine) Use the VFS storage driver (Engine) Use the ZFS storage driver (Engine) Engine: Admin Guide Amazon CloudWatch logs logging driver (Engine) Bind mounts (Engine) Collect Docker metrics with Prometheus (Engine) Configuring and running Docker (Engine) Configuring logging drivers (Engine) Control and configure Docker with systemd (Engine) ETW logging driver (Engine) Fluentd logging driver (Engine) Format command and log output (Engine) Google Cloud logging driver (Engine) Graylog Extended Format (GELF) logging driver (Engine) Journald logging driver (Engine) JSON File logging driver (Engine) Keep containers alive during daemon downtime (Engine) Limit a container's resources (Engine) Link via an ambassador container (Engine) Log tags for logging driver (Engine) Logentries logging driver (Engine) PowerShell DSC usage (Engine) Prune unused Docker objects (Engine) Run multiple services in a container (Engine) Runtime metrics (Engine) Splunk logging driver (Engine) Start containers automatically (Engine) Storage overview (Engine) Syslog logging driver (Engine) tmpfs mounts Troubleshoot volume problems (Engine) Use a logging driver plugin (Engine) Using Ansible (Engine) Using Chef (Engine) Using Puppet (Engine) View a container's logs (Engine) Volumes (Engine) Engine: CLI Daemon CLI reference (dockerd) (Engine) docker docker attach docker build docker checkpoint docker checkpoint create docker checkpoint ls docker checkpoint rm docker commit docker config docker config create docker config inspect docker config ls docker config rm docker container docker container attach docker container commit docker container cp docker container create docker container diff docker container exec docker container export docker container inspect docker container kill docker container logs docker container ls docker container pause docker container port docker container prune docker container rename docker container restart docker container rm docker container run docker container start docker container stats docker container stop docker container top docker container unpause docker container update docker container wait docker cp docker create docker deploy docker diff docker events docker exec docker export docker history docker image docker image build docker image history docker image import docker image inspect docker image load docker image ls docker image prune docker image pull docker image push docker image rm docker image save docker image tag docker images docker import docker info docker inspect docker kill docker load docker login docker logout docker logs docker network docker network connect docker network create docker network disconnect docker network inspect docker network ls docker network prune docker network rm docker node docker node demote docker node inspect docker node ls docker node promote docker node ps docker node rm docker node update docker pause docker plugin docker plugin create docker plugin disable docker plugin enable docker plugin inspect docker plugin install docker plugin ls docker plugin push docker plugin rm docker plugin set docker plugin upgrade docker port docker ps docker pull docker push docker rename docker restart docker rm docker rmi docker run docker save docker search docker secret docker secret create docker secret inspect docker secret ls docker secret rm docker service docker service create docker service inspect docker service logs docker service ls docker service ps docker service rm docker service scale docker service update docker stack docker stack deploy docker stack ls docker stack ps docker stack rm docker stack services docker start docker stats docker stop docker swarm docker swarm ca docker swarm init docker swarm join docker swarm join-token docker swarm leave docker swarm unlock docker swarm unlock-key docker swarm update docker system docker system df docker system events docker system info docker system prune docker tag docker top docker unpause docker update docker version docker volume docker volume create docker volume inspect docker volume ls docker volume prune docker volume rm docker wait Use the Docker command line (Engine) Engine: Extend Access authorization plugin (Engine) Docker log driver plugins Docker network driver plugins (Engine) Extending Engine with plugins Managed plugin system (Engine) Plugin configuration (Engine) Plugins API (Engine) Volume plugins (Engine) Engine: Security AppArmor security profiles for Docker (Engine) Automation with content trust (Engine) Content trust in Docker (Engine) Delegations for content trust (Engine) Deploying Notary (Engine) Docker security (Engine) Docker security non-events (Engine) Isolate containers with a user namespace (Engine) Manage keys for content trust (Engine) Play in a content trust sandbox (Engine) Protect the Docker daemon socket (Engine) Seccomp security profiles for Docker (Engine) Secure Engine Use trusted images Using certificates for repository client verification (Engine) Engine: Tutorials Engine tutorials Network containers (Engine) Get Started Part 1: Orientation Part 2: Containers Part 3: Services Part 4: Swarms Part 5: Stacks Part 6: Deploy your app Machine Amazon Web Services (Machine) Digital Ocean (Machine) docker-machine active docker-machine config docker-machine create docker-machine env docker-machine help docker-machine inspect docker-machine ip docker-machine kill docker-machine ls docker-machine provision docker-machine regenerate-certs docker-machine restart docker-machine rm docker-machine scp docker-machine ssh docker-machine start docker-machine status docker-machine stop docker-machine upgrade docker-machine url Driver options and operating system defaults (Machine) Drivers overview (Machine) Exoscale (Machine) Generic (Machine) Get started with a local VM (Machine) Google Compute Engine (Machine) IBM Softlayer (Machine) Install Machine Machine Machine CLI overview Machine command-line completion Machine concepts and help Machine overview Microsoft Azure (Machine) Microsoft Hyper-V (Machine) Migrate from Boot2Docker to Machine OpenStack (Machine) Oracle VirtualBox (Machine) Provision AWS EC2 instances (Machine) Provision Digital Ocean Droplets (Machine) Provision hosts in the cloud (Machine) Rackspace (Machine) VMware Fusion (Machine) VMware vCloud Air (Machine) VMware vSphere (Machine) Notary Client configuration (Notary) Common Server and signer configurations (Notary) Getting started with Notary Notary changelog Notary configuration files Running a Notary service Server configuration (Notary) Signer configuration (Notary) Understand the service architecture (Notary) Use the Notary client
characters

Swarm服務(wù)使用聲明性模型,這意味著您可以定義所需的服務(wù)狀態(tài),并依靠Docker來維護此狀態(tài)。該州包括諸如(但不限于)的信息:

  • 服務(wù)容器應(yīng)該運行的映像名稱和標(biāo)記

  • 有多少個容器參與服務(wù)

  • 是否有任何端口暴露給群體外的客戶

  • 當(dāng)Docker啟動時服務(wù)是否應(yīng)該自動啟動

  • 服務(wù)重新啟動時發(fā)生的特定行為(例如是否使用滾動重啟)

  • 服務(wù)可以運行的節(jié)點的特性(例如資源約束和布局偏好)

有關(guān)群體模式的概述,請參閱群體模式關(guān)鍵概念。有關(guān)服務(wù)如何工作的概述,請參閱服務(wù)如何工作。

創(chuàng)建一個服務(wù)

要創(chuàng)建沒有額外配置的單副本服務(wù),只需提供映像名稱即可。該命令啟動一個帶有隨機生成名稱并且沒有發(fā)布端口的Nginx服務(wù)。這是一個較為理想的例子,因為您將無法與Nginx服務(wù)交互。

$ docker service create nginx

該服務(wù)安排在可用節(jié)點上。要確認服務(wù)已成功創(chuàng)建并啟動,請使用以下docker service ls命令:

$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                                                                                             PORTS
a3iixnklxuem        quizzical_lamarr    replicated          1/1                 docker.io/library/nginx@sha256:41ad9967ea448d7c2b203c699b429abe1ed5af331cd92533900c6d77490e0268

創(chuàng)建的服務(wù)并不總是立即運行。如果服務(wù)的圖像不可用,如果沒有節(jié)點滿足您為服務(wù)配置的要求或其他原因,服務(wù)可能處于掛起狀態(tài)。有關(guān)更多信息,請參閱待定服務(wù)。

要為您的服務(wù)提供名稱,請使用以下--name標(biāo)志:

$ docker service create --name my_web nginx

就像使用獨立容器一樣,您可以通過在映像名稱后面添加它來指定服務(wù)容器應(yīng)該運行的命令。此示例啟動一個名為helloworld使用alpine圖像并運行以下命令的服務(wù)ping docker.com

$ docker service create --name helloworld alpine ping docker.com

您也可以指定要使用的服務(wù)的圖像標(biāo)記。這個例子修改了前一個使用alpine:3.6標(biāo)簽:

$ docker service create --name helloworld alpine:3.6 ping docker.com

有關(guān)圖像標(biāo)簽分辨率的更多詳細信息,請參閱指定服務(wù)應(yīng)使用的圖像版本。

更新服務(wù)

您可以使用該docker service update命令更改有關(guān)現(xiàn)有服務(wù)的幾乎所有內(nèi)容。當(dāng)您更新服務(wù)時,Docker會停止其容器并使用新配置重新啟動它們。

由于Nginx是一個Web服務(wù),如果您將端口80發(fā)布到群集外部的客戶端,它將會更好。您可以在創(chuàng)建服務(wù)時使用-p--publish標(biāo)志來指定。更新現(xiàn)有服務(wù)時,該標(biāo)志是--publish-add。還有一個--publish-rm標(biāo)志可以刪除以前發(fā)布的端口。

假設(shè)my_web來自上一節(jié)的服務(wù)仍然存在,請使用以下命令將其更新為發(fā)布端口80。

$ docker service update --publish-add 80 my_web

要驗證它是否有效,請使用docker service ls

$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                                                                                             PORTS
4nhxl7oxw5vz        my_web              replicated          1/1                 docker.io/library/nginx@sha256:41ad9967ea448d7c2b203c699b429abe1ed5af331cd92533900c6d77490e0268   *:0->80/tcp

有關(guān)發(fā)布端口如何工作的更多信息,請參閱發(fā)布端口。

您可以更新有關(guān)現(xiàn)有服務(wù)的幾乎每個配置詳細信息,包括其運行的圖像名稱和標(biāo)記。請參閱創(chuàng)建后更新服務(wù)的圖像。

刪除服務(wù)

要刪除服務(wù),請使用該docker service remove命令。您可以通過其ID或名稱來刪除服務(wù),如docker service ls命令的輸出中所示。以下命令將刪除該my_web服務(wù)。

$ docker service remove my_web

服務(wù)配置細節(jié)

以下各節(jié)提供有關(guān)服務(wù)配置的詳細信息。本主題不包括每個標(biāo)志或方案。在幾乎所有可以在服務(wù)創(chuàng)建時定義配置的情況下,您也可以用類似的方式更新現(xiàn)有服務(wù)的配置。

看命令行的引用為docker service createdocker service update,或運行與所述那些命令中的一個--help標(biāo)志。

配置運行時環(huán)境

您可以在容器中為運行時環(huán)境配置以下選項:

  • 使用--env標(biāo)志的環(huán)境變量

  • 使用該--workdir標(biāo)志的容器內(nèi)的工作目錄

  • 使用該--user標(biāo)志的用戶名或UID

以下服務(wù)的容器將有一個環(huán)境變量$MYVAR設(shè)置為myvalue,將從該/tmp/目錄運行,并將作為my_user用戶運行。

$ docker service create --name helloworld \  --env MYVAR=myvalue \  --workdir /tmp \  --user my_user \
  alpine ping docker.com

更新現(xiàn)有服務(wù)運行的命令

要更新現(xiàn)有服務(wù)運行的命令,可以使用該--args標(biāo)志。下面的示例更新一個已調(diào)用的現(xiàn)有服務(wù),helloworld以便它運行命令ping docker.com而不是之前運行的任何命令:

$ docker service update --args "ping docker.com" helloworld

指定服務(wù)應(yīng)使用的映像版本

當(dāng)您創(chuàng)建服務(wù)時未指定要使用的圖像版本的任何詳細信息時,該服務(wù)將使用帶有latest標(biāo)簽標(biāo)記的版本。您可以強制該服務(wù)以幾種不同的方式使用特定版本的圖像,具體取決于您想要的結(jié)果。

圖像版本可以用幾種不同的方式表達:

  • 如果您指定了一個標(biāo)簽,那么管理器(或Docker客戶端,如果您使用內(nèi)容信任)將該標(biāo)簽解析為摘要。當(dāng)在工作節(jié)點上接收到創(chuàng)建容器任務(wù)的請求時,工作節(jié)點只會看到摘要,而不是標(biāo)簽。$ docker service create --name =“myservice”ubuntu:16.04一些標(biāo)簽代表離散版本,例如ubuntu:16.04。像這樣的標(biāo)簽幾乎總是會隨著時間的推移逐漸形成穩(wěn)定的摘要。建議您盡可能使用這種標(biāo)簽。其他類型的標(biāo)簽(如latestnightly)可能經(jīng)常會解析為新的摘要,具體取決于圖像作者更新標(biāo)簽的頻率。建議不要使用經(jīng)常更新的標(biāo)簽來運行服務(wù),以防止使用不同映像版本的不同服務(wù)副本任務(wù)。

  • 如果您完全不指定版本,則按照慣例,圖像的latest標(biāo)記將被解析為摘要。創(chuàng)建服務(wù)任務(wù)時,工作人員使用此摘要中的圖像。因此,以下兩個命令是等價的:$ docker service create --name =“myservice”ubuntu $ docker service create --name =“myservice”ubuntu:latest

  • 如果直接指定摘要,則在創(chuàng)建服務(wù)任務(wù)時始終使用圖像的確切版本。$ docker service create \ --name =“myservice”\ ubuntu:16.04@sha256:35bc48a1ca97c3971611dc4662d08d131869daa692acb281c7e9e052924e38b1

當(dāng)你創(chuàng)建一個服務(wù)時,圖像的標(biāo)簽被解析為特定消化的標(biāo)記點,在服務(wù)創(chuàng)建的時間。該服務(wù)的工作者節(jié)點將永久使用該特定的摘要,除非該服務(wù)被明確更新。如果您使用經(jīng)常更改的標(biāo)簽(例如,latest),此功能尤其重要,因為它可確保所有服務(wù)任務(wù)使用相同版本的圖像。

注意:如果啟用了內(nèi)容信任,客戶端實際上會在聯(lián)系swarm管理器之前將圖像的標(biāo)簽解析為摘要,以驗證圖像是否已簽名。因此,如果您使用內(nèi)容信任,swarm管理器會收到預(yù)先解決的請求。在這種情況下,如果客戶端無法將圖像解析為摘要,則請求失敗。

如果管理者無法將標(biāo)簽解析為摘要,則每個工作者節(jié)點負責(zé)將標(biāo)簽解析為摘要,并且不同節(jié)點可以使用不同版本的圖像。如果發(fā)生這種情況,將會記錄下面的警告,用占位符代替真實信息。

unable to pin image <IMAGE-NAME> to digest: <REASON>

要查看圖像的當(dāng)前摘要,請發(fā)出命令docker檢查<IMAGE>:<TAG>并查找RepoDigests行。 以下是Ubuntu的最新摘要:最新的內(nèi)容寫入時。 為了清晰起見,輸出被截斷。

$ docker inspect ubuntu:latest
"RepoDigests": [    "ubuntu@sha256:35bc48a1ca97c3971611dc4662d08d131869daa692acb281c7e9e052924e38b1"],

在創(chuàng)建服務(wù)之后,除非您使用--image標(biāo)志顯式運行docker服務(wù)更新,否則其映像永遠不會更新,如下所述。 其他更新操作(如擴展服務(wù),添加或刪除網(wǎng)絡(luò)或體積,重命名服務(wù)或任何其他類型的更新操作)不會更新服務(wù)的映像。

創(chuàng)建后更新服務(wù)的圖像

每個標(biāo)簽代表一個摘要,類似于Git哈希。 一些標(biāo)簽,如最新的,經(jīng)常更新以指向新的摘要。 其他的,比如ubuntu:16.04,代表一個已發(fā)布的軟件版本,如果有的話,預(yù)計不會更新以指向新的摘要。 在Docker 1.13及更高版本中,當(dāng)您創(chuàng)建服務(wù)時,它將被限制為使用圖像的特定摘要創(chuàng)建任務(wù),直到您使用帶有--image標(biāo)志的服務(wù)更新來更新服務(wù)。 如果您使用較舊版本的Docker Engine,則必須刪除并重新創(chuàng)建該服務(wù)以更新其映像。

當(dāng)您將service update使用該--image標(biāo)志運行時,swarm管理器會查詢Docker Hub或您的私人Docker注冊中心以獲取標(biāo)記當(dāng)前指向的摘要并更新服務(wù)任務(wù)以使用該摘要。

注意:如果您使用內(nèi)容信任,Docker客戶端解析圖像,swarm管理器接收圖像和摘要,而不是標(biāo)簽。

通常,管理員能夠?qū)?biāo)簽解析為新的摘要和服務(wù)更新,重新部署每個任務(wù)以使用新圖像。如果經(jīng)理無法解決標(biāo)簽或發(fā)生其他問題,則接下來的兩節(jié)概述了期望的內(nèi)容。

如果管理者解析標(biāo)簽

如果swarm manager可以將image標(biāo)簽解析為摘要,它會指示工作節(jié)點重新部署任務(wù)并使用該摘要中的圖像。

  • 如果工作人員在該摘要中緩存了圖像,則會使用該圖像。

  • 如果不是,它會嘗試從Docker Hub或私有注冊表中提取圖像。

-  If it succeeds, the task is deployed using the new image.
-  If the worker fails to pull the image, the service fails to deploy on that worker node. Docker tries again to deploy the task, possibly on a different worker node.

如果管理者無法解析標(biāo)簽

如果swarm manager無法將圖像解析為摘要,則全部不會丟失:

  • 管理員指示工作節(jié)點使用該標(biāo)簽處的圖像重新部署任務(wù)。

  • 如果工作人員擁有解析為該標(biāo)記的本地緩存圖像,則它會使用該圖像。

  • 如果工作人員沒有解析為標(biāo)簽的本地高速緩存映像,則工作人員會嘗試連接到Docker Hub或私有注冊表以在該標(biāo)簽處拉取圖像。

-  If this succeeds, the worker uses that image.
-  If this fails, the task fails to deploy and the manager tries again to deploy the task, possibly on a different worker node.

發(fā)布端口

在創(chuàng)建群集服務(wù)時,可以通過兩種方式將該服務(wù)的端口發(fā)布到群集外的主機:

  • 你可以依靠路由網(wǎng)格。當(dāng)您發(fā)布服務(wù)端口時,無論在該節(jié)點上運行的服務(wù)是否有任務(wù),群集都可以在每個節(jié)點上的目標(biāo)端口上訪問該服務(wù)。這并不復(fù)雜,是許多類型服務(wù)的正確選擇。

  • 您可以直接在運行該服務(wù)的群集節(jié)點上發(fā)布服務(wù)任務(wù)的端口。此功能在Docker 1.13和更高版本中可用。這繞過了路由網(wǎng)格,并提供了最大的靈活性,包括您開發(fā)自己的路由框架的能力。但是,您有責(zé)任跟蹤每個任務(wù)的運行位置,并將請求路由到任務(wù),并在各個節(jié)點之間進行負載平衡。

請繼續(xù)閱讀以獲取更多信息和每種方法的用例。

使用路由網(wǎng)格發(fā)布服務(wù)的端口

要從外部向群發(fā)布服務(wù)的端口,請使用該--publish <TARGET-PORT>:<SERVICE-PORT>標(biāo)志。群集使服務(wù)可以在每個群集節(jié)點的目標(biāo)端口訪問。如果外部主機連接到任何群集節(jié)點上的該端口,則路由網(wǎng)格會將其路由到任務(wù)。外部主機不需要知道服務(wù)任務(wù)的IP地址或內(nèi)部使用端口與服務(wù)交互。當(dāng)用戶或進程連接到服務(wù)時,任何運行服務(wù)任務(wù)的工作節(jié)點都可能會響應(yīng)。有關(guān)群集服務(wù)網(wǎng)絡(luò)的更多詳細信息,請參閱管理群集服務(wù)網(wǎng)絡(luò)。

示例:在10節(jié)點群上運行三任務(wù)Nginx服務(wù)

假設(shè)您有一個10節(jié)點的群集,并且您部署了一個在10節(jié)點群集上運行三個任務(wù)的Nginx服務(wù):

$ docker service create --name my_web \                        --replicas 3 \                        --publish 8080:80 \
                        nginx

三個任務(wù)將在最多三個節(jié)點上運行。您不需要知道哪些節(jié)點正在運行任務(wù); 在10個節(jié)點中的任何節(jié)點上連接到端口8080 都會將您連接到三項nginx任務(wù)之一。你可以使用測試curl。以下示例假定這localhost是群集節(jié)點之一。如果情況并非如此,或者localhost無法解析到主機上的IP地址,請使用主機的IP地址或可解析的主機名稱。

HTML輸出被截斷:

$ curl localhost:8080<!DOCTYPE html><html><head><title>Welcome to nginx!</title>...truncated...</html>

后續(xù)連接可能會路由到同一個群集節(jié)點或不同的節(jié)點。

直接在swarm節(jié)點上發(fā)布服務(wù)的端口

如果您需要根據(jù)應(yīng)用程序狀態(tài)做出路由決策,或者需要完全控制將請求路由到服務(wù)任務(wù)的流程,則使用路由網(wǎng)格可能不是您的應(yīng)用程序的正確選擇。 要直接在正在運行的節(jié)點上發(fā)布服務(wù)的端口,請使用mode = host選項指定--publish標(biāo)志。

注意:如果您使用mode = host直接在群集節(jié)點上發(fā)布服務(wù)的端口,并設(shè)置published = <PORT>,則會創(chuàng)建隱式限制,您只能在給定群集節(jié)點上為該服務(wù)運行一個任務(wù)。 另外,如果您使用mode = host,并且您在docker service create上不使用--mode = global標(biāo)志,則很難知道哪些節(jié)點正在運行該服務(wù),以便將工作路由到它們。

示例:在每個群集節(jié)點上運行nginx Web服務(wù)器服務(wù)

nginx是一個開源的反向代理,負載均衡器,HTTP緩存和一個Web服務(wù)器。如果您使用路由網(wǎng)格將nginx作為服務(wù)運行,則連接到任何swarm節(jié)點上的nginx端口將顯示(有效)運行該服務(wù)的隨機群集節(jié)點的網(wǎng)頁。

以下示例在群集中的每個節(jié)點上運行nginx作為服務(wù),并在每個群集節(jié)點上本地公開nginx端口。

$ docker service create \  --mode global \  --publish mode=host,target=80,published=8080 \  --name=nginx \
  nginx:latest

您可以在每個群集節(jié)點的端口8080上訪問nginx服務(wù)器。如果您將一個節(jié)點添加到swarm中,則會啟動一個nginx任務(wù)。您不能在任何綁定到端口8080的群集節(jié)點上啟動另一個服務(wù)或容器。

注意:這是一個理想的例子。為多層服務(wù)創(chuàng)建應(yīng)用程序?qū)勇酚煽蚣芊浅?fù)雜,超出了本主題的范圍。

將服務(wù)連接到覆蓋網(wǎng)絡(luò)

您可以使用覆蓋網(wǎng)絡(luò)連接群中的一個或多個服務(wù)。

首先,使用docker network create帶有--driver overlay標(biāo)志的命令在管理器節(jié)點上創(chuàng)建覆蓋網(wǎng)絡(luò)。

$ docker network create --driver overlay my-network

在群集模式下創(chuàng)建覆蓋網(wǎng)絡(luò)后,所有管理節(jié)點都可以訪問網(wǎng)絡(luò)。

您可以創(chuàng)建新服務(wù)并傳遞該--network標(biāo)志以將服務(wù)附加到覆蓋網(wǎng)絡(luò):

$ docker service create \  --replicas 3 \  --network my-network \  --name my-web \
  nginx

群體擴展my-network到運行服務(wù)的每個節(jié)點。

您還可以使用該--network-add標(biāo)志將現(xiàn)有服務(wù)連接到覆蓋網(wǎng)絡(luò)。

$ docker service update --network-add my-network my-web

要斷開正在運行的服務(wù)與網(wǎng)絡(luò)的連接,請使用該--network-rm標(biāo)志。

$ docker service update --network-rm my-network my-web

有關(guān)覆蓋網(wǎng)絡(luò)和服務(wù)發(fā)現(xiàn)的更多信息,請參閱將服務(wù)附加到覆蓋網(wǎng)絡(luò)和Docker群集模式覆蓋網(wǎng)絡(luò)安全模型。

授予對秘密的服務(wù)訪問權(quán)限

要創(chuàng)建一個訪問Docker管理的機密的服務(wù),請使用該--secret標(biāo)志。有關(guān)更多信息,請參閱管理Docker服務(wù)的敏感字符串(機密)

控制服務(wù)規(guī)模和布局

Swarm模式有兩種類型的服務(wù):復(fù)制和全局。對于復(fù)制服務(wù),您指定swarm管理器調(diào)度到可用節(jié)點的副本任務(wù)數(shù)。對于全局服務(wù),調(diào)度程序在每個可用節(jié)點上放置一個任務(wù)。

您可以使用--mode標(biāo)志來控制服務(wù)的類型。如果您未指定模式,則該服務(wù)默認為replicated。對于復(fù)制服務(wù),您可以指定要使用該--replicas標(biāo)志開始的副本任務(wù)數(shù)。例如,要使用3個副本任務(wù)啟動復(fù)制的nginx服務(wù):

$ docker service create \  --name my_web \  --replicas 3 \
  nginx

要在每個可用節(jié)點上啟動全局服務(wù),請傳遞--mode globaldocker service create。每當(dāng)新節(jié)點變?yōu)榭捎脮r,調(diào)度程序就將全局服務(wù)的任務(wù)放置在新節(jié)點上。例如,要開始在群中每個節(jié)點上運行阿爾派的服務(wù):

$ docker service create \  --name myservice \  --mode global \
  alpine top

通過服務(wù)約束,您可以在調(diào)度程序?qū)⒎?wù)部署到節(jié)點之前設(shè)置節(jié)點的條件。您可以根據(jù)節(jié)點屬性和元數(shù)據(jù)或引擎元數(shù)據(jù)將約束應(yīng)用于服務(wù)。有關(guān)約束的更多信息,請參閱docker service createCLI參考。

使用布置首選項將任務(wù)均勻分配到不同類別的節(jié)點上。一個可能有用的例子是在多個數(shù)據(jù)中心或可用區(qū)域之間平衡任務(wù)。在這種情況下,您可以使用展示位置首選項將任務(wù)分散到多個數(shù)據(jù)中心,并使面向本地中斷時的服務(wù)更具彈性。您可以使用其他布局偏好設(shè)置來進一步將任務(wù)分成多組節(jié)點。例如,您可以在每個數(shù)據(jù)中心內(nèi)的多個機架上平衡它們。有關(guān)約束的更多信息,請參閱docker service createCLI參考。

為服務(wù)預(yù)留內(nèi)存或CPU

要為服務(wù)保留給定數(shù)量的內(nèi)存或CPU數(shù)量,請使用--reserve-memory--reserve-cpu標(biāo)志。如果沒有可用的節(jié)點能夠滿足要求(例如,如果請求4個CPU并且群中沒有節(jié)點具有4個CPU),則服務(wù)保持掛起狀態(tài),直到節(jié)點可用于運行其任務(wù)。

內(nèi)存異常(OOME)

如果您的服務(wù)嘗試使用比swarm節(jié)點更多的內(nèi)存,則可能會遇到內(nèi)存異常(OOME),并且容器或Docker守護進程可能會被內(nèi)核OOM殺手所殺。要防止發(fā)生這種情況,請確保您的應(yīng)用程序在具有足夠內(nèi)存的主機上運行,并且請參閱了解耗盡內(nèi)存的風(fēng)險。

Swarm服務(wù)允許您使用資源約束,布局首選項和標(biāo)簽來確保將您的服務(wù)部署到適當(dāng)?shù)娜杭?jié)點。

指定服務(wù)布局偏好(-placement-pref)

您可以設(shè)置服務(wù),將任務(wù)均勻分配到不同類別的節(jié)點上??梢杂杏玫囊粋€例子是在一組數(shù)據(jù)中心或可用區(qū)域上平衡任務(wù)。下面的例子說明了這一點:

$ docker service create \  --replicas 9 \  --name redis_2 \  --placement-pref 'spread=node.labels.datacenter' \
  redis:3.0.6

這使用帶有擴展策略(當(dāng)前唯一支持的策略)的--placement-pref來將任務(wù)均勻分布在數(shù)據(jù)中心節(jié)點標(biāo)簽的值上。 在這個例子中,我們假設(shè)每個節(jié)點都附有一個數(shù)據(jù)中心節(jié)點標(biāo)簽。 如果群體中的節(jié)點之間存在三個不同的標(biāo)簽值,則三分之一的任務(wù)將被放置在與每個值相關(guān)的節(jié)點上。 即使有更多的節(jié)點具有一個值而不是另一個值,情況也是如此。 例如,請考慮以下一組節(jié)點:

  • Three nodes with node.labels.datacenter=east

  • Two nodes with node.labels.datacenter=south

  • One node with node.labels.datacenter=west

由于我們正在傳播數(shù)據(jù)中心標(biāo)簽的值,并且該服務(wù)有9個副本,因此每個數(shù)據(jù)中心將有3個副本。 有三個節(jié)點與east的值相關(guān)聯(lián),所以每個節(jié)點都會為這個值保留三個副本中的一個。 有兩個值為南的節(jié)點,這個值的三個副本將在它們之間分配,一個接收兩個副本,另一個接收一個副本。 最后,西部有一個節(jié)點,它可以將所有三個副本保留給西部。

如果某個類別中的節(jié)點(例如那些帶有node.labels.datacenter=south的節(jié)點)由于約束或資源限制而無法處理其公平份額的任務(wù),則可能會將其他任務(wù)分配給其他節(jié)點。

布局首選項支持引擎標(biāo)簽和節(jié)點標(biāo)簽。上面的示例使用節(jié)點標(biāo)簽,因為標(biāo)簽是以引用的node.labels.datacenter。要分布引擎標(biāo)簽的值,請使用--placement-pref spread=engine.labels.<labelname>

可以向服務(wù)添加多個展示位置偏好設(shè)置。這建立了偏好的層次結(jié)構(gòu),因此任務(wù)首先被劃分為一個類別,然后進一步劃分為其他類別。這可能有用的一個例子是在數(shù)據(jù)中心之間公平地分配任務(wù),然后將每個數(shù)據(jù)中心內(nèi)的任務(wù)分成多個機架。要添加多個展示位置首選項,請--placement-pref多次指定標(biāo)志。順序非常重要,布置首選項將按進行排定決策時的順序應(yīng)用。

以下示例使用多個展示位置首選項設(shè)置服務(wù)。任務(wù)首先在各個數(shù)據(jù)中心上傳播,然后在機架上傳播(如各個標(biāo)簽所示):

$ docker service create \  --replicas 9 \  --name redis_2 \  --placement-pref 'spread=node.labels.datacenter' \  --placement-pref 'spread=node.labels.rack' \
  redis:3.0.6

此圖說明了展示位置偏好的工作原理

在使用Docker服務(wù)更新更新服務(wù)時,--placement-pref-add會在所有現(xiàn)有展示位置首選項之后附加新的展示位置首選項。 --placement-pref-rm刪除與參數(shù)匹配的現(xiàn)有展示位置偏好設(shè)置。

配置服務(wù)的更新行為

在創(chuàng)建服務(wù)時,您可以指定滾動更新行為,以便在運行docker服務(wù)更新時swarm應(yīng)該如何將更改應(yīng)用于服務(wù)。 您也可以將這些標(biāo)志指定為更新的一部分,作為docker服務(wù)更新的參數(shù)。

--update-delay標(biāo)志配置更新服務(wù)任務(wù)或多組任務(wù)之間的時間延遲。您可以將時間描述T為秒數(shù)Ts,分鐘數(shù)Tm或小時數(shù)的組合Th。因此10m30s表示延遲10分30秒。

默認情況下,調(diào)度程序一次更新1個任務(wù)。 您可以傳遞--update-parallelism標(biāo)志來配置調(diào)度程序同時更新的最大服務(wù)任務(wù)數(shù)。

當(dāng)對單個任務(wù)的更新返回RUNNING狀態(tài)時,調(diào)度程序通過繼續(xù)執(zhí)行另一個任務(wù)來繼續(xù)更新,直到更新所有任務(wù)。 如果在更新期間任何時候任務(wù)返回FAILED,則調(diào)度程序會暫停更新。 您可以使用docker service create或docker service update的--update-failure-action標(biāo)志來控制行為。

在下面的示例服務(wù)中,調(diào)度程序一次最多應(yīng)用2個副本。當(dāng)更新的任務(wù)返回RUNNING或者FAILED,調(diào)度程序在停止下一個任務(wù)更新之前等待10秒鐘:

$ docker service create \  --replicas 10 \  --name my_web \  --update-delay 10s \  --update-parallelism 2 \  --update-failure-action continue \
  alpine

--update-max-failure-ratio標(biāo)志控制在更新之前更新的整個過程中可能失敗的部分任務(wù)可能失敗。 例如,使用--update-max-failure-ratio 0.1 --update-failure-action暫停,10%的任務(wù)更新失敗后,更新將暫停。

如果任務(wù)未啟動,或者在--update-monitor標(biāo)志指定的監(jiān)視時間段內(nèi)停止運行,則認為單個任務(wù)更新失敗。 --update-monitor的默認值為30秒,這意味著任務(wù)在其開始后的前30秒內(nèi)失敗,將計入服務(wù)更新失敗閾值,并且在此之后的失敗將不計入。

回滾到服務(wù)的先前版本

如果更新版本的服務(wù)沒有按預(yù)期運行,可以使用docker service update的 - 回滾標(biāo)志手動回滾到服務(wù)的先前版本。 這會將服務(wù)恢復(fù)到最新的Docker服務(wù)更新命令之前的配置。

其他選項可以與--rollback; 例如,--update-delay 0s在任務(wù)之間執(zhí)行回滾而沒有延遲:

$ docker service update \  --rollback \  --update-delay 0s
  my_web

在Docker 17.04及更高版本中,如果服務(wù)更新未能部署,您可以將服務(wù)配置為自動回滾。如果更新失敗,請參閱自動回滾。

與新的自動回滾功能相關(guān),在Docker 17.04及更高版本中,如果守護程序運行Docker 17.04或更高版本,手動回滾將在服務(wù)器端而不是客戶端進行處理。這允許手動啟動的回滾來遵守新的回滾參數(shù)??蛻舳耸前姹靖兄模运匀粫褂门f的守護進程的方法。

最后,在Docker 17.04及更高版本中, - rollback不能與其他標(biāo)志一起用于docker服務(wù)更新。

如果更新失敗,則自動回滾

您可以通過以下方式來配置服務(wù):如果對服務(wù)的更新導(dǎo)致重新部署失敗,則該服務(wù)可以自動回滾到以前的配置。這有助于保護服務(wù)可用性。您可以在創(chuàng)建或更新服務(wù)時設(shè)置以下一個或多個標(biāo)志。如果您未設(shè)置值,則使用默認值。

默認

描述

--rollback延遲

0

在回滾下一個任務(wù)之前回滾任務(wù)之后要等待的時間量。值為0意味著在部署第一個回滾任務(wù)后立即回滾第二個任務(wù)。

--rollback故障影響的行動

暫停

當(dāng)任務(wù)無法回滾時,是暫停還是繼續(xù)嘗試回滾其他任務(wù)。

--rollback-MAX-故障率

0

在回滾期間容忍的故障率,指定為介于0和1之間的浮點數(shù)。例如,給定5個任務(wù),故障率為0.2將允許一個任務(wù)無法回滾。值為0表示不允許失敗,值為1表示允許任意數(shù)量的失敗。

--rollback顯示器

5S

每個任務(wù)回滾之后的持續(xù)時間以監(jiān)視失敗。如果任務(wù)在此時間段過去之前停止,則認為回滾失敗。

--rollback并行性

1

并行回滾的最大任務(wù)數(shù)。默認情況下,一次回滾一個任務(wù)。值為0將導(dǎo)致所有任務(wù)并行回滾。

以下示例將配置redis服務(wù),以在Docker服務(wù)更新未能部署時自動回滾。 兩個任務(wù)可以并行回滾。 任務(wù)在回滾后監(jiān)視20秒,以確保它們不會退出,并且最大失敗率為20%是可以接受的。 默認值用于--rollback-delay和--rollback-failure-action。

$ docker service create --name=my_redis \                        --replicas=5 \                        --rollback-parallelism=2 \                        --rollback-monitor=20s \                        --rollback-max-failure-ratio=.2 \
                        redis:latest

提供服務(wù)訪問卷或綁定掛載

為了獲得最佳性能和可移植性,您應(yīng)避免將重要數(shù)據(jù)直接寫入容器的可寫層,而應(yīng)使用數(shù)據(jù)卷或綁定掛載。這一原則也適用于服務(wù)。

您可以為swarm中的服務(wù)創(chuàng)建兩種類型的掛載,卷掛載或綁定掛載。 無論使用哪種類型的掛載,在創(chuàng)建服務(wù)時使用--mount標(biāo)志進行配置,或在更新現(xiàn)有服務(wù)時使用--mount-add或--mount-rm標(biāo)志進行配置。如果你沒有指定類型,則默認值是數(shù)據(jù)卷

數(shù)據(jù)量

數(shù)據(jù)卷是在刪除任務(wù)的容器后保持活動的存儲。裝入卷的首選方法是利用現(xiàn)有卷:

$ docker service create \  --mount src=<VOLUME-NAME>,dst=<CONTAINER-PATH> \  --name myservice \  <IMAGE>

有關(guān)如何創(chuàng)建卷的更多信息,請參閱volume createCLI參考。

以下方法在部署時在調(diào)度程序調(diào)度任務(wù)時創(chuàng)建卷,即在啟動容器之前:

$ 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>

重要說明:如果您的卷驅(qū)動程序接受逗號分隔列表作為選項,則必須從外部CSV分析程序中轉(zhuǎn)義該值。 要轉(zhuǎn)義卷-opt,請用雙引號(“)括起來,并用單引號(')括住整個裝入?yún)?shù)。

  例如,本地驅(qū)動程序接受掛載選項作為o參數(shù)中的逗號分隔列表。 此示例顯示了轉(zhuǎn)義列表的正確方法。

  $ docker service create \ --mount'type = volume,src = <VOLUME-NAME>,dst = <CONTAINER-PATH>,volume-driver = local,volume-opt = type = nfs,volume-opt = device = < nfs-server>:<nfs-path>,“volume-opt = o = addr = <nfs-address>,vers = 4,soft,timeo = 180,bg,tcp,rw”' - myservice \ <IMAGE>

綁定掛載

綁定掛載是調(diào)度程序為該任務(wù)部署容器的主機的文件系統(tǒng)路徑。Docker將路徑安裝到容器中。文件系統(tǒng)路徑必須在swarm為任務(wù)初始化容器之前存在。

以下示例顯示了綁定掛載語法:

  • 要掛載一個讀寫綁定:$ docker service create \ --mount type = bind,src = <HOST-PATH>,dst = <CONTAINER-PATH> \ --name myservice \ <IMAGE>

  • 要裝入一個只讀綁定:$ docker service create \ --mount type = bind,src = <HOST-PATH>,dst = <CONTAINER-PATH>,只讀\ --name myservice \ <IMAGE>

重要提示:綁定安裝可能很有用,但它們也可能導(dǎo)致問題。在大多數(shù)情況下,建議您構(gòu)建應(yīng)用程序,以便不需要從主機安裝路徑。主要風(fēng)險包括以下幾點:

  • 如果將主機路徑綁定到服務(wù)的容器中,則該路徑必須存在于每個群集節(jié)點上。Docker群模式調(diào)度程序可以在滿足資源可用性要求的任何機器上調(diào)度容器,并滿足您指定的所有約束和位置偏好。

  • 如果Docker群模式調(diào)度程序變得不健康或無法訪問,Docker群模式調(diào)度程序可能會隨時重新安排正在運行的服務(wù)容器。

  • 主機綁定掛載是完全不可移植的。當(dāng)您使用綁定掛載時,不能保證您的應(yīng)用程序在開發(fā)過程中的運行方式與生產(chǎn)過程中的運行方式相同。

使用模板創(chuàng)建服務(wù)

您可以使用service createGo的文本/模板軟件包提供的語法來為某些標(biāo)志使用模板。

支持以下標(biāo)志:

  • --hostname

  • --mount

  • --env

Go模板的有效占位符是:

占位符

描述

.Service.ID

服務(wù)ID

.Service.Name

服務(wù)名稱

.Service.Labels

服務(wù)標(biāo)簽

.Node.ID

節(jié)點ID

.Task.Name

任務(wù)名稱

.Task.Slot

任務(wù)槽

模板示例

本示例根據(jù)服務(wù)的名稱和容器運行節(jié)點的ID來設(shè)置創(chuàng)建的容器的模板:

$ docker service create --name hosttempl \                        --hostname="{{.Node.ID}}-{{.Service.Name}}"\
                         busybox top

要查看使用模板的結(jié)果,請使用docker service psdocker inspect命令。

$ docker service ps va8ew30grofhjoychbr6iot8c

ID            NAME         IMAGE                                                                                   NODE          DESIRED STATE  CURRENT STATE               ERROR  PORTS
wo41w8hg8qan  hosttempl.1  busybox:latest@sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912  2e7a8a9c4da2  Running        Running about a minute ago
$ docker inspect --format="{{.Config.Hostname}}" hosttempl.1.wo41w8hg8qanxwjwsg4kxpprj

擴展內(nèi)容

  • 群體管理指南

  • Docker引擎命令行參考

  • Swarm模式教程

Previous article: Next article: