docker compose和docker swarm 和 docker stack

docker compose:單機部署,使用docker compose編排多個服務

docker swarm:多機部署,實現對單個服務的簡單部署(通過dockerfile)

docker stack :實現集羣環境下多服務編排。(通過compose.yml)

狂神說docker(最全筆記)_狂神說docker筆記-CSDN博客

 

 

 

 

 

 

 

 

 

 

 

 docker-compose教程(安裝,使用, 快速入門)-CSDN博客

docker-compose文件結構

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:

 

 

 

 

 

 

 

Docker三劍客之docker-swarm

Docker三劍客之docker-swarm - 會飛的豬的文章 - 知乎 https://zhuanlan.zhihu.com/p/93459309

​簡介

Swarm是Docker官方提供的一款集羣管理工具,其主要作用是把若干臺Docker主機抽象爲一個整體,並且通過一個入口統一管理這些Docker主機上的各種Docker資源。Swarm和Kubernetes比較類似,但是更加輕,具有的功能也較kubernetes更少一些。

swarm集羣提供給用戶管理集羣內所有容器的操作接口與使用一臺Docker主機基本相同。

Swarm一些概念說明

1、節點

運行 Docker 的主機可以主動初始化一個 Swarm 集羣或者加入一個已存在的 Swarm 集羣,這樣這個運行 Docker 的主機就成爲一個 Swarm 集羣的節點 (node) 。

節點分爲管理 (manager) 節點和工作 (worker) 節點。

管理節點用於 Swarm 集羣的管理,docker swarm 命令基本只能在管理節點執行(節點退出集羣命令 docker swarm leave 可以在工作節點執行)。一個 Swarm 集羣可以有多個管理節點,但只有一個管理節點可以成爲 leader,leader 通過 raft 協議實現。

工作節點是任務執行節點,管理節點將服務 (service) 下發至工作節點執行。管理節點默認也作爲工作節點。你也可以通過配置讓服務只運行在管理節點。

來自 Docker 官網的這張圖片形象的展示了集羣中管理節點與工作節點的關係。

 

 

2、服務和任務


  • 任務 (Task)是 Swarm 中的最小的調度單位,目前來說就是一個單一的容器。

  • 服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:

  • replicated services 按照一定規則在各個工作節點上運行指定個數的任務。

  • global services 每個工作節點上運行一個任務

兩種模式通過 docker service create 的 --mode 參數指定。

來自 Docker 官網的這張圖片形象的展示了容器、任務、服務的關係。

 

 

Swarm 調度策略

Swarm在scheduler節點(leader 節點)運行容器的時候,會根據指定的策略來計算最適合運行容器的節點,目前支持的策略有:spread, binpack, random.

1)Random

顧名思義,就是隨機選擇一個 Node 來運行容器,一般用作調試用,spread 和 binpack 策略會根據各個節點的可用的 CPU, RAM 以及正在運行的容器的數量來計算應該運行容器的節點。

2)Spread

在同等條件下,Spread 策略會選擇運行容器最少的那臺節點來運行新的容器,binpack 策略會選擇運行容器最集中的那臺機器來運行新的節點。使用 Spread 策略會使得容器會均衡的分佈在集羣中的各個節點上運行,一旦一個節點掛掉了只會損失少部分的容器。

3)Binpack

Binpack 策略最大化的避免容器碎片化,就是說 binpack 策略儘可能的把還未使用的節點留給需要更大空間的容器運行,儘可能的把容器運行在一個節點上面。

Swarm命令行說明

  1. docker swarm:集羣管理
  2. init #初始化集羣
  3. join #將節點加入集羣
  4. join-token #管理加入令牌
  5. leave #從集羣中刪除某個節點,強制刪除加參數--force
  6. update #更新集羣
  7. unlock #解鎖集羣
  8. docker node:節點管理,
  9. demote #將集羣中一個或多個節點降級
  10. inspect #顯示一個或多個節點的詳細信息
  11. ls #列出集羣中的節點
  12. promote #將一個或多個節點提升爲管理節點
  13. rm #從集羣中刪除停止的節點,--force強制刪除參數
  14. ps #列出一個或多個節點上運行的任務
  15. update #更新節點
  16. docker service:服務管理,
  17. create #創建一個新的服務
  18. inspect #列出一個或多個服務的詳細信息
  19. ps #列出一個或多個服務中的任務信息
  20. ls #列出服務
  21. rm #刪除一個或多個服務
  22. scale #擴展一個或多個服務
  23. update #更新服務

 

安裝佈署swarm集羣服務


  • manager:192.168.124.129

  • node:192.168.124.132

1、修改主機名,配置hosts文件

  1. [root@manager ~]# cat >>/etc/hosts<<EOF
  2. 192.168.124.129 manager
  3. 192.168.124.132 node1
  4. EOF
  5. [root@manager ~]# tail -3/etc/hosts
  6. 192.168.124.129 manager
  7. 192.168.124.132 node1
  8. #node1 node2配置同上一致即可

 

2、配置docker

編輯docker文件:/usr/lib/systemd/system/docker.service

  1. vim /usr/lib/systemd/system/docker.service

 

修改ExecStart行爲下面內容

  1. ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \

 

重新加載docker配置

  1. systemctl daemon-reload // 1,加載docker守護線程
  2. systemctl restart docker // 2,重啓docker

 

所有節點加上上面標記的部分,開啓2375端口

3、所有節點下載swarm鏡像文件

  1. $ docker pull swarm

 

4、創建swarm並初始化

  1. $ docker swarm init --advertise-addr 192.168.124.129
  2. Swarm initialized: current node (4c70fdpk3ip083rg7nnuk5stw)is now a manager.
  3. To add a worker to this swarm, run the following command:
  4. docker swarm join --token SWMTKN-1-5jubbodkfxlp96pg2w9sihqdvtruhkdje3bls1nb9ujiig0t3n-1d9l7t4bssnglbuemx9v06r3x192.168.124.129:2377
  5. To add a manager to this swarm, run 'docker swarm join-token manager'and follow the instructions.
  6. #執行上面的命令後,當前的服務器就加入到swarm集羣中,同時會產生一個唯一的token值,其它節點加入集羣時需要用到這個token。
  7. #--advertise-addr 表示swarm集羣中其它節點使用後面的IP地址與管理節點通訊,上面也提示了其它節點如何加入集羣的命令。

 

5、將node1加入到集羣中

在node1下執行

  1. $ docker swarm join --token SWMTKN-1-5jubbodkfxlp96pg2w9sihqdvtruhkdje3bls1nb9ujiig0t3n-1d9l7t4bssnglbuemx9v06r3x192.168.124.129:2377
  2. This node joined a swarm as a worker.

 

6、管理節點查看集羣節點狀態

  1. $ docker node ls
  2. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  3. 4c70fdpk3ip083rg7nnuk5stw* manager ReadyActiveLeader18.09.0
  4. 5viloj6u950gkilsl689aonyn node1 ReadyActiveReachable18.09.0
  5. #swarm集羣中node的AVAILABILITY狀態有兩種:Active、drain。其中actice狀態的節點可以接受管理節點的任務指派;drain狀態的節點會結束任務,也不會接受管理節點的任務指派,節點處於下線狀態。

 

7、Swarm 的Web管理

  1. $ docker run -d -p 9000:9000-v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

 

瀏覽器訪問

 

 

docker-swarm佈署服務

1、佈署服務前創建於個用於集羣內不同主機之間容器通信的網絡

  1. $ docker network create -d overlay dockernet
  2. 5lhuzjkx36j40na59gmu400op

 

2、創建服務(nginx爲例)

  1. $docker service create --replicas 1--network dockernet --name nginx-cluster -p 80:80 nginx
  2. klpwtncehp0vkh0d1gqqvicf6
  3. #--replicas 指定副本數量
  4. $docker service ls
  5. ID NAME MODE REPLICAS IMAGE PORTS
  6. klpwtncehp0v nginx-cluster replicated 1/1 nginx:latest *:80->80/tcp
  7. $ docker service ps nginx-cluster
  8. ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
  9. j1y2blg3pa7j nginx-cluster.1 nginx:latest manager RunningRunning53 seconds ago
  10. $ docker ps
  11. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  12. 9a2e361f535b nginx:latest "nginx -g 'daemon of…"About a minute ago UpAbout a minute 80/tcp nginx-cluster.1.j1y2blg3pa7j9mtg54e2csr7f

 

3、在線動態擴容服務

  1. docker service scale nginx-cluster=5
  2. nginx-cluster scaled to 5
  3. $ docker service ls
  4. ID NAME MODE REPLICAS IMAGE PORTS
  5. klpwtncehp0v nginx-cluster replicated 5/5 nginx:latest *:80->80/tcp
  6. $ docker service ps nginx-cluster
  7. ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
  8. j1y2blg3pa7j nginx-cluster.1 nginx:latest manager RunningRunning3 minutes ago
  9. y5ib98y3rr5i nginx-cluster.2 nginx:latest node1 RunningRunning35 seconds ago
  10. wpiydfv0j2w5 nginx-cluster.3 nginx:latest node1 RunningRunning35 seconds ago
  11. ibl73haatpvc nginx-cluster.4 nginx:latest manager RunningRunning about a minute ago
  12. a6oa1h83ba3c nginx-cluster.5 nginx:latest node1 RunningRunning35 seconds ago
  13. #從輸出結果可以看出已經將服務動態擴容至5個,也就是5個容器運行着相同的服務

 

4、節點故障

  1. $ docker service ps nginx-cluster
  2. ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
  3. j1y2blg3pa7j nginx-cluster.1 nginx:latest manager RunningRunning45 minutes ago
  4. ugx002mtbfmp nginx-cluster.2 nginx:latest manager RunningRunning7 seconds ago
  5. y5ib98y3rr5i \_ nginx-cluster.2 nginx:latest node1 ShutdownShutdown11 seconds ago
  6. q1f5jhhx7kcy nginx-cluster.3 nginx:latest manager RunningRunning7 seconds ago
  7. wpiydfv0j2w5 \_ nginx-cluster.3 nginx:latest node1 ShutdownShutdown11 seconds ago
  8. ibl73haatpvc nginx-cluster.4 nginx:latest manager RunningRunning43 minutes ago
  9. a6f7zpclrpm4 nginx-cluster.5 nginx:latest manager RunningRunning7 seconds ago
  10. a6oa1h83ba3c \_ nginx-cluster.5 nginx:latest node1 ShutdownShutdown11 seconds ago
  11. #如果集羣中節點發生故障,會從swarm集羣中被T除,然後利用自身的負載均衡及調度功能,將服務調度到其它節點上

 

5、其它常用命令介紹

    1. $ docker service ls
    2. ID NAME MODE REPLICAS IMAGE PORTS
    3. klpwtncehp0v nginx-cluster replicated 5/5 nginx:latest *:80->80/tcp
    4. $ docker service update --replicas 2 nginx-cluster
    5. nginx-cluster
    6. #將服務縮減到2個
    7. $ docker service ls
    8. ID NAME MODE REPLICAS IMAGE PORTS
    9. klpwtncehp0v nginx-cluster replicated 2/2 nginx:latest *:80->80/tcp
    10. $ docker service update --image nginx:new nginx-cluster
    11. #更新服務的鏡像版本
    12. $ docker rm nginx-cluster
    13. #將所有節點上的所有容器全部刪除,任務也將全部刪除

docker swarm 集羣服務編排部署指南(docker stack) - DPDK原理的文章 - 知乎 https://zhuanlan.zhihu.com/p/620868766

Docker Swarm 集羣管理

概述

Docker Swarm 是 Docker 的集羣管理工具。它將 Docker 主機池轉變爲單個虛擬 Docker 主機,使得容器可以組成跨主機的子網網絡。Docker Swarm 提供了標準的 Docker API,所有任何已經與 Docker 守護程序通信的工具都可以使用 Swarm 輕鬆地擴展到多個主機。

集羣的管理和編排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化時啓動 swarm 模式或者加入已存在的 swarm。

支持的工具包括但不限於以下各項:

  • Dokku
  • Docker Compose
  • Docker Machine
  • Jenkins

 

Docker Swarm 優點

  • 任何規模都有高性能表現

對於企業級的 Docker Engine 集羣和容器調度而言,可拓展性是關鍵。任何規模的公司——不論是擁有五個還是上千個服務器——都能在其環境下有效使用 Swarm。

經過測試,Swarm 可拓展性的極限是在 1000 個節點上運行 50000 個部署容器,每個容器的啓動時間爲亞秒級,同時性能無減損。

  • 靈活的容器調度

Swarm 幫助 IT 運維團隊在有限條件下將性能表現和資源利用最優化。Swarm 的內置調度器(scheduler)支持多種過濾器,包括:節點標籤,親和性和多種容器部策略如 binpack、spread、random 等等。

  • 服務的持續可用性

Docker Swarm 由 Swarm Manager 提供高可用性,通過創建多個 Swarm master 節點和制定主 master 節點宕機時的備選策略。如果一個 master 節點宕機,那麼一個 slave 節點就會被升格爲 master 節點,直到原來的 master 節點恢復正常。

此外,如果某個節點無法加入集羣,Swarm 會繼續嘗試加入,並提供錯誤警報和日誌。在節點出錯時,Swarm 現在可以嘗試把容器重新調度到正常的節點上去。

  • 和 Docker API 及整合支持的兼容性

Swarm 對 Docker API 完全支持,這意味着它能爲使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用戶提供無縫銜接的使用體驗。

  • Docker Swarm 爲 Docker 化應用的核心功能(諸如多主機網絡和存儲卷管理)提供原生支持

開發的 Compose 文件能(通過 docker-compose up )輕易地部署到測試服務器或 Swarm 集羣上。Docker Swarm 還可以從 Docker Trusted Registry 或 Hub 裏 pull 並 run 鏡像。

  • 集羣模式,當修改了服務的配置後無需手動重啓服務。並且只有集羣中的manager才能管理集羣中的一切(包括服務、容器都歸它管,在一個woker節點上無法操作容器)

節點

swarm 集羣由管理節點(manager)和工作節點(work node)構成。

  • swarm mananger:負責整個集羣的管理工作包括集羣配置、服務管理等所有跟集羣有關的工作。一個 Swarm 集羣可以有多個管理節點,但只有一個管理節點可以成爲 leader,leader 通過 raft 協議實現。

爲了利用swarm模式的容錯功能,Docker建議根據組織的高可用性要求實現奇數個節點。當您擁有多個管理器時,您可以從管理器節點的故障中恢復而無需停機。

N個管理節點的集羣容忍最多損失 (N-1)/2 個管理節點。
Docker建議一個集羣最多7個管理器節點。
  • work node:即圖中的 available node,主要負責運行相應的服務來執行任務(task)。工作節點是任務執行節點,管理節點將服務 (service) 下發至工作節點執行。管理節點默認也作爲工作節點。也可以通過配置讓服務只運行在管理節點。

 

服務和任務

任務 (Task)是 Swarm 中的最小的調度單位,目前來說就是一個單一的容器。

服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:

 

replicated services (複製服務)按照一定規則在各個工作節點上運行指定個數的任務。

global services (全局服務)每個工作節點上運行一個此任務。

兩種模式通過 docker service create 的 --mode 參數指定。下圖展示了容器、任務、服務的關係。

路由網格

service 通過 ingress load balancing 來發布服務,且 swarm 集羣中所有 node 都參與到 ingress 路由網格(ingress routing mesh) 中,訪問任意一個 node+PublishedPort 即可訪問到服務。

當訪問任何節點上的端口8080時,Docker將請求路由到活動容器。在羣節點本身,端口8080可能並不實際綁定,但路由網格知道如何路由流量,並防止任何端口衝突的發生。

路由網格在發佈的端口上監聽分配給節點的任何IP地址。對於外部可路由的IP地址,該端口可從主機外部獲得。對於所有其他IP地址,只能從主機內部訪問。

Swarm 集羣的搭建

準備工作

二個或二個以上可以通過網絡進行通信的Linux主機或虛擬機,並安裝了Docker(加入開機自啓),或者使用docker-machine 創建三臺虛擬機。swarm 不需要單獨安裝,安裝了 docker 就自帶了該軟件

已安裝Docker Engine 1.12或更高版本

關閉所有主機上的防火牆或者開放以下端口:

TCP協議端口 2377 :集羣管理端口

TCP協議端口 7946 :節點之間通訊端口(不開放則會負載均衡失效)

UDP協議端口 4789 :overlay網絡通訊端口

防火牆相關命令:
# 查看firewalld防火牆狀態
systemctl status firewalld

# 查看所有打開的端口 
firewall-cmd --zone=public --list-ports

# 防火牆開放端口(更新firewalld防火牆規則後生效)
firewall-cmd --zone=public --add-port=要開放的端口/tcp --permanent
# 選項:
–zone 				# 作用域
–add-port=80/tcp 	# 添加端口,格式爲:端口/通訊協議
–permanent 			#永久生效,沒有此參數重啓後失效
# 示例:
firewall-cmd --zone=public --add-port=3306/tcp --permanent

# firewalld防火牆關閉接口(更新firewalld防火牆規則後生效)
firewall-cmd --zone=public --remove-port=要關閉的端口/tcp --permanent

# 更新firewalld防火牆規則(並不中斷用戶連接,即不丟失狀態信息)
firewall-cmd --reload

# 啓動firewalld防火牆
systemctl start firewalld
# 關閉firewalld防火牆:
systemctl stop firewalld
# 開機禁用firewalld防火牆
systemctl disable firewalld
# 開機啓用firewalld防火牆: 
systemctl enable firewalld

 

  • 分別修改機器的主機名,更改成 swarm01,swarm02 …

hostnamectl set-hostname swarm01

 

創建docker swarm集羣

1.master主機上初始化swarm。執行 docker swarm init 命令的節點自動成爲管理節點。

docker swarm init

# 注:如果主機有多個網卡,擁有多個IP,必須使用 --advertise-addr 指定 IP。
# 示例:
docker swarm init --advertise-addr 192.168.99.100

 

# 執行命令後會給出加入這個swarm的命令
Swarm initialized: current node (4a8mo8cekpe0vpk0ze963avw9) is now a manager.

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

    docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377

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

 

2.在node主機上執行命令加入swarm

docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377

3.查看集羣信息。集羣的大部分命令需要在管理節點中才能運行

# 查看 swarm 集羣狀態
docker info
# 查看集羣節點信息
docker node ls

Swarm 集羣管理常用命令

docker swarm:管理集羣

# 初始化一個swarm
docker swarm init [OPTIONS]
# 選項:
--advertise-addr string		# 發佈的地址(格式:<ip|interface>[:port])
--force-new-cluster			# 強制從當前狀態創建一個新的集羣(去除本地之外的所有管理器身份)
--cert-expiry duration		# 節點證書有效期(ns|us|ms|s|m|h)(默認爲2160h0m0s)
--data-path-addr string     # 用於數據路徑通信的地址或接口(格式: <ip|interface>)
--data-path-port uint32 	# 用於數據路徑流量的端口號(1024 - 49151)。如果沒有值,則默認端口號4789
--dispatcher-heartbeat duration		# 調度程序的心跳週期(ns|us|ms|s|m|h)(默認爲5s)
--listen-addr node-addr		# 監聽地址(格式: <ip|interface>[:port]) (默認 0.0.0.0:2377)

# 查看加入節點到集羣的命令及令牌(token)
docker swarm join-token [OPTIONS] (worker|manager)
# 選項:
-q, --quiet    # 只顯示令牌
	--rotate   # 使舊令牌無效並生成新令牌
# 查看加入工作節點到集羣的命令及令牌
docker swarm join-token worker
# 查看加入管理節點到集羣的命令及令牌
docker swarm join-token manager

# 將節點加入swarm集羣,作爲一個manager或worker
docker swarm join [OPTIONS] HOST:PORT
# 選項:
--advertise-addr string   # 發佈的地址 (格式: <ip|interface>[:port])
--availability string     # 節點的可用性 ("active"|"pause"|"drain") (default "active")
--data-path-addr string   # 用於數據路徑通信的地址或接口 (格式: <ip|interface>)
--listen-addr node-addr   # 監聽地址 (格式: <ip|interface>[:port]) (default 0.0.0.0:2377)
--token string            # 進入的swarm集羣的令牌     

# 主動退出集羣,讓節點處於down狀態(在需要退出Swarm集羣的節點主機上執行命令)
docker swarm leave [OPTIONS]
# 選項:
-f, --force		# 強制。Manager若要退出 Swarm 集羣,需要加上強制選項
## 移除一個work-node節點主機的完整步驟:
# 1.在管理節點上操作,清空work-node節點的容器。id 可以使用命令 docker node ls 查看
docker node update --availability drain [id]
# 2.在work-node節點主機上操作,退出集羣
docker swarm leave
# 3,在管理節點上操作,刪除work-node節點
docker node rm [id]
# 若想解散整個集羣,則需先移除所有work-node節點主機,然後所有管理節點也退出集羣

# 更新 swarm 集羣的配置
docker swarm update [OPTIONS]
# 選項:
--autolock							# 更改管理器自動鎖定設置(true|false)
--cert-expiry duration         		# 節點證書有效期(ns|us|ms|s|m|h)(默認爲2160h0m0s)
--dispatcher-heartbeat duration		# 調度程序心跳週期(ns|us|ms|s|m|h)(默認爲5s)

 

docker node:管理swarm集羣節點

# 查看集羣中的節點
docker node ls
#選項:
-f, --filter filter   	# 根據所提供的條件過濾輸出。(格式:key=value)
							# 目前支持的過濾器是:id, label, name, membership[=accepted|pending]
											   # , role[manager|worker]
-q, --quiet				# 只顯示id

# 查看運行的一個或多個及節點任務數,默認當前節點
docker node ps [OPTIONS] [NODE...]
#選項:
-f, --filter filter   	# 根據所提供的條件過濾輸出
-q, --quiet				# 只顯示id

# 將worker角色升級爲manager
docker node promote NODE [NODE...]
# 將manager角色降級爲worker
docker node demote NODE [NODE...]

# 查看節點的詳細信息,默認json格式
docker node inspect 主機名
# 查看節點信息平鋪格式
docker node inspect --pretty 主機名

# 從swarm中刪除一個節點
docker node rm 主機名
# 從swarm中強制刪除一個節點
docker node rm -f 主機名

# 更新一個節點
docker node update [options] 主機名
# 選項
--label-add list		# 添加節點標籤(key=value)
--label-rm list 		# 刪除節點標籤
--role string           # 更改節點角色 ("worker"|"manager")
--availability active/pause/drain	# 設置節點的狀態
                # active  正常
                # pause   暫停。調度程序不向節點分配新任務,但是現有任務仍然保持運行
                # drain   排除自身work任務。調度程序不向節點分配新任務,且會關閉任何現有任務並在可用節點上安排它們

docker service:服務管理

# 列出服務列表
docker service ls

# 列出服務任務信息
docker service ps [OPTIONS] SERVICE [SERVICE...]
# 選項:
	--no-trunc			# 顯示完整的信息
-f, --filter filter   	# 根據所提供的條件過濾輸出。過濾只運行的任務信息:"desired-state=running"
-q, --quiet				# 只顯示任務id

# 查看服務內輸出
docker service logs [OPTIONS] SERVICE|TASK
# 選項:
	--details        # 顯示提供給日誌的額外細節
-f, --follow         # 跟蹤日誌輸出
	--since string   # 顯示自時間戳 (2013-01-02T13:23:37Z) 或相對時間戳 (42m for 42 minutes) 以來的日誌
-n, --tail string    # 從日誌末尾顯示的行數(默認爲“all”)
-t, --timestamps     # 顯示時間戳


# 更新服務的相關配置
docker service update [options] 服務名
# 選項
--args "指令"			# 容器加入指令
--image IMAGE		 # 更新服務容器鏡像
--rollback				# 回滾服務容器版本
--network-add 網絡名	  # 添加容器網絡
--network-rm 網絡名	  # 刪除容器網絡
--reserve-cpu int			# 更新分配的cpu
--reserve-memory bytes		# 更新分配的內存(示例:512m)
--publish-add 暴露端口:容器端口		# 映射容器端口到主機
--publish-rm 暴露端口:容器端口		# 移除暴露端口
--endpoint-mode dnsrr		 # 修改負載均衡模式爲dnsrr
--force						 # 強制重啓服務
--config-rm 配置文件名稱		 # 刪除配置文件
--constraint-add list		 # 新增一個約束 
--constraint-rm list		 # 移除一個約束 
--placement-pref-add pref	 # 新增一個偏好 
--placement-pref-rm pref	 # 移除一個偏好
--config-add 配置文件名,target=/../容器內配置文件名		# 添加新的配置文件到容器內


# 查看服務詳細信息,默認json格式
docker service inspect [OPTIONS] 服務名 [SERVICE...]
# 查看服務信息平鋪形式
docker service inspect --pretty 服務名

# 刪除服務
docker service rm [OPTIONS] 服務名 [SERVICE...]

# 縮容擴容服務容器副本數量
docker service scale 服務名=副本數 [SERVICE=REPLICAS...]

# 創建一個服務。一般搭建好 Swarm 集羣后,使用 docker stack 部署應用,此處僅作了解
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 選項:
--name string			# 指定容器名稱
--replicas int			# 指定副本數
--network 網絡名		  # 添加網絡組
--mode string			# 服務模式(複製或全局)(replicated | global)
--reserve-cpu int		# 預留的cpu
--reserve-memory bytes	# 預留的內存(512m)
--limit-cpu	int			# 限制CPU
--limit-memory bytes	# 限制內存(512m)
-l,	--label list			# 服務的標籤(key=value)
--container-label list		# 容器標籤(key=value)
-p, --publish 暴露端口:容器端口	  # 映射容器端口到主機
-e,	--env MYVAR=myvalue			# 配置環境變量
-w,	--workdir string			# 指定工作目錄(示例:/tmp)
-restart-condition string		# 滿足條件時重新啓動(no | always | on-failure | unless-stopped)
--restart-delay duration		# 重新啓動嘗試之間的延遲 (ns/us/ms/s/m/h)
--restart-max-attempts int		# 放棄前的最大重啓次數
--restart-window duration			# 用於評估重啓策略的窗口 (ns/us/ms/s/m/h)
--stop-grace-period duration		# 強制殺死容器前的等待時間 (ns/us/ms/s/m/h)
--update-delay duration				# 更新之間的延遲(ns/us/ms/s/m/h)(默認 0s)
--update-failure-action	string		# 更新失敗的操作("pause"停止|"continue"繼續)(默認pause)
--update-max-failure-ratio float	# 更新期間容忍的失敗率
--update-monitor duration			# 每次任務更新後監控失敗的持續時間(ns/us/ms/s/m/h)(默認 0s)
--update-parallelism int			# 同時更新的最大任務數(0表示一次更新全部任務)(默認爲1)  
--endpoint-mode string				# 負載均衡模式(vip or dnsrr) (默認 "vip")
--rollback-monitor 20s		  	    # 每次容器與容器之間的回滾時間間隔
--rollback-max-failure-ratio .數值	# 回滾故障率如果小於百分比允許運行(“.2”爲%20)
--mount type=volume,src=volume名稱,dst=容器目錄	 # 創建volume類型數據卷
--mount type=bind,src=宿主目錄,dst=容器目錄			# 創建bind讀寫目錄掛載
--mount type=bind,src=宿主目錄,dst=容器目錄,readonly	 # 創建bind只讀目錄掛載
--config source=docker配置文件,target=配置文件路徑		# 創建docker配置文件到容器本地目錄

docker config:管理配置文件

# 查看已創建配置文件
docker config ls [OPTIONS]
# 選項:
-f, --filter filter   	# 根據所提供的條件過濾輸出
-q, --quiet				# 只顯示id

# 查看配置詳細信息
docker config inspect 配置文件名

# 刪除配置
docker config rm CONFIG [CONFIG...]

# 創建配置文件
docker config create 配置文件名 本地配置文件
# 示例:新建配置文件並添加新配置文件到服務
# 1.創建配置文件
docker config create nginx2_config nginx2.conf 
# 2.刪除舊配置文件
docker service update --config-rm ce_nginx_config 服務名
# 3.添加新配置文件到服務
ocker service update --config-add src=nginx2_config,target=/etc/nginx/nginx.conf ce_nginx

docker network:管理網絡

# 查看集羣網絡列表
docker network ls

# 將容器連接到集羣網絡中
$ docker network connect [OPTIONS] NETWORK CONTAINER
# 選項
    --alias strings				# 爲容器添加網絡範圍的別名
    --driver-opt string		·	# 指定網絡驅動程序
    --ip string					# 指定IPv4地址(如172.30.100.104)
    --ip6 string				# 指定IPv6地址(例如,2001:db8::33)
    --link list					# 添加到另一個容器的鏈接
    --link-local-ip string		# 爲容器添加一個鏈接本地地址
# 示例
docker network connect mynet nginx

# 斷開一個容器與集羣網絡的連接
$ docker network disconnect [OPTIONS] NETWORK CONTAINER
# 選項
	-f, --force		# 強制容器從網絡斷開連接  

# 顯示一個或多個集羣網絡的詳細信息
$ docker network inspect [OPTIONS] NETWORK [NETWORK...]
# 選項
  -f, --format string   # 使用給定的Go模板格式化輸出
  -v, --verbose         # 輸出詳細的診斷信息

# 創建一個集羣網絡
$ docker network create [OPTIONS] NETWORK
# 選項
      --attachable           # 准許手動容器連接
      --aux-address map      # 網絡驅動使用的輔助IPv4或IPv6地址(默認映射[])
      --config-from string   # 要從其中複製配置的網絡
      --config-only          # 創建僅配置網絡
  -d, --driver string        # 管理網絡的驅動程序(默認爲“"bridge”)。選項:bridge、overlay、macvlan
      --gateway strings      # 指定IPv4或IPv6主子網網關。示例:172.20.0.1
      --ingress              # 創建羣路由-網格網絡
      --internal             # 限制外部訪問網絡
      --ip-range strings     # 從子範圍分配容器ip
      --ipam-driver string   # IP管理驅動(默認爲“default”)
      --ipam-opt map         # 設置IPAM驅動程序的特定選項(默認map[])
      --ipv6                 # 啓用IPv6網絡
      --label list           # 在網絡中設置元數據
  -o, --opt map              # 設置驅動程序特定選項(默認map[])
      --scope string         # 控制網絡的範圍
      --subnet strings       # 指定一個CIDR格式的網段。示例:172.20.0.0/24
# 示例:
docker network create -d overlay --attachable apps_net

# 移除所有未使用的集羣網絡
$ docker network prune [OPTIONS]
# 選項
      --filter filter   # 提供過濾值(e.g. 'until=<timestamp>') 
  -f, --force           # 強制,沒有提示確認

# 刪除一個或多個集羣網絡
$ docker network rm NETWORK [NETWORK...]
# 別名:rm, remove

 

docker secret:管理敏感數據存儲

# 查看敏感數據卷列表
$ docker secret ls

# 顯示一個或多個敏感數據卷的詳細信息
$ docker secret inspect [OPTIONS] SECRET [SECRET...]
# 選項
	--pretty		# 易讀的格式打印信息

# 從文件或標準輸入創建一個敏感數據卷作爲內容
$ docker secret create [OPTIONS] SECRET [file|-]
# 選項
  -d, --driver string            # 指定驅動
  -l, --label list               # 指定標籤
      --template-driver string   # 指定模板驅動程序

# 移除一個或多個敏感數據卷
$ docker secret rm SECRET [SECRET...]
# 別名:rm, remove

docker網絡管理

參考:

docker的3種自定義網絡(bridge、overlay、macvlan)

Docker Swarm - 網絡管理

Docker的網絡模式bridge、host、container 、overlay

概述

Docker 提供三種 user-defined 網絡驅動:bridge,overlay 和 macvlan

overlay 和 macvlan 用於創建跨主機的網絡

 

Swarm 集羣產生兩種不同類型的流量:

  • 控制和管理層面:包括 Swarm 消息管理等,例如請求加入或離開Swarm,這種類型的流量總是被加密的。(涉及到集羣內部的hostname、ip-address、subnet、gateway等)
  • 應用數據層面:包括容器與客戶端的通信等。(涉及到防火牆、端口映射、網口映射、VIP等)

 

在 Swarm Service 中有三個重要的網絡概念:

  • Overlay networks :管理 Swarm 中 Docker 守護進程間的通信。可以將服務附加到一個或多個已存在的 overlay 網絡上,使得服務與服務之間能夠通信。
  • ingress network :是一個特殊的 overlay 網絡,用於服務節點間的負載均衡,處理與羣集服務相關的控制和數據流量。當任何 Swarm 節點在發佈的端口上接收到請求時,它將該請求交給一個名爲 IPVS 的模塊。IPVS 跟蹤參與該服務的所有IP地址,選擇其中的一個,並通過 ingress 網絡將請求路由到它。
  • 初始化或加入 Swarm 集羣時會自動創建 ingress 網絡,大多數情況下,用戶不需要自定義配置,但是 docker 17.05 和更高版本允許你自定義。
  • docker_gwbridge :是一種橋接網絡,將 overlay 網絡(包括 ingress 網絡)連接到一個單獨的 Docker 守護進程的物理網絡。默認情況下,服務正在運行的每個容器都連接到本地 Docker 守護進程主機的 docker_gwbridge 網絡。
  • docker_gwbridge 網絡在初始化或加入 Swarm 時自動創建。大多數情況下,用戶不需要自定義配置,但是 Docker 允許自定義。

在管理節點上查看網絡

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
cb0ccb89a988        bridge              bridge              local
0174fb113496        docker_gwbridge     bridge              local
541b62778c0e        host                host                local
8n7xppn5z4j2        ingress             overlay             swarm
369d459f340d        none                null                local

overlay網絡驅動程序會創建多個Docker守護主機之間的分佈式網絡。該網絡位於(覆蓋)特定於主機的網絡之上,允許連接到它的容器(包括羣集服務容器)安全地進行通信。Docker透明地處理每個數據包與正確的Docker守護程序主機和正確的目標容器的路由。

自定義overlay 網絡

創建用於swarm服務的自定義的overlay網絡 命令:

docker network create -d overlay --attachable my-overlay

# 注:overlay 網絡創建可以在 Swarm 集羣下的任意節點執行,並同步更新到所有節點。

 

集羣中部署了兩個服務 nginx、alpine,現在我們進入alpine,去訪問nginx。

$ docker exec -it test1.1.oonwl8c5g4u3p17x8anifeubi bash
$ ping nginx
ping: bad address 'nginx'

$ wget 192.168.99.100:8080
Connecting to 192.168.99.100:8080 (192.168.99.100:8080)
index.html           100% |**********************************************************************************************************|   612   0:00:00 ETA

 

發現集羣中的各個服務不能用名稱訪問的,只能用集羣服務發現的路由網絡訪問,若需要集羣中的服務能通過名稱進行訪問,這就需要用到上面自定義的 overlay 網絡。

 

刪除啓動的服務,重新創建指定使用自定義網絡的服務。

docker service rm nginx alpine
docker service create --name nginx -p 8080:80 --network my-overlay --replicas 3 nginx
docker service create --name alpine --network my-overlay alpine ping www.baidu.com

進入alpine容器中,重新測試下:

$ ping nginx
PING nginx (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.120 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.094 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.108 ms
$ wget nginx
Connecting to nginx (10.0.0.2:80)
index.html           100% |**********************************************************************************************************|   612   0:00:00 ETA

 

發現可以通過名稱進行集羣中的容器間的訪問了。

 

Docker Stack 部署應用

概述

單機模式下,可以使用 Docker Compose 來編排多個服務。Docker Swarm 只能實現對單個服務的簡單部署。而Docker Stack 只需對已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集羣環境下的多服務編排。

 

stack是一組共享依賴,可以被編排並具備擴展能力的關聯service。

 

Docker Stack和Docker Compose區別

  • Docker stack 會忽略了“構建”指令,無法使用 stack 命令構建新鏡像,它是需要鏡像是預先已經構建好的。 所以 docker-compose 更適合於開發場景;
  • Docker Compose 是一個 Python 項目,在內部,它使用 Docker API 規範來操作容器。所以需要安裝 Docker -compose,以便與 Docker 一起在計算機上使用;Docker Stack 功能包含在 Docker 引擎中。你不需要安裝額外的包來使用它,docker stacks 只是 swarm mode 的一部分。
  • Docker stack 不支持基於第2版寫的 docker-compose.yml ,也就是 version 版本至少爲3。然而 Docker Compose 對版本爲2和 3 的文件仍然可以處理;
  • docker stack 把 docker compose 的所有工作都做完了,因此 docker stack 將佔主導地位。同時,對於大多數用戶來說,切換到使用
  • 單機模式(Docker Compose)是一臺主機上運行多個容器,每個容器單獨提供服務;集羣模式(swarm + stack)是多臺機器組成一個集羣,多個容器一起提供同一個服務;

compose.yml deploy 配置說明

docker-compose.yaml 文件中 deploy 參數下的各種配置主要對應了 swarm 中的運維需求。

docker stack deploy 不支持的參數:

(這些參數,就算yaml中包含,在stack的時候也會被忽略,當然也可以爲了 docker-compose up 留着這些配置)

build
cgroup_parent
container_name
devices
tmpfs
external_links
links
network_mode
restart
security_opt
userns_mode

 

deploy:指定與服務的部署和運行有關的配置。注:只在 swarm 模式和 stack 部署下才會有用。且僅支持 V3.4 及更高版本。

 

可以選參數:

endpoint_mode:訪問集羣服務的方式。3.2版本開始引入的配置。用於指定服務發現,以方便外部的客戶端連接到swarm

 

vip:默認的方案。即通過 Docker 集羣服務一個對外的虛擬 ip對外暴露服務,所有的請求都會通過這個虛擬 ip 到達集羣服務內部的機器,客戶端無法察覺有多少個節點提供服務,也不知道實際提供服務的IP和端口。

dnsrr:DNS的輪詢調度。所有的請求會自動輪詢獲取到集羣 ip 列表中的一個 ip 地址。客戶端訪問的時候,Docker集羣會通過DNS列表返回對應的服務一系列IP地址,客戶連接其中的一個。這種方式通常用於使用自己的負載均衡器,或者window和linux的混合應用。

labels:在服務上設置標籤,並非附加在service中的容器上。如果在容器上設置標籤,則在deploy之外定義labels。可以用容器上的 labels(跟 deploy 同級的配置) 覆蓋 deploy 下的 labels。

 

mode:用於指定是以副本模式(默認)啓動還是全局模式

  • replicated:副本模式,複製指定服務到集羣的機器上。默認。
  • global:全局模式,服務將部署至集羣的每個節點。類似於k8s中的DaemonSet,會在每個節點上啓動且只啓動一個服務。

replicas:用於指定副本數,只有mode爲副本模式的時候生效。

placement:主要用於指定約束和偏好。這個參數在運維的時候尤爲關鍵

 

  • constraints(約束):表示服務可以部署在符合約束條件的節點上,包含了:

node attribute matches example

Home | NODE.ID 節點id Home | NODE.ID == 2ivku8v2gvtg4

node.hostname 節點主機名 node.hostname != node-2

node.role 節點角色 (manager/worker node.role == manager

node.platform.os 節點操作系統 node.platform.os == windows

node.platform.arch 節點架構 node.platform.arch == x86_64

node.labels 用戶定義的labels node.labels.security == high

engine.labels Docker 引擎的 labels engine.labels.operatingsystem == ubuntu-14.04

 

preferences(偏好):表示服務可以均勻分佈在指定的標籤下。

preferences 只有一個參數,就是spread,其參數值爲節點的屬性,即約束表中的內容

例如:node.labels.zone這個標籤在集羣中有三個值,分別爲west、east、north,那麼服務中的副本將會等分爲三份,分佈到帶有三個標籤的節點上。

 

max_replicas_per_node:3.8版本中開始引入的配置。控制每個節點上最多的副本數。

注意:當 最大副本數*集羣中可部署服務的節點數<副本數,會報錯

resources:用於限制服務的資源,這個參數在運維的時候尤爲關鍵。

示例:配置 redis 集羣運行需要的 cpu 的百分比 和 內存的佔用。避免佔用資源過高出現異常。

  • limit:用於限制最大的資源使用數量
cpus:cpu佔比,值的格式爲百分比的小數格式
memory:內存的大小。示例:512M
  • reservation:爲最低的資源佔用量。
cpus
memory
  • restart_policy:容器的重啓策略
condition:重啓的條件。可選 none,on-failure 或者 any。默認值:any
delay:嘗試重啓的時間間隔(默認值:5s)。
max_attempts:最大嘗試重啓容器的次數,超出次數,則不再嘗試(默認值:一直重試)。
window:判斷重啓是否成功之前的等待時間(一個總的時間,如果超過這個時間還沒有成功,則不再重啓)。
  • rollback_config:更新失敗時的回滾服務的策略。3.7版本加入。和升級策略相關參數基本一致。
  • update_config:配置應如何更新服務,對於配置滾動更新很有用。
parallelism:同時升級[回滾]的容器數
delay:升級[回滾]一組容器的時間間隔
failure_action:若更新[回滾]失敗之後的策略:continue、 pause、rollback(僅在update_config中有) 。默認 pause
monitor:容器升級[回滾]之後,檢測失敗的時間檢測 (支持的單位:ns|us|ms|s|m|h)。默認爲 5s
max_failure_ratio:最大失敗率
order:升級[回滾]期間的操作順序。可選:stop-first(串行回滾,先停止舊的)、start-first(並行回滾,先啓動新的)。默認 stop-first 。注意:只支持v3.4及更高版本

 

compose.yml 文件示例

version: "3"		# 版本號,deploy功能是3版本及以上纔有的
services:			# 服務,每個服務對應配置相同的一個或者多個docker容器
  redis:			# 服務名,自取
    image: redis:alpine		# 創建該服務所基於的鏡像。使用stack部署,只能基於鏡像
    ports: 			# 容器內外的端口映射情況
      - "1883:1883"
      - "9001:9001"
    networks:		# 替代了命令行模式的--link選項
      - fiware
    volumes: 		# 容器內外數據傳輸的對應地址
      - "/srv/mqtt/config:/mqtt/config:ro"
      - "/srv/mqtt/log:/mqtt/log"
      - "/srv/mqtt/data/:/mqtt/data/"
    command: -dbhost stack_mongo # 命令行模式中跟在最後的參數,此條沒有固定的格式,建議參照所部署的docker鏡像的說明文檔來確定是否需要該項、需要寫什麼
    deploy:
      mode: replicated
      replicas: 6			# replicas模式, 副本數目爲1
      endpoint_mode: vip
      labels: 
        description: "This redis service label"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      placement:
        constraints:
          - "node.role==worker"		# 部署位置,只在工作節點部署
          - "engine.labels.operatingsystem==ubuntu 18.04"
        preferences:
          - spread: node.labels.zone
      update_config:
        parallelism: 2
        delay: 10s
        order: stop-first

networks:		 # 定義部署該項目所需要的網絡
  fiware:

 

 

stack 常用命令

docker stack:編排部署應用

# 部署一個新的stack(堆棧)或更新現有的stack。別名:deploy, up
docker stack deploy [OPTIONS] 自定義STACK名稱
# 選項:
-c, --compose-file strings		# Compose文件的路徑,或從標準輸入中讀取的“-”
--prune						# 表示削減不再引用的服務。可以把一些down掉的service進行自動清理。
--orchestrator string		# 指定編排模式 (swarm|kubernetes|all)
--resolve-image	string		# 請求倉庫來重新解析鏡像的摘要和支持的平臺。("always"|"changed"|"never") (默認 "always")
--with-registry-auth		# 發送倉庫的授權詳情到Swarm代理
--orchestrator				# 使用的容器編排服務

# 通過compose.yml文件指令部署
docker stack deploy -c 文件名.yml 自定義STACK名稱

# 列出現有堆棧。別名:ls, list
docker stack ls [OPTIONS]

# 列出堆棧中的任務
docker stack ps [OPTIONS] STACK
# 選項:
--no-trunc		# 輸出完整信息

# 刪除一個或多個堆棧。別名:rm, remove, down
docker stack rm [OPTIONS] STACK [STACK...]
# 選項
	--orchestrator string   # 指定適配器 (swarm|kubernetes|all)

# 列出堆棧中的服務
docker stack services [OPTIONS] STACK
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章