GVKun编程网logo

Docker Swarm(docker swarm集群)

5

如果您对DockerSwarm和dockerswarm集群感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解DockerSwarm的各种细节,并对dockerswarm集群进行深入的分析,此外还有

如果您对Docker Swarmdocker swarm集群感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Docker Swarm的各种细节,并对docker swarm集群进行深入的分析,此外还有关于29. docker swarm 创建 三个节点 swarm 的集群、35. docker swarm dockerStack 部署 投票应用、37. docker swarm docker service 的更新、Docker Compose 和 Docker Swarm 和 Docker Service的实用技巧。

本文目录一览:

Docker Swarm(docker swarm集群)

Docker Swarm(docker swarm集群)

一。架构

Dokcer swarm 主要有两部分组成:一个奇数的 manger 节点 的 a raft consensus group,和一组工作结点,工作结点之间使用的是流言网络协议 ,也叫做控制层面。下图对架构的阐述:

每个管理节点在它本地的 raft 存储都有 swarm 状态的所有信息,它们的通信方式使用的是同步的一种方式。

工作节点之间由于扩容的原因,使用是异步通信方式



二。创建 Docker Swarm

1. swarm 的初始化

xiodi@c720131:~$ sudo docker swarm init
Swarm initialized: current node (6h6a4hf307jil12pa891siaib) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-08odkkfd4mui46wvxlehv0y5klis7z30q28mrp7pnw89y4a11y-0rvkmr0tikgulqjgl8h2g6xtw 192.168.20.131:2377

To add a manager to this swarm, run ''docker swarm join-token manager'' and follow the instructions.


2. 列出 swarm 的节点

xiodi@c720131:~$ sudo docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
6h6a4hf307jil12pa891siaib *   c720131.xiodi.cn    Ready               Active              Leader              18.05.0-ce


3. 检查节点的详细信息

xiodi@c720131:~$ sudo docker node inspect 6h6a4hf307jil12pa891siaib
[
     {
         "ID": "6h6a4hf307jil12pa891siaib",
         "Version": {
             "Index": 9
         },
         "CreatedAt": "2018-06-06T07:09:41.581326206Z",
         "UpdatedAt": "2018-06-06T07:09:42.09767829Z",
         "Spec": {
             "Labels": {},
             "Role": "manager",
             "Availability": "active"
         },
         "Description": {
             "Hostname": "c720131.xiodi.cn",
             "Platform": {
                 "Architecture": "x86_64",
                 "OS": "linux"
             },
             "Resources": {
                 "NanoCPUs": 2000000000,
                 "MemoryBytes": 4143411200
             },
             "Engine": {
                 "EngineVersion": "18.05.0-ce",
                 "Plugins": [
                     {
                         "Type": "Log",
                         "Name": "awslogs"
                     },
                     {
                         "Type": "Log",
                         "Name": "fluentd"
                     },
                     {
                         "Type": "Log",
                         "Name": "gcplogs"
                     },
                     {
                         "Type": "Log",
                         "Name": "gelf"
                     },
                     {
                         "Type": "Log",
                         "Name": "journald"
                     },
                     {
                         "Type": "Log",
                         "Name": "json-file"
                     },
                     {
                         "Type": "Log",
                         "Name": "logentries"
                     },
                     {
                         "Type": "Log",
                         "Name": "splunk"
                     },
                     {
                         "Type": "Log",
                         "Name": "syslog"
                     },
                     {
                         "Type": "Network",
                         "Name": "bridge"
                     },
                     {
                         "Type": "Network",
                         "Name": "host"
                     },
                     {
                         "Type": "Network",
                         "Name": "macvlan"
                     },
                     {
                         "Type": "Network",
                         "Name": "null"
                     },
                     {
                         "Type": "Network",
                         "Name": "overlay"
                     },
                     {
                         "Type": "Volume",
                         "Name": "local"
                     }
                 ]
             },
             "TLSInfo": {
                 "TrustRoot": "-----BEGIN CERTIFICATE-----\nMIIBajCCARCgAwIBAgIUWWC4eyklvnLS5Jg/voHIkWorxCIwCgYIKoZIzj0EAwIw\nEzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTgwNjA2MDcwNTAwWhcNMzgwNjAxMDcw\nNTAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABO8UDtnIWogbHOVgdV2Gq7dqlrmGxiS9t2S53bciCJEcSZEARRdq2qEfGI3N\nDFksU70gOhMPTzYwyyqWUGlnZzCjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBQqIjWQ8OWpVx6ZKXrEyaV4OuaoQTAKBggqhkjO\nPQQDAgNIADBFAiA2OiJMd2OwuXFH4uQixic7TvCLRaemuLnkR4MXKdhJKAIhAP+Y\nf6FL0wZw/NVDRw3Z6lNDl9Wayv5lHwC6V36C9DpP\n-----END CERTIFICATE-----\n",
                 "CertIssuerSubject": "MBMxETAPBgNVBAMTCHN3YXJtLWNh",
                 "CertIssuerPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7xQO2chaiBsc5WB1XYart2qWuYbGJL23ZLndtyIIkRxJkQBFF2raoR8Yjc0MWSxTvSA6Ew9PNjDLKpZQaWdnMA=="
             }
         },
         "Status": {
             "State": "ready",
             "Addr": "192.168.20.131"
         },
         "ManagerStatus": {
             "Leader": true,
             "Reachability": "reachable",
             "Addr": "192.168.20.131:2377"
         }
     }
]



三。使用 swarm 创建单个服务

(1)创建一个 stack 文件

version: "3.5"
services:
   whoami:
     image: training/whoami:latest
     networks:
       - test-net
     ports:
       - 81:8000
     deploy:
       replicas: 6
       update_config:
         parallelism: 2
         delay: 10s
       labels:
         app: sample-app
         environment: prod-south

networks:
   test-net:
     driver: overlay


2. 进行部署 stack

xiodi@c720131:~/docker$ sudo docker stack deploy -c stack.yaml sample-stack
[sudo] password for xiodi:
Creating network sample-stack_test-net
Creating service sample-stack_whoami


3. 查看部署的 stack

xiodi@c720131:~/docker$ sudo docker stack ls
NAME                SERVICES
sample-stack        1


4. 查看部署的服务

xiodi@c720131:~/docker$ sudo docker service ls
ID                  NAME                  MODE                REPLICAS            IMAGE                    PORTS
t98tjpn7xpby        sample-stack_whoami   replicated          6/6                 training/whoami:latest   *:81->8000/tcp


5. 检查服务和它的任务

xiodi@c720131:~/docker$ sudo docker service ps sample-stack_whoami
ID                                     NAME                    IMAGE                           NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
ib67sdpbu7xc          sample-stack_whoami.1   training/whoami:latest   ubuntu                  Running                  Running 3 minutes ago                      
3qhfu2lj4qis            sample-stack_whoami.2   training/whoami:latest   c720131.xiodi.cn    Running                  Running 3 minutes ago                      
xdrxww29h2wi        sample-stack_whoami.3   training/whoami:latest   c720132.xiodi.cn    Running                  Running 3 minutes ago                      
mtyc6cw65qu0        sample-stack_whoami.4   training/whoami:latest   ubuntu                  Running                  Running 3 minutes ago                      
x8gtlzrqwm3j          sample-stack_whoami.5   training/whoami:latest   c720131.xiodi.cn    Running                  Running 3 minutes ago                      
vfq7gksylhom          sample-stack_whoami.6   training/whoami:latest   c720132.xiodi.cn    Running                  Running 3 minutes ago 


6. 列出在该节点运行的容器

xiodi@c720131:~/docker$ sudo docker container ls
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS               NAMES
0cafe15b204c        training/whoami:latest   "/app/http"         5 minutes ago       Up 5 minutes        8000/tcp            sample-stack_whoami.2.3qhfu2lj4qisgk5akkskzqnop
42b4d5626c58        training/whoami:latest   "/app/http"         5 minutes ago       Up 5 minutes        8000/tcp            sample-stack_whoami.5.x8gtlzrqwm3juduzonczhima1


stack---service--- 任务 -- 和容器对应关系如下图:


7. 获取服务的详细信息

xiodi@c720131:~/docker$ sudo docker service inspect sample-stack_whoami
[
     {
         "ID": "t98tjpn7xpbyryk7ikbtucwut",
         "Version": {
             "Index": 25
         },
         "CreatedAt": "2018-06-06T07:29:03.797319458Z",
         "UpdatedAt": "2018-06-06T07:29:03.802084194Z",
         "Spec": {
             "Name": "sample-stack_whoami",
             "Labels": {
                 "app": "sample-app",
                 "com.docker.stack.image": "training/whoami:latest",
                 "com.docker.stack.namespace": "sample-stack",
                 "environment": "prod-south"
             },
             "TaskTemplate": {
                 "ContainerSpec": {
                     "Image": "training/whoami:latest@sha256:4d54f5ea6d2c562ae96add2792e8d71a56b7613cbc4e7b8e20a4e4d3085bbaff",
                     "Labels": {
                         "com.docker.stack.namespace": "sample-stack"
                     },
                     "Privileges": {
                         "CredentialSpec": null,
                         "SELinuxContext": null
                     },
                     "StopGracePeriod": 10000000000,
                     "DNSConfig": {},
                     "Isolation": "default"
                 },
                 "Resources": {},
                 "RestartPolicy": {
                     "Condition": "any",
                     "Delay": 5000000000,
                     "MaxAttempts": 0
                 },
                 "Placement": {
                     "Platforms": [
                         {
                             "Architecture": "amd64",
                             "OS": "linux"
                         }
                     ]
                 },
                 "Networks": [
                     {
                         "Target": "ojgp9mdhz2xaorsxca0g64zv2",
                         "Aliases": [
                             "whoami"
                         ]
                     }
                 ],
                 "ForceUpdate": 0,
                 "Runtime": "container"
             },
             "Mode": {
                 "Replicated": {
                     "Replicas": 6
                 }
             },
             "UpdateConfig": {
                 "Parallelism": 2,
                 "Delay": 10000000000,
                 "FailureAction": "pause",
                 "Monitor": 5000000000,
                 "MaxFailureRatio": 0,
                 "Order": "stop-first"
             },
             "RollbackConfig": {
                 "Parallelism": 1,
                 "FailureAction": "pause",
                 "Monitor": 5000000000,
                 "MaxFailureRatio": 0,
                 "Order": "stop-first"
             },
             "EndpointSpec": {
                 "Mode": "vip",
                 "Ports": [
                     {
                         "Protocol": "tcp",
                         "TargetPort": 8000,
                         "PublishedPort": 81,
                         "PublishMode": "ingress"
                     }
                 ]
             }
         },
         "Endpoint": {
             "Spec": {
                 "Mode": "vip",
                 "Ports": [
                     {
                         "Protocol": "tcp",
                         "TargetPort": 8000,
                         "PublishedPort": 81,
                         "PublishMode": "ingress"
                     }
                 ]
             },
             "Ports": [
                 {
                     "Protocol": "tcp",
                     "TargetPort": 8000,
                     "PublishedPort": 81,
                     "PublishMode": "ingress"
                 }
             ],
             "VirtualIPs": [
                 {
                     "NetworkID": "1ov2xqk3ws0017wq9x1eo9sv3",
                     "Addr": "10.255.0.5/16"
                 },
                 {
                     "NetworkID": "ojgp9mdhz2xaorsxca0g64zv2",
                     "Addr": "10.0.0.5/24"
                 }
             ]
         }
     }
]


8. 获取服务的日志信息

xiodi@c720131:~/docker$ sudo docker service logs sample-stack_whoami
sample-stack_whoami.2.3qhfu2lj4qis@c720131.xiodi.cn    | Listening on :8000
sample-stack_whoami.5.x8gtlzrqwm3j@c720131.xiodi.cn    | Listening on :8000
sample-stack_whoami.3.xdrxww29h2wi@c720132.xiodi.cn    | Listening on :8000
sample-stack_whoami.6.vfq7gksylhom@c720132.xiodi.cn    | Listening on :8000
sample-stack_whoami.4.mtyc6cw65qu0@ubuntu    | Listening on :8000
sample-stack_whoami.1.ib67sdpbu7xc@ubuntu    | Listening on :8000


9. 协调至满意状态(在某个容器由于某原因不能提供服务时,swarm 会自动修复这种状态)

(1)在此删除其中一个实列。

xiodi@c720131:~$ sudo docker container rm -f sample-stack_whoami.2.3qhfu2lj4qisgk5akkskzqnop
sample-stack_whoami.2.3qhfu2lj4qisgk5akkskzqnop

1528271788(1)


10. 从第 9 步可以看到,docker-swarm 是可以自动恢复的。


11. 接下来演示一下停止掉一个 worker 节点,看会怎么样。

M945SRM4WG1FT6S5H]H49BW

从上图可以看到,我们停止一个 worker 节点后,仍然能够自动恢复。


12. 删除服务或者 stack.

xiodi@c720131:~$ sudo docker stack rm sample-stack
Removing service sample-stack_whoami
Removing network sample-stack_test-net


四。使用 Docker swarm 部署多个服务 stack.

1. stack 文件内容如下

xiodi@c720131:~/docker$ cat pet-stack.yaml
version: "3.5"
services:
   web:
     image: fundamentalsofdocker/ch08-web:1.0
     networks:
       - pets-net
     ports:
       - 3000:3000
     deploy:
       replicas: 3
   db:
     image: fundamentalsofdocker/ch08-db:1.0
     networks:
       - pets-net
     volumes:
       - pets-data:/var/lib/postgresql/data

volumes:
   pets-data:

networks:
   pets-net:
     driver: overlay


2. 部署服务应用

xiodi@c720131:~/docker$ sudo docker stack deploy -c pet-stack.yaml pets
Creating network pets_pets-net
Creating service pets_db
Creating service pets_web


3. 在 pets stack 列出所有的任务

xiodi@c720131:~/docker$ sudo docker stack ps pets
ID                  NAME                IMAGE                               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
99uuyw2m5fbc        pets_web.1          fundamentalsofdocker/ch08-web:1.0   c720132.xiodi.cn    Running             Running about a minute ago                      
8key67a3aaai          pets_db.1            fundamentalsofdocker/ch08-db:1.0      c720131.xiodi.cn    Running             Running about a minute ago                      
nkogzxahoxhq         pets_web.2          fundamentalsofdocker/ch08-web:1.0   ubuntu                   Running             Running about a minute ago                      
6230n44cvt04         pets_web.3          fundamentalsofdocker/ch08-web:1.0   c720131.xiodi.cn    Running             Running about a minute ago


4. 请求本机的 3000 端口,校验部署的服务

[H`1VHW))OEB$L7SC14070Z

29. docker swarm 创建 三个节点 swarm 的集群

29. docker swarm 创建 三个节点 swarm 的集群

1.使用 vagrant 部署 三台 centos/7 的 环境

###Vagrantfile

# -*- mode: ruby -*-

# vi: set ft=ruby :

Vagrant.require_version ">= 1.6.0"

boxes = [

    {

            :name=>"docker-host",

            :eth1=>"192.168.205.10",

            :mem=>"1024",

            :cpu=>"1",

            :port=>"8888"

    },

    {

            :name=>"docker-node1",

            :eth1=>"192.168.205.11",

            :mem=>"1024",

            :cpu=>"1",

            :port=>"8889"

    },

    {

            :name=>"docker-node2",

            :eth1=>"192.168.205.12",

            :mem=>"1024",

            :cpu=>"1",

            :port=>"8890"

    }

]

Vagrant.configure(2) do |config|

config.vm.box = "centos/7"

boxes.each do |opts|

config.vm.define opts[:name] do |config|

config.vm.hostname = opts[:name]

config.vm.network "forwarded_port", guest: 80, host: opts[:port]

config.vm.provider "vmware_fusion" do |v|

v.vmx["memsize"] = opts[:mem]

v.vmx["numvcpus"] = opts[:cpu]

end

config.vm.provider "virtualbox" do |v|

v.customize ["modifyvm", :id, "--memory", opts[:mem]]

v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]

end

config.vm.network :private_network, ip: opts[:eth1]

end

end

config.vm.synced_folder "./labs", "/home/vagrant/labs"

config.vm.provision "shell", privileged: true, path: "./setup.sh"

end

 

2.编写 setup.sh

 

###setup.sh

 

#/bin/sh

# install some tools

sudo yum install -y wget

sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak

sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

sudo yum makecache

sudo yum -y update

sudo yum install -y git vim gcc glibc-static telnet bridge-utils

# install docker

curl -fsSL get.docker.com -o get-docker.sh

sh get-docker.sh

# start docker service

sudo groupadd docker

sudo usermod -aG docker vagrant

sudo systemctl start docker

rm -rf get-docker.sh

sudo tee /etc/docker/daemon.json <<-''EOF''

{

"registry-mirrors": ["https://v2ltjwbg.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

docker version

 

3.创建labs 文件夹 并启动容器

  mkdir  lables

  vagrant up

4. 进去 host 节点

  vagrant ssh docker-host

  声明 manager 节点

  docker swarm init --advertise-addr=192.168.205.10

  只需要 在其他节点运行这段代码 即可 进入这个节点

5. 进入node1节点 并 加入 swarm 集群

  进入docker-node1 节点

    vagrant ssh docker-node1

  运行刚刚生成的代码即可加入 swarm 集群

    docker swarm join --token SWMTKN-1-29cjw98xafo5454juq28ldear34aafbp1n616wilrnjl0q92jz-dt02qoe4nhe98mf6jon9rukca 192.168.205.10:2377

  在 host 节点查看集群节点情况

    docker-host 下

    docker node ls

  docker-node2 节点同理

 

6. 在 docker-machine 上进行 swarm 安装

  docker-machine create swarm-manager

  docker-machine create swarm-node1

  docker-machine create swarm-node2

  同理 加入

7. 在 labs.play-with-docker.com

  常见三个虚拟主机即可运行上面的命令即可

35. docker swarm dockerStack 部署 投票应用

35. docker swarm dockerStack 部署 投票应用

1. 编写 docker-compose.yml

# docker-compose.yml

version: "3"

services:

 

  redis:

    image: redis:alpine

    ports:

      - "6379"

    networks:

      - frontend

    deploy:

      replicas: 2

      update_config:

        parallelism: 2

        delay: 10s

      restart_policy:

        condition: on-failure

 

  db:

    image: postgres:9.4

    volumes:

      - db-data:/var/lib/postgresql/data

    networks:

      - backend

    deploy:

      placement:

        constraints: [node.role == manager]

 

  vote:

    image: dockersamples/examplevotingapp_vote:before

    ports:

      - 5000:80

    networks:

      - frontend

    depends_on:

      - redis

    deploy:

      replicas: 2

      update_config:

        parallelism: 2

      restart_policy:

        condition: on-failure

 

  result:

    image: dockersamples/examplevotingapp_result:before

    ports:

      - 5001:80

    networks:

      - backend

    depends_on:

      - db

    deploy:

      replicas: 1

      update_config:

        parallelism: 2

        delay: 10s

      restart_policy:

        condition: on-failure

 

  worker:

    image: dockersamples/examplevotingapp_worker

    networks:

      - frontend

      - backend

    deploy:

      mode: replicated

      replicas: 1

      labels: [APP=VOTING]

      restart_policy:

        condition: on-failure

        delay: 10s

        max_attempts: 3

        window: 120s

      placement:

        constraints: [node.role == manager]

 

  visualizer:

    image: dockersamples/visualizer:stable

    ports:

      - "8080:8080"

    stop_grace_period: 1m30s

    volumes:

      - "/var/run/docker.sock:/var/run/docker.sock"

    deploy:

      placement:

        constraints: [node.role == manager]

 

networks:

  frontend:

  backend:

 

volumes:

  db-data:

 

2. 启动 service  并  查看 service 的状态

  docker stack deploy vote -c=docker-compose.yml

  docker stack ls

  docker stack services vote

  docker stack ps vote

3. 对 vote_vote service 进行拓展

  docker service stack scale vote_vote=3

 

4. 访问

  访问 192.168.205.10:5000  进行投票

  访问 192.168.205.10:5001  查看投票情况

    访问 192.168.205.10:8080  查看容器 部署情况

 

37. docker swarm docker service 的更新

37. docker swarm docker service 的更新

在 service 运行的情况下 进行更新

  1. 创建 名为 demo 的 overlay 网络

    docker network create -d overlay demo

  2. 创建 python-flask-demo:1.0 服务

    映射 本地的 8080 端口 到 容器的 5000 端口

    docker service create --name web --publish 8080:5000 --network demo xiaopeng163/python-flask-demo:1.0

  3. 查看运行的服务器

    docker service ps web

  4. 横向拓展 web 应用

    docker service scale web=2

  5. shell 循环请求 web

    sh -c "while true;do curl 127.0.0.1:8080 && sleep 1; done"

  6. 更新 service  image

    docker service update --image xiaopeng163/python-flask-demo:2.0 web

  7. 查看容器详情

    docker service ps web

  8. 更新 service 端口映射  将 外部访问端口 8080 变换 8888

    docker service update --publish-rm 8080:5000 --publish-add 8888:5000 web

  9. docker-compose 文件更新

    docker stack deploy wordpress -c=docker-compose.yml

Docker Compose 和 Docker Swarm 和 Docker Service

Docker Compose 和 Docker Swarm 和 Docker Service

Docker Compose

介绍

通过yml文件配置,高效管理多个docker,启停

中文文档

https://www.jb51.cc/manual/view/36129.html

安装

# 慢
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内镜像
$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

授权文件

$ sudo chmod +x /usr/local/bin/docker-compose

测试

$ docker-compose --version
docker-compose version 1.27.4, build 1110ad01

卸载

sudo rm /usr/local/bin/docker-compose

测试使用(官方给的)

1创建文件夹

$ mkdir composetest
$ cd composetest

2写测试程序Python。app.py

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

3创建py文件依赖文件requirements.txt

flask
redis

4创建Dockerfile文件

FROM python:3.7-alpine
workdir /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
copY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
copY . .
CMD ["flask", "run"]

5创建docker-compose.yml

# version: "3.9" 需要版本对应
version: "3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

6使用Compose构建并运行应用程序

docker-compose up
# 后台运行
# docker-compose up -d

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87feppxX-1608950922543)(C:\Users\admin\AppData\Local\Temp\1608866566146.png)]

  1. docker images 自动下载依赖镜像
  2. 默认服务名: 文件名 _ 服务名 _ num(集群副本数量)
  3. 创建docker compose自己默认网络,并将所有启动的容器添加到网络中
  4. 在同一网络下可以直接使用域名访问

停止

# 前端运行使用 ctrl + c 停止
# 后台运行使用
docker-compose stop

yml文件规则

version: "3" # docker-compose核心版本
services: # 服务
	fw: # 服务名称
		image: redis # 服务配置
		ports: # 服务配置2
      		- "5000:5000"
      	depends_on: # 依赖(启动顺序)
      		- fw2
      		- redis
      	..... # 容器启动的所有配置
	fw2: 
		image: # 服务配置

官方文档 https://docs.docker.com/compose/compose-file/compose-file-v2/

测试开源程序(官方给的)

创建工作文件夹 my_wordpress/

创建docker-compose.yml

version: '3.3'

services:
   db:
     image: MysqL:5.7
     volumes:
       - db_data:/var/lib/MysqL
     restart: always
     environment:
       MysqL_ROOT_PASSWORD: somewordpress
       MysqL_DATABASE: wordpress
       MysqL_USER: wordpress
       MysqL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       wordpress_DB_HOST: db:3306
       wordpress_DB_USER: wordpress
       wordpress_DB_PASSWORD: wordpress
       wordpress_DB_NAME: wordpress
volumes:
    db_data: {}

后台运行

docker-compose up -d

Docker Swarm

  • 集群
  • 必须有两个或两个以上主节点才能运行

Swarm mode cluster

[root@centos3 ~]# docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          管理根CA
  init        初始化集群
  join        加入集群
  join-token  创建加入令牌
  leave       离开集群
  unlock      解锁群
  unlock-key  管理解锁密钥
  update      更新集群

Run 'docker swarm COMMAND --help' for more information on a command.

1初始化一个集群

docker swarm init [OPTIONS]
名字,简写默认描述
–advertise-addr通告地址(格式:<ip | interface>:端口)
–autolock启用管理器自动锁定(需要解锁密钥才能启动停止的管理器)
–availabilityactive节点的可用性(“活动”|“暂停”|“漏”)
–cert-expiry2160h0m0s节点证书的有效期(ns | us | ms | s | m | h)
–data-path-addr用于数据路径流量的地址或接口(格式:<ip | interface>)
–dispatcher-heartbeat5S调度员心跳周期(ns | us | ms | s | m | h)
–external-ca一个或多个证书签名端点的规格
–force-new-cluster强制从当前状态创建一个新的群集
–listen-addr0.0.0.0:2377监听地址(格式:<ip | interface>:端口)
–max-snapshots0要保留的附加木筏快照的数量
–snapshot-interval10000Raft快照之间的日志条目数
–task-history-limit5任务历史保留限制
# 初始化集群
docker swarm init --advertise-addr 192.168.0.191

2加入一个节点

docker swarm join [OPTIONS] HOST:PORT
名字,简写默认描述
–advertise-addr通告地址(格式:<ip | interface>:端口)
–availabilityactive节点的可用性(“活动”|“暂停”|“漏”)
–data-path-addr用于数据路径流量的地址或接口(格式:<ip | interface>)
–listen-addr0.0.0.0:2377监听地址(格式:<ip | interface>:端口)
–token进入群的令牌
# 例如加入一个节点
# 令牌SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2
docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.0.191:2377

3获取令牌

docker swarm join-token [OPTIONS] (worker|manager)
# 工作令牌
docker swarm join-token worker
# 管理令牌
docker swarm join-token manager

查看节点

# 查看节点
docker node

Docker Service

docker service COMMAND
命令描述
docker service create创建一项新服务
docker service inspect显示一项或多项服务的详细信息
docker service logs获取服务或任务的日志
docker service ls列出服务
docker service ps列出一项或多项服务的任务
docker service rm删除一项或多项服务
docker service scale扩展一个或多个复制服务
docker service update更新服务

1创建服务

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
名字,简写默认描述
–config指定配置以暴露给服务
–constraint展示位置限制
–container-label容器标签
–credential-spec托管服务帐户的凭证规范(仅限Windows)
–detach,-d真正立即退出,而不是等待服务收敛
–dns设置自定义DNS服务器
–dns-option设置DNS选项
–dns-search设置自定义DNS搜索域
–endpoint-mode要人端点模式(vip或dnsrr)
–entrypoint覆盖图像的默认入口点
–env,-e设置环境变量
–env-file读入环境变量文件
–group为容器设置一个或多个补充用户组
–health-cmd运行以检查运行状况的命令
–health-interval运行检查之间的时间(ms | s | m | h)
–health-retries0需要报告不健康的连续失败
–health-start-period在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段
–health-timeout允许一次检查运行的最长时间(ms | s | m | h)
–host设置一个或多个自定义主机到IP映射(主机:IP)
–hostname容器主机名
–label, -l服务标签
–limit-cpu限制cpu
–limit-memory0限制记忆
–log-driver记录驱动程序的服务
–log-OPT记录驱动程序选项
–mode复制服务模式(复制或全局)
–mount将文件系统挂载附加到服务
–name服务名称
–network网络附件
–no-healthcheck禁用任何容器指定的HEALTHCHECK
–no-resolve-image不要查询注册表来解析图像摘要和支持的平台
–placement-PREF添加展示位置首选项
–publish,-p将端口发布为节点端口
–quiet,-q抑制进度输出
–read-only将容器的根文件系统挂载为只读
–replicas任务数量
–reserve-cpu预留cpu
–reserve-memory0保留内存
–restart-condition满足条件时重新启动(“none”|“on-failure”|“any”)(默认为“any”)
–restart-delay重启尝试之间的延迟(ns | us | ms | s | m | h)(默认5秒)
–restart-max-attempts放弃前的最大重启次数
–restart-window用于评估重新启动策略的窗口(ns | us | ms | s | m | h)
–rollback-delay0任务回滚之间的延迟(ns | us | ms | s | m | h)(默认值为0)
–rollback-failure-action回滚失败的操作(“暂停”|“继续”)(默认“暂停”)
–rollback-max-failure-ratio0在回滚期间容忍的失败率(默认0)
–rollback-monitor0(ns | us | ms | s | m | h)(默认5秒)每个任务回滚之后的持续时间
–rollback-order回滚顺序(“start-first”|“stop-first”)(默认“stop-first”)
–rollback-parallelism1同时回滚的任务的最大数量(0一次全部回滚)
–secret指定泄露给服务的秘密
–stop-grace-period强制杀死一个容器之前等待的时间(ns | us | ms | s | m | h)(默认10秒)
–stop-signal停止容器的信号
–tty, -t分配一个伪TTY
–update-delay0更新之间的延迟(ns | us | ms | s | m | h)(默认为0)
–update-failure-action更新失败的操作(“暂停”|“继续”|“回滚”)(默认“暂停”)
–update-max-failure-ratio0更新期间容许的失败率(默认0)
–update-monitor0(ns | us | ms | s | m | h)(默认5秒)每个任务更新后的持续时间
–update-order更新顺序(“start-first”|“stop-first”)(默认为“stop-first”)
–update-parallelism1同时更新的最大任务数(0个一次全部更新)
–user,-u用户名或UID(格式:<名称| uid>:<组| gid>)
–with-registry-auth向注册代理发送注册表认证详细信息
–workdir,-w容器内的工作目录
# 例如,启动一个Nginx服务,暴露8080端口
docker service create -p 8080:80 --name Nginx01 Nginx
# docker run 容器启动,单机版本
# docker service 服务启动,支持扩缩容器
# 查看服务
docker service ps Nginx01
# 查看副本
docker service ls
# 查看详情
docker service inspect Nginx01

2更新服务

docker service update [OPTIONS] SERVICE
名字,简写默认描述
–args服务命令参数
–config-add添加或更新服务上的配置文件
–config-RM删除配置文件
–constraint-add添加或更新展示位置约束
–constraint-RM删除约束
–container-label-add添加或更新容器标签
–container-label-rm用钥匙取出容器标签
–credential-spec托管服务帐户的凭证规范(仅限Windows)
–detach,-d立即退出,而不是等待服务收敛
–dns-add添加或更新自定义DNS服务器
–dns-option-add添加或更新DNS选项
–dns-option-rm删除一个DNS选项
–dns-rm删除自定义的DNS服务器
–dns-search-add添加或更新自定义DNS搜索域
–dns-search-rm删除一个DNS搜索域
–endpoint-mode端点模式(vip或dnsrr)
–entrypoint覆盖图像的默认入口点
–env-add添加或更新环境变量
–env-RM删除一个环境变量
–force即使没有更改需要,也强制更新
–group-add向容器添加一个附加的补充用户组
–group-RM从容器中删除先前添加的补充用户组
–health-cmd运行以检查运行状况的命令
–health-interval运行检查之间的时间(ms | s | m | h)
–health-retries0需要报告不健康的连续失败
–health-retries在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段
–health-timeout允许一次检查运行的最长时间(ms | s | m | h)
–host加添加或更新自定义主机到IP映射(主机:IP)
–host-RM删除自定义的主机到IP映射(主机:IP)
–hostname容器主机名
–image服务图片标签
–label-add添加或更新服务标签
–label-RM用钥匙去除标签
–limit-cpu限制cpu
–limit-memory0限制记忆
–log-driver记录驱动程序的服务
–log-OPT记录驱动程序选项
–mount-add添加或更新服务上的装载
–mount-RM通过目标路径移除一个安装
–network加添加一个网络
–network-RM删除网络
–no-healthcheck禁用任何容器指定的HEALTHCHECK
–no-resolve-image不要查询注册表来解析图像摘要和支持的平台
–placement-PREF-ADD添加展示位置首选项
–placement-PREF-RM删除展示位置偏好设置
–publish相加添加或更新已发布的端口
–publish-RM通过目标端口删除发布的端口
–quiet,-q抑制进度输出
–read-only将容器的根文件系统挂载为只读
–replicas任务数量
–reserve-cpu预留cpu
–reserve-memory0保留内存
–restart-condition条件满足时重新启动(“none”|“on-failure”|“any”)
–restart-delay重启尝试之间的延迟(ns | us | ms | s | m | h)
–restart-max-attempts放弃前的最大重启次数
–restart-window用于评估重新启动策略的窗口(ns | us | ms | s | m | h)
–rollback回退到先前的规范
–rollback-delay0任务回滚之间的延迟(ns | us | ms | s | m | h)
–rollback-failure-action回滚失败的操作(“暂停”|“继续”)
–rollback-max-failure-ratio0在回滚期间容忍的失败率
–rollback-monitor0每个任务回滚后监视失败的持续时间(ns | us | ms | s | m | h)
–rollback-order回滚顺序(“start-first”|“stop-first”)
–rollback-parallelism0同时回滚的任务的最大数量(0一次全部回滚)
–secret-add添加或更新服务的秘密
–secret-RM去掉一个秘密
–stop-grace-period强制杀死一个容器之前的等待时间(ns | us | ms | s | m | h)
–stop-signal停止容器的信号
–tty, -t分配一个伪TTY
–update-delay0更新之间的延迟(ns | us | ms | s | m | h)
–update-failure-action更新失败的操作(“暂停”|“继续”|“回滚”)
–update-max-failure-ratio0更新期间容错的失败率
–update-monitor0(ns | us | ms | s | m | h)每个任务更新后的持续时间
–update-order更新顺序(“start-first”|“stop-first”)
–update-parallelism0同时更新的最大任务数(0个一次全部更新)
–user,-u用户名或UID(格式:<名称| uid>:<组| gid>)
–with-registry-auth向注册代理发送注册表认证详细信息
–workdir,-w容器内的工作目录
# 为 Nginx01 创建 10 个副本
docker service update --replicas 10 Nginx01 
# 或 使用 scale 命令
docker service scale Nginx01=10

移除服务

docker service rm Nginx01

关于Docker Swarmdocker swarm集群的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于29. docker swarm 创建 三个节点 swarm 的集群、35. docker swarm dockerStack 部署 投票应用、37. docker swarm docker service 的更新、Docker Compose 和 Docker Swarm 和 Docker Service的相关信息,请在本站寻找。

本文标签: