欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

LINUX中Docker?Swarm的介紹和詳細(xì)使用教程

 更新時(shí)間:2025年09月12日 17:13:05   作者:煙雨書(shū)信  
Docker?Swarm是Docker的集群管理工具,將多個(gè)節(jié)點(diǎn)統(tǒng)一管理,支持服務(wù)部署、擴(kuò)縮容與滾動(dòng)更新,適用于高可用分布式應(yīng)用,本文給大家介紹LINUX中Docker?Swarm的介紹和詳細(xì)使用教程,感興趣的朋友一起看看吧

一:Docker

(1)什么是Docker Swarm

DockerSwarm 是什么?

Docker Swarm 是 Docker 的集群管理工具。

其主要作用是把若干臺(tái) Docker 主機(jī)抽象為一個(gè)整體,并且通過(guò)一個(gè)入口統(tǒng)一管理這些 Docker 主機(jī)上的各種 Docker 資源。

Docker Swarm 將一個(gè)或多個(gè) Docker 節(jié)點(diǎn)組織起來(lái),使得用戶能夠以集群方式管理它們。

(2)組成部分

swarm 集群由管理節(jié)點(diǎn)(Manager)和工作節(jié)點(diǎn)(Worker)構(gòu)成。

管理節(jié)點(diǎn):主要負(fù)責(zé)整個(gè)集群的管理工作包括集群配置、服務(wù)管理等所有跟集群有關(guān)的工作,諸如監(jiān)控集群狀態(tài)、分發(fā)任務(wù)至工作節(jié)點(diǎn)等操作。

工作節(jié)點(diǎn):主要負(fù)責(zé)執(zhí)行運(yùn)行服務(wù)的任務(wù)。

  • 在 Docker Swarm 集群中,節(jié)點(diǎn)的角色分為 Manager 和 Worker。
  • Manager 節(jié)點(diǎn)不僅負(fù)責(zé)管理集群(如調(diào)度任務(wù)、維護(hù)集群狀態(tài)等),也可以運(yùn)行服務(wù)的任務(wù)(即容器)。
  • 默認(rèn)情況下,當(dāng)你創(chuàng)建一個(gè)服務(wù)時(shí),Swarm 會(huì)根據(jù)其調(diào)度策略將服務(wù)的任務(wù)分配到可用的節(jié)點(diǎn)上,包括 Manager 節(jié)點(diǎn)。

docker swarm 是 Docker 引擎內(nèi)置的一個(gè)功能模塊,不需要單獨(dú)安裝,它是隨著 Docker Engine 一起發(fā)布的。

只要 Docker 已經(jīng)正確安裝并運(yùn)行,就可以使用 docker swarm 命令來(lái)初始化和管理 Swarm 集群。

(3)相關(guān)命令說(shuō)明

[root@localhost data]# docker swarm COMMAND
Usage:  docker swarm COMMAND
Manage Swarm
Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm
Run 'docker swarm COMMAND --help' for more information on a command.
命令說(shuō)明
docker swarm init初始化一個(gè) Swarm 集群,將當(dāng)前節(jié)點(diǎn)設(shè)為 Manager 節(jié)點(diǎn)。
docker swarm join --token <TOKEN> <MANAGER_IP>:2377將當(dāng)前節(jié)點(diǎn)加入到已有的 Swarm 集群中(作為 Worker 或 Manager)。
docker swarm ca顯示或輪換集群的根 CA 證書(shū)(用于安全通信)。
docker swarm join-token worker顯示用于添加 Worker 節(jié)點(diǎn)的 token 和命令。
docker swarm join-token manager顯示用于添加 Manager 節(jié)點(diǎn)的 token 和命令。
docker swarm leave當(dāng)前節(jié)點(diǎn)離開(kāi) Swarm 集群。
docker swarm unlock如果集群被加密鎖定了,使用該命令解鎖。
docker swarm unlock-key查看或刪除集群的解鎖密鑰。
docker swarm update [OPTIONS]更新 Swarm 集群配置(如調(diào)度策略、默認(rèn)安全設(shè)置等)。
[root@localhost data]# docker swarm init --help
Usage:  docker swarm init [OPTIONS]
Initialize a swarm
Options:
      --advertise-addr string                  Advertised address (format: "<ip|interface>[:port]")
      --autolock                               Enable manager autolocking (requiring an unlock key to start a
                                               stopped manager)
      --availability string                    Availability of the node ("active", "pause", "drain") (default "active")
      --cert-expiry duration                   Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
      --data-path-addr string                  Address or interface to use for data path traffic (format:
                                               "<ip|interface>")
      --data-path-port uint32                  Port number to use for data path traffic (1024 - 49151). If no value
                                               is set or is set to 0, the default port (4789) is used.
      --default-addr-pool ipNetSlice           default address pool in CIDR format (default [])
      --default-addr-pool-mask-length uint32   default address pool subnet mask length (default 24)
      --dispatcher-heartbeat duration          Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
      --external-ca external-ca                Specifications of one or more certificate signing endpoints
      --force-new-cluster                      Force create a new cluster from current state
      --listen-addr node-addr                  Listen address (format: "<ip|interface>[:port]") (default 0.0.0.0:2377)
      --max-snapshots uint                     Number of additional Raft snapshots to retain
      --snapshot-interval uint                 Number of log entries between Raft snapshots (default 10000)
      --task-history-limit int                 Task history retention limit (default 5)

二、Docker Swarm的使用

2.1、集群節(jié)點(diǎn)規(guī)劃

為了利用 swarm 模式的容錯(cuò)功能,可以根據(jù)組織的高可用性要求實(shí)現(xiàn)奇數(shù)個(gè)節(jié)點(diǎn)

當(dāng)有多個(gè)管理中心時(shí),可以從一個(gè)管理中心節(jié)點(diǎn)的故障中恢復(fù),而無(wú)需停機(jī)。

  • 三個(gè)管理器群可以容忍最多損失一個(gè)管理器。
  • 五個(gè)管理器群最多可以同時(shí)丟失兩個(gè)管理器節(jié)點(diǎn)。
  • 七個(gè)管理器群最多可以同時(shí)丟失三個(gè)管理器節(jié)點(diǎn)。
  • 九個(gè)管理器群最多可以同時(shí)丟失四個(gè)管理器節(jié)點(diǎn)。
  • Docker 建議一個(gè)群最多有七個(gè)管理器節(jié)點(diǎn)。

添加更多管理器并不意味著可伸縮性或性能的提高。一般來(lái)說(shuō),情況恰恰相反。

主機(jī)名IP地址docker版本號(hào)角色備注
manager01192.168.66.14626.1.4管理節(jié)點(diǎn)主管
manager02192.168.66.15226.1.4管理節(jié)點(diǎn)從管
manager03192.168.66.15326.1.4管理節(jié)點(diǎn)從管
worker01192.168.66.15426.1.4工作節(jié)點(diǎn)工作
worker02192.168.66.15526.1.4工作節(jié)點(diǎn)工作

2.2、環(huán)境準(zhǔn)備

  • 1、修改主機(jī)名
  • 2、配置IP地址
  • 3、關(guān)閉防火墻和SELINUX安全模式
  • 4、配置系統(tǒng)YUM源和Docker鏡像源
  • 5、更新系統(tǒng)(yum update -y)
  • 6、安裝好docker環(huán)境

2.3、創(chuàng)建集群

docker swarm init --advertise-addr

--advertise-addr行為推薦程度
不指定Docker 自動(dòng)選擇一個(gè) IP不推薦(尤其在生產(chǎn)環(huán)境)
指定明確控制節(jié)點(diǎn)間通信的 IP推薦
m1配置信息(manager)

初始化一個(gè)新的 Swarm 集群,并將當(dāng)前節(jié)點(diǎn)設(shè)置為 Manager 節(jié)點(diǎn)。

docker swarm init --advertise-addr 192.168.66.146
Swarm initialized: current node (og3lc3bbg990qc0mkr7mbaoz2) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token 
	SWMTKN-1-1wgm41bp9zb04tbzvv6p7q21ke5bbkp2a4p71o6o666si24ssf-ch84gl3dpmxavtx479zkglt59 192.168.66.146:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Swarm 集群創(chuàng)建成功,獲取用于添加新 Manager 的命令

docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token 
	SWMTKN-1-1wgm41bp9zb04tbzvv6p7q21ke5bbkp2a4p71o6o666si24ssf-
bug5lagqesuzehgbnuha66ktk 192.168.66.146:2377

在另一臺(tái)主機(jī)上執(zhí)行上面這條命令,可以成功加入集群,并作為新的 Manager

操作命令是否添加新節(jié)點(diǎn)用途
初始化集群docker swarm init創(chuàng)建一個(gè)新的 Swarm 集群
獲取 Manager 加入命令docker swarm join-token manager生成供其他主機(jī)使用的命令
執(zhí)行 join 命令(在其他主機(jī))docker swarm join --token xxx IP:2377把該主機(jī)加入集群并設(shè)為 Manager
m2配置信息(manager)
# 添加至集群中成為管理節(jié)點(diǎn)
[root@docker-m2 ~]# docker swarm join --token SWMTKN-1-
2m0zoq7mc98hsecvt3jrshltywt42w8jtlx7zifa84n8gm6hog-das8vljcfnlzv7gwjbrcg84er 
192.168.66.146:2377
This node joined a swarm as a manager.
m3配置信息(manager)
# 添加至集群中成為管理節(jié)點(diǎn)
[root@docker-m3 ~]# docker swarm join --token SWMTKN-1-
2m0zoq7mc98hsecvt3jrshltywt42w8jtlx7zifa84n8gm6hog-das8vljcfnlzv7gwjbrcg84er 
192.168.66.146:2377
This node joined a swarm as a manager.
n1配置信息(worker)
# 添加至集群中成為工作節(jié)點(diǎn)
[root@docker-n1 ~]# docker swarm join --token SWMTKN-1-
2m0zoq7mc98hsecvt3jrshltywt42w8jtlx7zifa84n8gm6hog-73vr18usjr5mz23td976369xb 
192.168.66.146:2377
This node joined a swarm as a worker.
n2配置信息(worker)
# 添加至集群中成為工作節(jié)點(diǎn)
[root@docker-n2 ~]# docker swarm join --token SWMTKN-1-
2m0zoq7mc98hsecvt3jrshltywt42w8jtlx7zifa84n8gm6hog-73vr18usjr5mz23td976369xb 
192.168.66.146:2377
This node joined a swarm as a worker.

2.4、檢查配置情況

查看集群節(jié)點(diǎn)狀態(tài)信息

發(fā)現(xiàn)docker-m1是主管理節(jié)點(diǎn),docker-m2、docker-03是備用管理節(jié)點(diǎn);

兩個(gè)工作節(jié)點(diǎn)docker-n1、docker-n2也正常添加至集群中來(lái)。

[root@docker-m1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
409i7chz9723h64qph463her5 *   m1         Ready     Active         Leader           26.1.4
vq7gdmivvizdnm17rya29e395     m2         Ready     Active         Reachable        26.1.4
hqgphq68rvrp3sh3dmy7j3ytv     m3         Ready     Active         Reachable        26.1.4
pq4w82fq0wn7rbi24ybzinayq     s1         Ready     Active                          26.1.4
kwlfsipeln7u0sstejmr8s8wm     s2         Ready     Active                          26.1.4

查看整個(gè)Docker系統(tǒng)的信息

發(fā)現(xiàn)docker swarm集群已經(jīng)創(chuàng)建完成。 共有五臺(tái)節(jié)點(diǎn),其中三臺(tái)為管理節(jié)點(diǎn)。

[root@docker-m1 ~]# docker info
Client: Docker Engine - Community
 Version:    26.1.4
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.14.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.27.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose
Server:
 Containers: 2
  Running: 0
  Paused: 0
  Stopped: 2
 Images: 6
 Server Version: 26.1.4
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: active
  NodeID: 409i7chz9723h64qph463her5
  Is Manager: true
  ClusterID: tpezv4gb4895pm0xyivmez2ng
  Managers: 3
  Nodes: 5
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
  Raft:
   Snapshot Interval: 10000
   Number of Old Snapshots to Retain: 0
   Heartbeat Tick: 1
   Election Tick: 10
  Dispatcher:
   Heartbeat Period: 5 seconds
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
  Autolock Managers: false
  Root Rotation In Progress: false
  Node Address: 192.168.66.146
  Manager Addresses:
   192.168.66.146:2377
   192.168.66.152:2377
   192.168.66.153:2377
 Runtimes: runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-1160.71.1.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 972.3MiB
 Name: m1
 ID: bb7b1d09-3c39-4cec-8e91-b3d249c92aa8
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://docker.m.daocloud.io/
 Live Restore Enabled: false

查詢集群網(wǎng)絡(luò)信息 查看到集群中各個(gè)節(jié)點(diǎn)的IP地址

[root@docker-m1 ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
7544bf512308   bridge            bridge    local
575614844e29   docker_gwbridge   bridge    local
c50925c91744   host              host      local
utmwp4dtmdwe   ingress           overlay   swarm
b9f09410831a   net1              bridge    local
a6bdb177b438   net2              bridge    local
3eac8d80c11d   none              null      local
[root@docker-m1 ~]# docker network inspect ingress
[
    {
        "Name": "ingress",
        "Id": "utmwp4dtmdwe4t0rtb44l1pdt",
        "Created": "2025-06-06T11:25:55.280963109+08:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": true,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "ingress-sbox": {
                "Name": "ingress-endpoint",
                "EndpointID": "6ffbebbd8103e689e070e9d7b131d4217b8cc72424d77c60662dadec80be887c",
                "MacAddress": "02:42:0a:00:00:02",
                "IPv4Address": "10.0.0.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4096"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "07527edc7cf2",
                "IP": "192.168.66.146"
            },
            {
                "Name": "51e9b4f53752",
                "IP": "192.168.66.152"
            },
            {
                "Name": "19682ed354a6",
                "IP": "192.168.66.153"
            },
            {
                "Name": "3161d8159fff",
                "IP": "192.168.66.154"
            },
            {
                "Name": "8b58eb7829cd",
                "IP": "192.168.66.155"
            }
        ]
    }
]

2.5、角色變化

(1)將Manager降級(jí)為Worker

以docker-m3為例,將docker-m3管理節(jié)點(diǎn)由manager角色變成worker角色

# 查看幫助命令
[root@docker-m1 ~]# docker node update -h
Flag shorthand -h has been deprecated, please use --help
Usage:  docker node update [OPTIONS] NODE
Update a node
Options:
      --availability string   Availability of the node ("active"|"pause"|"drain")
      --label-add list        Add or update a node label (key=value)
      --label-rm list         Remove a node label if exists
      --role string           Role of the node ("worker"|"manager")
# 執(zhí)行如下命令,將docker-m3管理節(jié)點(diǎn)由manager角色變成worker角色。
[root@docker-m1 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
34cug51p9dw83u2np594z6ej4 *   docker-m1   Ready     Active         Leader           26.1.4
hwmwdk78u3rx0wwxged87xnun     docker-m2   Ready     Active         Reachable        26.1.4
4q34guc6hp2a5ok0g1zkjojyh     docker-m3   Ready     Active         Reachable        26.1.4
4om9sg56sg09t9whelbrkh8qn     docker-n1   Ready     Active                          26.1.4
xooolkg0g9epddfqqiicywshe     docker-n2   Ready     Active                          26.1.4
[root@docker-m1 ~]# docker node update --role worker docker-m3
docker-m3
[root@docker-m1 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
34cug51p9dw83u2np594z6ej4 *   docker-m1   Ready     Active         Leader           26.1.4
hwmwdk78u3rx0wwxged87xnun     docker-m2   Ready     Active         Reachable        26.1.4
4q34guc6hp2a5ok0g1zkjojyh     docker-m3   Ready     Active                          26.1.4
4om9sg56sg09t9whelbrkh8qn     docker-n1   Ready     Active                          26.1.4
xooolkg0g9epddfqqiicywshe     docker-n2   Ready     Active                          26.1.4

# 更改之后,查看docker-m3節(jié)點(diǎn)詳細(xì)信息情況
# 發(fā)現(xiàn)已經(jīng)由管理節(jié)點(diǎn)變成工作節(jié)點(diǎn)
[root@docker-m1 ~]# docker node inspect m3
[
    {
        "ID": "4q34guc6hp2a5ok0g1zkjojyh",
        "Version": {
            "Index": 39
        },
        "CreatedAt": "2022-05-03T10:59:07.69499678Z",
        "UpdatedAt": "2022-05-03T11:27:02.178601504Z",
        "Spec": {
            "Labels": {},
            "Role": "worker",
            "Availability": "active"
        },
        "Description": {
            "Hostname": "docker-m3",
            "Platform": {
                "Architecture": "x86_64",
                "OS": "linux"
            },
            "Resources": {
                "NanoCPUs": 1000000000,
                "MemoryBytes": 2076499968
            },
            "Engine": {
                "EngineVersion": "26.1.4",
                "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": "local"
                    },
                    {
                        "Type": "Log",
                        "Name": "logentries"
                    },
                    {
                        "Type": "Log",
                        "Name": "splunk"
                    },
                    {
                        "Type": "Log",
                        "Name": "syslog"
                    },
                    {
                        "Type": "Network",
                        "Name": "bridge"
                    },
                    {
                        "Type": "Network",
                        "Name": "host"
                    },
                    {
                        "Type": "Network",
                        "Name": "ipvlan"
                    },
                    {
                        "Type": "Network",
                        "Name": "macvlan"
                    },
                    {
                        "Type": "Network",
                        "Name": "null"
                    },
                    {
                        "Type": "Network",
                        "Name": "overlay"
                    },
                    {
                        "Type": "Volume",
                        "Name": "local"
                    }
                ]
            },
            "TLSInfo": {
                "TrustRoot": "-----BEGIN CERTIFICATE-----\nMIIBaTCCARCgAwIBAgIUYUzIe4mqhjKYxuilbhVByLwzzeMwCgYIKoZIzj0EAwIw\nEzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjIwNTAzMTA0NzAwWhcNNDIwNDI4MTA0\nNzAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABK8XzVHRM50TgsAxrgXg18ti69dkedf9LsaHm2I2ub9kKzkLsnTV+bIHGOHK\n0/Twi/B9OCFSsozUGDP7qR3/rRmjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBQ3iXSq5FKnODK2Qqic39A0bg9qjjAKBggqhkjO\nPQQDAgNHADBEAiASv1HdziErIzBJtsVMxfp8zAv0EJ5/eVeIldYdUIVNTQIgXUc3\nakty/iBy5/MhFt9JRRMV1xH1x+Dcf35tNWGH52w=\n-----END CERTIFICATE-----\n",
                "CertIssuerSubject": "MBMxETAPBgNVBAMTCHN3YXJtLWNh",
                "CertIssuerPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErxfNUdEznROCwDGuBeDXy2Lr12R51/0uxoebYja5v2QrOQuydNX5sgcY4crT9PCL8H04IVKyjNQYM/upHf+tGQ=="
            }
        },
        "Status": {
            "State": "ready",
            "Addr": "192.168.66.153"
        }
    }
]

(2)將Worker晉升為Manager

以docker-n2為例,將docker-n2管理節(jié)點(diǎn)由worker角色變成manager角色

[root@docker-m1 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
34cug51p9dw83u2np594z6ej4 *   docker-m1   Ready     Active         Leader           26.1.4
hwmwdk78u3rx0wwxged87xnun     docker-m2   Ready     Active         Reachable        26.1.4
4q34guc6hp2a5ok0g1zkjojyh     docker-m3   Ready     Active                          26.1.4
4om9sg56sg09t9whelbrkh8qn     docker-n1   Ready     Active                          26.1.4
xooolkg0g9epddfqqiicywshe     docker-n2   Ready     Active                          26.1.4
[root@docker-m1 ~]# docker node update --role manager docker-n2
docker-n2
[root@docker-m1 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
34cug51p9dw83u2np594z6ej4 *   docker-m1   Ready     Active         Leader           26.1.4
hwmwdk78u3rx0wwxged87xnun     docker-m2   Ready     Active         Reachable        26.1.4
4q34guc6hp2a5ok0g1zkjojyh     docker-m3   Ready     Active                          26.1.4
4om9sg56sg09t9whelbrkh8qn     docker-n1   Ready     Active                          26.1.4
xooolkg0g9epddfqqiicywshe     docker-n2   Ready     Active         Reachable        26.1.4

(3)移除再添加管理節(jié)點(diǎn)

將集群中某臺(tái)管理節(jié)點(diǎn)移除集群,重新獲取管理節(jié)點(diǎn)的令牌,再添加至集群中。

# 查看幫助命令
[root@docker-m1 ~]# docker swarm leave --help
Usage:  docker swarm leave [OPTIONS]
Leave the swarm
Options:
  -f, --force   Force this node to leave the swarm, ignoring warnings

在docker-m3節(jié)點(diǎn)執(zhí)行操作,將docker-m3管理節(jié)點(diǎn)移除集群

[root@docker-m3 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
34cug51p9dw83u2np594z6ej4     docker-m1   Ready     Active         Leader           26.1.4
hwmwdk78u3rx0wwxged87xnun     docker-m2   Ready     Active         Reachable        26.1.4
4q34guc6hp2a5ok0g1zkjojyh *   docker-m3   Ready     Active         Reachable        26.1.4
4om9sg56sg09t9whelbrkh8qn     docker-n1   Ready     Active                          26.1.4
xooolkg0g9epddfqqiicywshe     docker-n2   Ready     Active                          26.1.4
[root@docker-m3 ~]# docker swarm leave -f
Node left the swarm.

在docker-m1管理節(jié)點(diǎn)上查看。發(fā)現(xiàn)docker-m3管理節(jié)點(diǎn)已經(jīng)關(guān)閉

在某個(gè)節(jié)點(diǎn)上執(zhí)行 docker swarm leave -f 時(shí),該節(jié)點(diǎn)會(huì)退出集群,但這個(gè)操作并不會(huì)自動(dòng)從其他節(jié)點(diǎn)的節(jié)點(diǎn)列表中刪除它。

也就是說(shuō):

  • m3 已經(jīng)不再是 Swarm 的一部分。
  • 但它曾經(jīng)是集群的一部分,Swarm 管理節(jié)點(diǎn)(Manager)仍保留它的記錄。
  • 所以在 docker node ls 中它依然顯示,只是狀態(tài)變成 Down(表示無(wú)法通信或已離開(kāi))。

如果確認(rèn) m3 永遠(yuǎn)不會(huì)再加入集群,并且你想清理這個(gè)節(jié)點(diǎn)記錄,你需要在 Manager 節(jié)點(diǎn)上手動(dòng)刪除它:

docker node rm m3

如果執(zhí)行docker node rm s2

會(huì)出現(xiàn)以下錯(cuò)誤

Error response from daemon: rpc error: code = FailedPrecondition desc = node kwlfsipeln7u0sstejmr8s8wm is a cluster manager and is a member of the raft cluster. It must be demoted to worker before removal

Docker Swarm 不允許直接刪除處于 Manager 角色的節(jié)點(diǎn)

先將該 Manager 節(jié)點(diǎn) 降級(jí)為 Worker,然后再刪除

[root@docker-m1 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
34cug51p9dw83u2np594z6ej4 *   docker-m1   Ready     Active         Leader           26.1.4
hwmwdk78u3rx0wwxged87xnun     docker-m2   Ready     Active         Reachable        26.1.4
4q34guc6hp2a5ok0g1zkjojyh     docker-m3   Ready     Active         Reachable        26.1.4
4om9sg56sg09t9whelbrkh8qn     docker-n1   Ready     Active                          26.1.4
xooolkg0g9epddfqqiicywshe     docker-n2   Ready     Active                          26.1.4
[root@docker-m1 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
34cug51p9dw83u2np594z6ej4 *   docker-m1   Ready     Active         Leader           26.1.4
hwmwdk78u3rx0wwxged87xnun     docker-m2   Ready     Active         Reachable        26.1.4
4q34guc6hp2a5ok0g1zkjojyh     docker-m3   Down      Active         Unreachable      26.1.4
4om9sg56sg09t9whelbrkh8qn     docker-n1   Ready     Active                          26.1.4
xooolkg0g9epddfqqiicywshe     docker-n2   Ready     Active                          26.1.4

重新獲取添加管理節(jié)點(diǎn)的令牌命令。

執(zhí)行docker swarm join-token manager命令,獲取命令。

[root@docker-m1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-528o8bfk061miheduvuvnnohhpystvxnwiqfqqf04gou6n1wmz-1z6k8msio37as0vaa467glefx 
192.168.66.146:2377
[root@docker-m1 ~]#

重新將docker-m3管理節(jié)點(diǎn)添加到集群中。

[root@docker-m3 ~]# docker swarm join --token SWMTKN-1-528o8bfk061miheduvuvnnohhpystvxnwiqfqqf04gou6n1wmz-1z6k8msio37as0vaa467glefx 192.168.66.146:2377
This node joined a swarm as a manager.
[root@docker-m3 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
34cug51p9dw83u2np594z6ej4     docker-m1   Ready     Active         Leader           26.1.4
hwmwdk78u3rx0wwxged87xnun     docker-m2   Ready     Active         Reachable        26.1.4
4q34guc6hp2a5ok0g1zkjojyh     docker-m3   Down      Active         Reachable        26.1.4
jvtiwv8eu45ev4qbm0ausivv2 *   docker-m3   Ready     Active         Reachable        26.1.4
4om9sg56sg09t9whelbrkh8qn     docker-n1   Ready     Active                          26.1.4
xooolkg0g9epddfqqiicywshe     docker-n2   Ready     Active                          26.1.4
[root@docker-m3 ~]#

(4)移除再添加工作節(jié)點(diǎn)

將集群中某臺(tái)工作節(jié)點(diǎn)移除集群,重新獲取工作節(jié)點(diǎn)的令牌,再添加至集群中。

在docker-n1節(jié)點(diǎn)執(zhí)行操作,將docker-n1工作節(jié)點(diǎn)移除集群

[root@docker-n1 ~]# docker swarm leave
Node left the swarm.

在docker-m1管理節(jié)點(diǎn)上查看。發(fā)現(xiàn)docker-n1工作節(jié)點(diǎn)已經(jīng)關(guān)閉

[root@docker-m1 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
34cug51p9dw83u2np594z6ej4 *   docker-m1   Ready     Active         Leader           26.1.4
hwmwdk78u3rx0wwxged87xnun     docker-m2   Ready     Active         Reachable        26.1.4
4q34guc6hp2a5ok0g1zkjojyh     docker-m3   Down      Active         Reachable        26.1.4
jvtiwv8eu45ev4qbm0ausivv2     docker-m3   Ready     Active         Reachable        26.1.4
4om9sg56sg09t9whelbrkh8qn     docker-n1   Down      Active                          26.1.4
xooolkg0g9epddfqqiicywshe     docker-n2   Ready     Active                          26.1.4

重新獲取添加工作節(jié)點(diǎn)的令牌命令。

執(zhí)行docker swarm join-token worker命令,獲取命令。

[root@docker-m1 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-
528o8bfk061miheduvuvnnohhpystvxnwiqfqqf04gou6n1wmz-3ixu6we70ghk69wghfrmo0y6a 
192.168.66.146:2377
[root@docker-m1 ~]#

重新將docker-n1工作節(jié)點(diǎn)添加到集群中。

[root@docker-n1 ~]# docker swarm join --token SWMTKN-1-
528o8bfk061miheduvuvnnohhpystvxnwiqfqqf04gou6n1wmz-3ixu6we70ghk69wghfrmo0y6a
 192.168.66.146:2377
This node joined a swarm as a worker.

刪除多余的節(jié)點(diǎn)。

[root@docker-m1 ~]# docker node rm 34emdxnfc139d6kc4ht2xsp4b
 4om9sg56sg09t9whelbrkh8qn
34emdxnfc139d6kc4ht2xsp4b
4om9sg56sg09t9whelbrkh8qn
[root@docker-m1 ~]#

三、部署NGINX應(yīng)用測(cè)試

3.1、service命令

  • Service(服務(wù)) 是一個(gè)抽象概念,表示你希望運(yùn)行的應(yīng)用(比如 Nginx、Redis 等),以及它的期望狀態(tài)(如副本數(shù)、網(wǎng)絡(luò)、端口等)。
  • Task(任務(wù)) 是服務(wù)在某個(gè)節(jié)點(diǎn)上的實(shí)際運(yùn)行實(shí)例。每個(gè) Task 對(duì)應(yīng)一個(gè)容器(Container)。

只有 Manager 節(jié)點(diǎn)才能管理服務(wù)(執(zhí)行這些命令)。

服務(wù)是 Swarm 模式下的核心資源之一,適合用于部署高可用、可擴(kuò)展的分布式應(yīng)用。

# 查看service 幫助命令
[root@docker-m1 ~]# docker service
Usage:  docker service COMMAND
Manage services
Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service
Run 'docker service COMMAND --help' for more information on a command.
命令作用描述常用用途/示例
create創(chuàng)建一個(gè)新的服務(wù)(Service),由 Swarm 管理調(diào)度啟動(dòng)一個(gè) Nginx 服務(wù)并指定副本數(shù):docker service create --replicas 3 -p 80:80 nginx
inspect查看一個(gè)或多個(gè)服務(wù)的詳細(xì)信息查看服務(wù)配置和狀態(tài):docker service inspect my_service
logs獲取某個(gè)服務(wù)或任務(wù)的日志查看服務(wù)日志:docker service logs my_service 查看具體任務(wù)日志:docker service logs <task_id>
ls列出當(dāng)前 Swarm 集群中的所有服務(wù)查看所有運(yùn)行的服務(wù):docker service ls
ps顯示一個(gè)或多個(gè)服務(wù)的任務(wù)(Task)狀態(tài)查看服務(wù)下所有容器的狀態(tài):docker service ps my_service
rm刪除一個(gè)或多個(gè)服務(wù)刪除服務(wù):docker service rm my_service
rollback回滾服務(wù)到上一次配置(例如更新失敗后恢復(fù))回滾服務(wù)更新:docker service rollback my_service
scale調(diào)整一個(gè)或多個(gè)服務(wù)的副本數(shù)量(Replicas)擴(kuò)容服務(wù):docker service scale my_service=5
update更新服務(wù)的配置(如鏡像、環(huán)境變量、端口等),支持滾動(dòng)更新更新服務(wù)鏡像并設(shè)置更新策略:docker service update --image nginx:1.21 --update-parallelism 2 my_service

3.2、創(chuàng)建NGINX服務(wù)

docker service 服務(wù)啟動(dòng),具有擴(kuò)縮,滾動(dòng)更新。

docker service create -p 8888:80 --name my-nginx nginx
  • Docker 會(huì)在集群中啟動(dòng)一個(gè)名為 my-nginx 的服務(wù)。
  • 該服務(wù)默認(rèn)以 副本模式(Replicated) 運(yùn)行一個(gè)任務(wù)(Task),也就是一個(gè) nginx 容器。
  • 所有連接到 Swarm 節(jié)點(diǎn)(任意節(jié)點(diǎn))的 8888 端口的請(qǐng)求都會(huì)被路由到運(yùn)行著 nginx 的容器中。
  • 如果你有多個(gè)節(jié)點(diǎn),Swarm 可以根據(jù)策略自動(dòng)調(diào)度任務(wù)到不同節(jié)點(diǎn)上運(yùn)行。

3.3、查看NGINX服務(wù)

docker service ls

該命令用于列出當(dāng)前 Docker Swarm 集群中所有的服務(wù)(Services)。

[root@docker-m1 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
nckewzy2gkl1   my-nginx   replicated   1/1        nginx:latest   *:8888->80/tcp
字段含義
ID服務(wù)的唯一標(biāo)識(shí)符(內(nèi)部使用,通常不需要手動(dòng)處理)
NAME服務(wù)的名稱(比如你用 --name my-nginx 指定的)
MODE服務(wù)的調(diào)度模式: - replicated:副本模式(指定數(shù)量的副本) - global:全局模式(每個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)任務(wù))
REPLICAS實(shí)際運(yùn)行 / 期望的副本數(shù)(例如 3/3 表示所有副本都在正常運(yùn)行)
IMAGE使用的鏡像名稱和標(biāo)簽(如 nginx:latest
PORTS端口映射信息(比如 *:8888->80/tcp 表示宿主機(jī)的 8888 端口映射到容器的 80 端口)
docker service ps my-nginx

必須在 Manager 節(jié)點(diǎn) 上執(zhí)行此命令。

這個(gè)命令用于查看指定服務(wù)(Service)的所有任務(wù)(Tasks)的運(yùn)行狀態(tài)。

在 Docker Swarm 中,一個(gè)服務(wù)(Service)是由多個(gè)“任務(wù)(Task)”組成的。

每個(gè)任務(wù)對(duì)應(yīng)一個(gè)容器(Container),Swarm 會(huì)負(fù)責(zé)調(diào)度這些任務(wù)到集群中的不同節(jié)點(diǎn)上運(yùn)行。

字段含義
ID任務(wù)的唯一 ID
NAME任務(wù)名稱,格式通常是 <service-name>.<replica-number>
IMAGE使用的鏡像
NODE該任務(wù)運(yùn)行在哪個(gè)節(jié)點(diǎn)上
DESIRED STATE期望狀態(tài)(如 Running, Shutdown, Ready
CURRENT STATE當(dāng)前實(shí)際狀態(tài)和持續(xù)時(shí)間
ERROR如果任務(wù)失敗,這里顯示錯(cuò)誤信息
PORTS端口映射信息(如果配置了)
docker service inspect my-nginx

必須在 Manager 節(jié)點(diǎn) 上執(zhí)行此命令。

這個(gè)命令用于查看名為 my-nginx 的服務(wù)的詳細(xì)配置和運(yùn)行狀態(tài)信息

它會(huì)輸出該服務(wù)的完整配置信息(比如使用的鏡像、副本數(shù)、環(huán)境變量、端口映射、調(diào)度約束等)以及當(dāng)前的服務(wù)狀態(tài)、任務(wù)狀態(tài)等,是排查問(wèn)題、了解服務(wù)詳情的重要工具。

部分內(nèi)容說(shuō)明
ID服務(wù)的唯一 ID
Spec服務(wù)的配置規(guī)范(最重要的部分) - 包括鏡像、副本數(shù)、端口、更新策略、重啟策略等
Endpoint服務(wù)暴露的網(wǎng)絡(luò)信息 - 比如 VIP(虛擬 IP)、端口映射等
UpdateStatus最近一次服務(wù)更新的狀態(tài)(是否成功)
CreatedAt / UpdatedAt服務(wù)創(chuàng)建時(shí)間和最近更新時(shí)間

3.4、動(dòng)態(tài)擴(kuò)容

動(dòng)態(tài)擴(kuò)容,緩解主機(jī)被訪問(wèn)的壓力。

docker service update

docker service update 的作用是:

在不中斷服務(wù)的前提下,動(dòng)態(tài)更新 Swarm 服務(wù)的配置(如鏡像、副本數(shù)、端口、資源限制等),支持滾動(dòng)更新和回滾功能,非常適合用于生產(chǎn)環(huán)境中的服務(wù)維護(hù)與升級(jí)。

是實(shí)現(xiàn) 滾動(dòng)更新(rolling update) 的核心命令,適用于持續(xù)集成/持續(xù)部署(CI/CD)流程中非常有用。

選項(xiàng)說(shuō)明示例
--image更新服務(wù)使用的鏡像--image nginx:1.21
--env-add, --env-rm添加或刪除環(huán)境變量--env-add "ENV1=value1"
--replicas設(shè)置新的副本數(shù)--replicas 5
--update-parallelism每次同時(shí)更新的任務(wù)數(shù)--update-parallelism 2
--update-delay設(shè)置兩次更新之間的延遲時(shí)間--update-delay 10s
--limit-cpu, --limit-memory設(shè)置資源限制--limit-cpu 2 --limit-memory 512M
--restart-condition設(shè)置任務(wù)重啟條件--restart-condition on-failure
--network-add, --network-rm添加或移除網(wǎng)絡(luò)--network-add my_network
--publish-add, --publish-rm添加或移除端口映射--publish-add 8080:80
--rollback回滾到上一次配置--rollback
[root@docker-m1 ~]# docker service update --help
Usage:  docker service update [OPTIONS] SERVICE
Update a service
Options:
......
  -q, --quiet                              Suppress progress output
      --read-only                          Mount the container's root filesystem as read only
      --replicas uint                      Number of tasks
      --replicas-max-per-node uint         Maximum number of tasks per node (default 0 = unlimited)
......
docker service update \
  --image nginx:1.21 \
  --update-parallelism 2 \
  --update-delay 10s \
  my-nginx
將 my-nginx 服務(wù)的容器鏡像更新為 nginx:1.21
每次更新 2 個(gè)任務(wù)
每次更新之間間隔 10 秒(確保系統(tǒng)穩(wěn)定)

創(chuàng)建多個(gè)NGINX服務(wù)副本

[root@docker-m1 ~]# docker service update --replicas 2 my-nginx
my-nginx
overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service converged
[root@docker-m1 ~]#
查看創(chuàng)建的NGINX服務(wù)副本
[root@docker-m1 ~]# docker service ls
ID             NAME           MODE         REPLICAS   IMAGE          PORTS
ngoi21hcjan5   my-nginx   replicated   2/2        nginx:latest   *:8888->80/tcp
[root@docker-m1 ~]# docker service ps my-nginx
ID             NAME             IMAGE          NODE        DESIRED STATE   
CURRENT STATE            ERROR     PORTS
w5azhbc3xrta   my-nginx.1   nginx:latest   docker-n2   Running         Running 36 minutes ago
rgtjq163z9ch   my-nginx.2   nginx:latest   docker-m1   Running         Running 33 seconds ago

測(cè)試訪問(wèn)NGINX服務(wù)

http://192.168.66.146:8888/
http://192.168.66.154:8888/

刪除對(duì)應(yīng)的服務(wù)

docker service rm my-nginx

3.5、模擬故障情況

當(dāng)docker-m1管理主機(jī)發(fā)生宕機(jī)時(shí),查看NGINX服務(wù)是否能夠正常運(yùn)行訪問(wèn)。

# 關(guān)閉docker-m1節(jié)點(diǎn)
[root@docker-m1 ~]# shutdown -h now
Connection to 192.168.66.146 closed by remote host.
Connection to 192.168.66.146 closed.

查看節(jié)點(diǎn)狀態(tài)

[root@docker-m2 ~]# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
75dxq2qmzr2bv4tkg20gh0syr     docker-m1   Down      Active         Unreachable      26.1.4
l2is4spmgd4b5xmmxwo3jvuf4 *   docker-m2   Ready     Active         Reachable        26.1.4
u89a2ie2buxuc5bsew4a2wrpo     docker-m3   Ready     Active         Leader           26.1.4
aon2nakgk87rds5pque74itw4     docker-n1   Ready     Active                          26.1.4
ljdb9d3xkzjruuxsxrpmuei7s     docker-n2   Ready     Active                          26.1.4
[root@docker-m2 ~]#

查看服務(wù)狀態(tài)

[root@docker-m2 ~]# docker service ls
ID             NAME           MODE         REPLICAS   IMAGE          PORTS
ngoi21hcjan5   my-nginx   replicated   3/2        nginx:latest   *:8888->80/tcp
[root@docker-m2 ~]# docker service ps my-nginx
ID             NAME                 IMAGE          NODE        DESIRED STATE
CURRENT STATE            ERROR     PORTS
w5azhbc3xrta   my-nginx.1       nginx:latest   docker-n2   Running         Running 2 minutes ago
tteb16dnir6u   my-nginx.2       nginx:latest   docker-n1   Running         Running 2 minutes ago
rgtjq163z9ch    \_ my-nginx.2   nginx:latest   docker-m1   Shutdown        Running 17 minutes ago

四、調(diào)度模式

在 Docker Swarm 中,服務(wù)的調(diào)度模式(--mode)確實(shí)分為兩種:

4.1、replicated:副本模式

  • 定義:你指定一個(gè)期望的副本數(shù)量(如 3 個(gè)任務(wù)),Swarm 負(fù)責(zé)在集群中選擇合適的節(jié)點(diǎn)來(lái)運(yùn)行這些副本。
  • 用途:適用于大多數(shù)場(chǎng)景,比如 Web 服務(wù)、數(shù)據(jù)庫(kù)連接池等,你希望控制服務(wù)的整體規(guī)模而不必每個(gè)節(jié)點(diǎn)都跑一個(gè)。
docker service create \
  --name my-web \
  --replicas 3 \
  nginx

這會(huì)在集群中啟動(dòng) 3 個(gè) Nginx 容器,具體分布在哪些節(jié)點(diǎn)上由 Swarm 自動(dòng)決定。

4.2、global:全局模式

  • 定義:每個(gè)節(jié)點(diǎn)上運(yùn)行一個(gè)任務(wù)(容器),不需要指定副本數(shù)。
  • 用途:適合需要在每個(gè)節(jié)點(diǎn)上都部署的服務(wù),例如日志收集器、監(jiān)控代理、網(wǎng)絡(luò)插件等。
docker service create \
  --name node-exporter \
  --mode global \
  prom/node-exporter

這會(huì)在集群中的每一個(gè)節(jié)點(diǎn)(Manager 和 Worker)上都啟動(dòng)一個(gè) node-exporter 容器。

模式含義是否需要指定副本數(shù)每個(gè)節(jié)點(diǎn)最多運(yùn)行幾個(gè)任務(wù)典型使用場(chǎng)景
replicated指定總副本數(shù),Swarm 分配部署0 或 1Web 服務(wù)、API 服務(wù)、數(shù)據(jù)庫(kù)代理等
global每個(gè)節(jié)點(diǎn)自動(dòng)運(yùn)行一個(gè)任務(wù)1監(jiān)控代理、日志采集、節(jié)點(diǎn)級(jí)守護(hù)進(jìn)程

是否可以運(yùn)行超過(guò)當(dāng)前機(jī)器數(shù)量的容器?

當(dāng)你創(chuàng)建一個(gè)服務(wù)時(shí),Swarm 會(huì)在集群中的節(jié)點(diǎn)上為該服務(wù)創(chuàng)建多個(gè)任務(wù)(容器實(shí)例),每個(gè)任務(wù)都有一個(gè)全局唯一的任務(wù)ID和一個(gè)基于服務(wù)名稱的任務(wù)名稱格式如 <service-name>.<replica-number>。

Swarm 節(jié)點(diǎn) ≠ 任務(wù)上限

每臺(tái)機(jī)器(節(jié)點(diǎn))可以運(yùn)行多個(gè)服務(wù)任務(wù)(容器),只要資源(CPU、內(nèi)存等)允許。

Docker Swarm 默認(rèn)會(huì)在所有可用節(jié)點(diǎn)中智能分配任務(wù),包括重復(fù)地在同一個(gè)節(jié)點(diǎn)上部署多個(gè)任務(wù)。

全局模式 (global) 下:每個(gè)節(jié)點(diǎn)只運(yùn)行一個(gè)任務(wù)

副本模式 (replicated) 下的任務(wù)數(shù)量不受限于節(jié)點(diǎn)數(shù)

到此這篇關(guān)于LINUX中Docker Swarm的介紹和詳細(xì)使用教程的文章就介紹到這了,更多相關(guān)linux docker swarm使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論