1. 程式人生 > 實用技巧 >Docker 深入學習

Docker 深入學習

date: 2020-11-30 15:23:00
updated: 2020-12-07 15:35:00

Docker 深入學習

官方幫助文件

1. 命令

$ docker --help
用法:  docker COMMAND                                                                                                             
A self-sufficient runtime for containers                                                                                           
選項:                                                                                                                           
      --config string      Location of client config files (default                                                                
                           "C:\\Users\\junchow\\.docker")                                                                          
  -D, --debug              開啟debug模式
  -H, --host list          Daemon socket(s) to connect to                                                                          
  -l, --log-level string   設定日誌級別,級別分為debug|info|warn|error|fatal,預設為info。                                                                             
      --tls                Use TLS; implied by --tlsverify                                                                         
      --tlscacert string   Trust certs signed only by this CA (default                                                             
                           "C:\\Users\\junchow\\.docker\\machine\\machines\\default\\ca.pem")                                      
      --tlscert string     Path to TLS certificate file (default                                                                   
                           "C:\\Users\\junchow\\.docker\\machine\\machines\\default\\cert.pem")                                    
      --tlskey string      Path to TLS key file (default                                                                           
                           "C:\\Users\\junchow\\.docker\\machine\\machines\\default\\key.pem")                                     
      --tlsverify          Use TLS and verify the remote (default true)                                                            
  -v, --version            終端列印顯示版本資訊並退出                                                                                                                                   
管理命令:                                                                                                               
  config      管理Docker配置
  container   管理容器                                                                                                    
  image       管理映象
  network     管理網路
  node        管理Swarm節點
  plugin      管理外掛
  secret      管理Docker安全
  service     管理服務
  swarm       管理Swarm叢集
  system      管理Docker系統
  trust       Manage trust on Docker images                                                                                        
  volume      管理卷
                                                                                                                                   
命令:                                                                                                                          
  attach      將標準輸入和標準輸出連線到正在執行的容器                                        
  build       使用dockerfile檔案建立映象                                                                                     
  commit      從容器的修改項中建立新的映象
  cp          將容器的目錄或檔案複製到本地檔案系統中
  create      建立一個新的映象
  diff        檢查容器檔案系統的修改
  events      實時輸出docker伺服器中發生的事件
  exec        從外部執行容器內部的命令
  export      將容器的檔案系統到處為tat檔案包
  history     顯示映象的歷史
  images      輸出映象列表
  import      從壓縮為tar檔案的檔案系統中建立映象
  info        顯示當前系統資訊、docker容器與映象個數、設定資訊等
  inspect     使用JSON格式顯示容器與映象的詳細資訊
  kill        向容器傳送kill訊號關閉容器
  load        從tar檔案或標準輸入中載入映象
  login       登入docker註冊伺服器
  logout      退出docker註冊伺服器
  logs        輸出容器日誌資訊
  pause       暫停容器中正在執行的所有程序
  port        檢視容器的埠是否處於開放狀態
  ps          輸出容器列表
  pull        從註冊伺服器中拉取一個映象或倉庫
  push        將映象推送到docker註冊伺服器
  rename      重新命名一個容器
  restart     重啟一個或多個容器
  rm          刪除一個或多個容器,若沒有指定標籤則刪除lastest標籤。
  rmi         刪除一個或多個映象,若沒有指定標籤則刪除lastest標籤。                                                
  run         在一個新容器中中執行命令,用於指定映象建立容器。
  save        將一個或多個映象儲存為tar包             
  search      從Docker Hub中搜索映象
  start       啟動一個或多個已經停止的容器
  stats       檢視各個容器佔用記憶體、CPU的情況                                                     
  stop        停止一個或多個正在執行的容器
  tag         設定映象標籤
  top         顯示容器中正在執行的程序資訊
  unpause     重啟pause命令暫停的容器
  update      更新一個或多個容器的配置
  version     顯示docker版本資訊
  wait        等待容器終止然後輸出退出碼
Run 'docker COMMAND --help' for more information on a command.                                                                     

1.1 映象命令

docker images   # 查詢本機上所有的映象

# 可選項
-a 顯示全部
-q 只顯示映象ID
docker search 映象名

# 可選項
-f=stars=3000  # 搜尋STARS大於3000的
docker pull 映象名[:tag]

針對不同版本,如果有一樣的映象檔案,就不需要重複下載了
docker imi -f 映象id                   # 刪除指定映象
docker imi -f 映象id 映象id 映象id      # 刪除多個映象
docker imi -f $(docker images -q)     # 把$裡面當成引數傳遞進去,獲取所有的映象id,然後全部刪除

1.2 容器命令

docker run [可選引數] image

# 引數說明
--name="Name"   容器名字,用來區分容器
-d              後臺方式執行
-i -t           使用互動方式執行,進入容器檢視內容
-p              指定容器的埠 -p 8080:8000
    -p 主機埠:容器埠  # 進行對映
    -p 容器埠
-P              隨機指定埠
docker ps # 列出所有正在執行的容器

# 可選項
-a      # 列出所有容器
-n=?    # 列出前n個容器
-q      # 只顯示容器ID
exit 退出容器並停止
ctrl+P+Q 大寫模式下,退出容器且不停止
dcoker rm 容器ID
docker rm -f $(docker ps -q) 刪除所有的容器ID
docker start 容器ID
docker restart 容器ID
docker stop 容器ID
docker kill 容器ID   # 強制停止容器

1.3 常用其他命令

通過 docker run -d 映象名 來啟動,然後通過 docker ps 會發現容器停止了

=> docker 容器使用後臺執行,就必須要有一個前臺程序,docker 發現沒有應用,就會自動停止
eg:nginx 容器啟動後發現沒有提供服務就會自動停止

docker logs     # 檢視日誌

# 可選項
-t  # 時間戳
-f  # 持續輸出日誌
    --tail number   # 顯示最後的number條日誌
docker top 容器ID   # 檢視容器中的程序資訊,其中pid是程序id,ppid是父程序id
docker inspect 容器ID/映象ID   # 檢視容器/映象元資料,在下面有一個 layers 裡面是映象檔案的每一層檔案
很多容器都是後臺執行,需要進入容器,修改一些配置

方式一:
docker exec -it 容器ID /bin/bash    # 以命令列的方式來進行互動
# 進入容器後會開啟一個新的終端,可以在終端裡操作

方式二:
docker attach 容器ID    # 會進入到正在執行的終端,不會啟動新的程序
docker cp 容器ID:容器內的路徑 主機路徑  # 將容器中的檔案拷貝到主機中

1.4 測試安裝tomcat

docker pull tomcat
docker run -d -p 主機埠:8080 --name tomcat01 tomcat

訪問主機埠,發現404
docker exec -it tomcat01 /bin/bash
進入到webapps資料夾下面,發現是空的,原因是官方映象刪減了很多功能,只留下了能執行的最基本的功能
解決方法:可以把 webapps.dist 下面的內容複製到 webapps 資料夾下即可
但是這樣的解決方法又太麻煩了,不能每次上線都進入容器部署 => 資料卷

1.5 測試安裝ES

docker stats    # 檢視各個容器佔用記憶體、CPU的情況
∵ es非常耗記憶體 ∴ 可以修改配置檔案,來增加記憶體的限制,-e 設定最小記憶體和最大記憶體

docker run -d --name elasticserch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xms512m" elasticsearch:7.6.2

2. 視覺化 portainer

一個視覺化管理方案,直接用docker來安裝即可,做好主機埠對映

3. 聯合檔案系統

映象是一種輕量級、可執行的獨立軟體包,包含某個軟體所需的所有內容,包括程式碼、執行時、庫、環境變數和配置檔案。

UFS(UnionFS) 聯合檔案系統,是一種分層、輕量級並且高效能的檔案系統,支援對檔案系統的修改作為一次提交來一層層的疊加。類似於Git版本控制,每一次提交(操作)都記為一層。如果連個軟體有共用的某一層檔案,比如都基於linux,那麼都可以去掛在這一層的linux的檔案,就可以複用。

ufs裡面包含比如

  • bootfs: 包含bootloader和kernel,bootloader主要是引導載入kernal,類似於啟動系統的時候會有一個載入過程,當系統啟動後,這個載入的程式就可以關閉了 => 載入的這部分就是可以複用的部分
  • rootfs: 在bootfs之上,包含的就是典型的linux系統的 /dev, /proc, /bin, /etc 等標準目錄和檔案 => 比如linux的容器,佔的記憶體很小,是因為映象檔案只需要包含rootfs裡最基本的命令、工具即可,可以使用主機的kernel,這樣的話可以提高效率

所有的映象都起始於一個基礎映象層,當進行修改或增加新的內容的時候,就會在當前映象層之上,建立一個新的映象層

映象都是隻讀的,當容器啟動時,一個新的可寫層(容器層)就會載入到映象層的頂部

通過 commit 來將容器層和映象層進行合併打包,變成一個新的映象檔案

docker commit -m="提交的描述資訊" -a="作者" 容器ID 目標映象名[:tag]

5. 資料卷

  1. 每次修改配置檔案都需要進入到容器很麻煩
  2. 資料不應該放在容器中,否則刪除容器,資料就丟失了

=> 在容器外部提供一個對映路徑,類似於資料共享技術,通過卷技術,也就是目錄的掛載,將容器內的目錄,掛在到linux上面,來實現容器資料的持久化和同步操作,容器之間也可以資料共享。

容器裡面的目錄就像是快捷方式,宿主機的檔案才是真實的

實現方式:

  1. 直接使用命令來掛載 -v
docker run -it -v 主機目錄:容器內目錄 映象名 /bin/bash

docker run --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -p 3310:3306 -v testconf2:/etc/mysql/conf.d -v /Users/mxxct/mysqldata:/var/lib/mysql -d mysql:5.7

通過 docker inspect 容器ID 檢視元資料,在 Mounts 裡可以看到掛載的詳細資訊

  • 匿名掛載
    不指定主機名,直接寫容器內目錄 -v 容器內目錄
  • 具名掛載
    也可以分為兩種
    • 指定主機目錄 -v 主機目錄:容器內目錄
    • 不指定主機目錄,只是寫一個名字 -v xxx:容器內目錄 這時候會預設對映到主機 /var/lib/docker/volumes/xxx/_data 這個資料夾下面(在MacOS下面沒找到這個路徑)
docker volume ls    # 檢視所有的卷
docker volume inspect 卷名字    # 檢視具體資料卷的資訊,這裡卷名字是指具名掛載的那個名字

可以在容器內目錄後面新增許可權控制
eg: -v 主機目錄:容器內目錄:ro/rw
ro readonly; rw readwrite 預設是rw,如果是ro就表示這個路徑只能從主機上來操作,容器內只是讀許可權

  1. 通過 DockerFile 在構建映象是指定 VOLUME

這裡是一個匿名掛載

FROM centos
VOLUME ["vol1", "vol2"]
CMD echo "---- end ----"
CMD /bin/bash

直接建立檔案然後執行 docker build 可能會提示 error checking context:can't stat xxx 錯誤,這個提示基本是許可權不夠外加目錄結構不對
解決:

mkdir dockerfile
chmod 777 dockerfile
touch file1
vi file1
docker build -f /Users/mxxct/dockerfile/file1 -t test/centos:1.0 .

(base) localhost:dockerfile mxxct$ docker build -f /Users/mxxct/dockerfile/file1 -t test/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
 ---> 0d120b6ccaa8
Step 2/4 : VOLUME ["vol1", "vol2"]
 ---> Running in 7cc3997837d7
Removing intermediate container 7cc3997837d7
 ---> b55d348b6981
Step 3/4 : CMD echo "---- end ----"
 ---> Running in 083ad85879af
Removing intermediate container 083ad85879af
 ---> 11c45d147425
Step 4/4 : CMD /bin/bash
 ---> Running in e7d39262c201
Removing intermediate container e7d39262c201
 ---> ee8398f6597c
Successfully built ee8398f6597c
Successfully tagged test/centos:1.0

建立好映象後,執行

docker run -it ee8398f6597c /bin/bash

[root@2adb0cbdc19f /]# ls -l
total 56
lrwxrwxrwx   1 root root    7 May 11  2019 bin -> usr/bin
drwxr-xr-x   5 root root  360 Dec  1 06:23 dev
drwxr-xr-x   1 root root 4096 Dec  1 06:23 etc
drwxr-xr-x   2 root root 4096 May 11  2019 home
lrwxrwxrwx   1 root root    7 May 11  2019 lib -> usr/lib
lrwxrwxrwx   1 root root    9 May 11  2019 lib64 -> usr/lib64
drwx------   2 root root 4096 Aug  9 21:40 lost+found
drwxr-xr-x   2 root root 4096 May 11  2019 media
drwxr-xr-x   2 root root 4096 May 11  2019 mnt
drwxr-xr-x   2 root root 4096 May 11  2019 opt
dr-xr-xr-x 159 root root    0 Dec  1 06:23 proc
dr-xr-x---   2 root root 4096 Aug  9 21:40 root
drwxr-xr-x  11 root root 4096 Aug  9 21:40 run
lrwxrwxrwx   1 root root    8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 May 11  2019 srv
dr-xr-xr-x  12 root root    0 Dec  1 06:23 sys
drwxrwxrwt   7 root root 4096 Aug  9 21:40 tmp
drwxr-xr-x  12 root root 4096 Aug  9 21:40 usr
drwxr-xr-x  20 root root 4096 Aug  9 21:40 var
drwxr-xr-x   2 root root 4096 Dec  1 06:23 vol1
drwxr-xr-x   2 root root 4096 Dec  1 06:23 vol2

這裡有 vol1 和 vol2 兩個目錄,然後去檢視容器的元資料資訊,會發現在 Mounts 這裡已經把兩個卷給掛在出去了

"Mounts": [
    {
        "Type": "volume",
        "Name": "baeff06c4bf78f14c8135dbdc5ae238bb513cf8375af699b47c602d3e3a0a529",
        "Source": "/var/lib/docker/volumes/baeff06c4bf78f14c8135dbdc5ae238bb513cf8375af699b47c602d3e3a0a529/_data",
        "Destination": "vol1",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "volume",
        "Name": "4cbbd6edd2093b5098b6d9994bc380c992445842c1b19a942816b090a8841e13",
        "Source": "/var/lib/docker/volumes/4cbbd6edd2093b5098b6d9994bc380c992445842c1b19a942816b090a8841e13/_data",
        "Destination": "vol2",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

6. 資料卷容器

容器資料卷是容器實現資料持久化的一種機制,資料卷容器是一種特殊的容器
這個主要是通過類似,用於容器間的資料同步,不是容器和主機之間。

docker run -it --name docker01 imageID
docker run -it --name docker02 --volumes-from docker01 imageID

docker01中有掛載的資料夾
通過 --volumes-from 讓docker02繼承docker01的掛載資料夾,此時docker01掛載出去的資料夾裡的資料的任何修改在docker02也可以看到,同時在docker02上做的修改docker01也可以看到。docker01就是資料卷容器。

刪除docker01的話,掛載的資料夾資料依然存在,本質是因為他們都掛載到主機的目錄下,只要主機對應目錄存在,資料就不會丟失
docker01相當於對映主機資料目錄的地址(想成一個快捷方式),docker02拿到這個對映地址(快捷方式),放到自己的mount裡面

7. DockerFile

通過 docker history imageID 可以檢視一個映象的構建過程

基礎知識

  1. 每個關鍵字指令都必須是大寫
  2. 按順序從上到下執行
  3. # 是註釋
  4. 每一個指令都會建立並提交一個新的映象層。(docker run之後會建立一個可寫容器)

指令說明

FROM        # 指定基礎映象
MAINtAINER  # 指定維護者資訊,姓名+郵箱
RUN         # 映象構建的時候需要執行的命令
ADD         # 新增內容,會自動解壓,比如tomcat壓縮包
WORKDIR     # 映象的工作目錄
VOLUME      # 設定卷,掛載主機目錄
EXPOSE      # 指定暴露的埠,或者通過 -p 指定
CMD         # 指定容器啟動時要執行的命令,只有最後一個會生效,可被替代 
ENTRYPOINT  # 指定容器啟動時要執行的命令,可以追加命令
ONBUILD     # 當構建一個被繼承 DockerFile 這個時候會執行ONBUILD的指令,觸發指令
COPY        # 類似ADD,將檔案拷貝到映象中
ENV         # 構建的時候設定環境變數

CMD ["ls", "-a"] 這時候的命令相當於 "ls -a"。只有當執行 docker run imageID 的時候才會執行最後一個CMD的命令。(docker run -it imageID這時候是通過命令列互動,所以不會執行CMD)

如果執行 docker run imageID -l 想執行 ls -al 命令會報錯,即CMD命令會被替代,不會追加。
換成 ENTRYPOINT 再執行 docker run imageID -l 就可以執行 ls -al

COPY 主機路徑/readme.txt 容器內路徑
ADD 主機路徑/xxxx.tar 容器內路徑    # ADD新增的檔案會自動解壓

RUN yum -y install vim

ENV MYPATH /user/local
WORKDIR $MYPATH

ENV JAVA_HOME /user/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /user/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /user/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /user/local/apache-tomcat-9.0.22/bin/startup.sh && tail -f /user/local/apache-tomcat-9.0.22/bin/logs/catalinas.out

8. Docker 網路

每次啟動一個程式,Linux 就會相應建立一個新的網絡卡地址 => veth-pair 一對虛擬裝置介面,一端連著協議,一端彼此相連 => 每啟動一個容器,docker會建立一對網絡卡連線地址,一端在主機,一端在容器

Linux 虛擬網路設別 veth-pair。三個經典實驗,直接相連、通過 Bridge 相連和通過 OVS 相連

兩個docker容器進行通訊,需要先走到docker0,也就是類似於docker的路由器,通過廣播或註冊的方式,路由器會知道下一個容器的網路地址,然後轉發請求連線。Docker0就相當於一個網橋的角色。

docker run --link 通過link可以將兩個容器網路連線起來,但是這是單向的,A link B, 只是A可以連線B,想B連線A的話還需要再配置B
link 操作相當於在容器內的 hosts 檔案中寫進去對映關係

不推薦 --link。因為 link 用的是 docker0,而docker0不支援容器名稱對映,只能寫死ip,如果牽扯到ip遷移,就需要重新配置一遍

docker network ls   # 檢視所有的docker網路

網路模式

  • bridge: 橋接(docker預設)
    docker run --net bridge     # 不寫的話也預設有這個bridge
    
  • none:不配置
  • host:和主機共享網路
  • container:容器網路連通(用得少,侷限很大)

自定義建立網路

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

建立的容器基於各自不同的網路,可以保證同一類容器使用的是自己的網路ip。但是如果是兩類容器想互相連線呢?網路打通。

docker network connect [option] container network   # 將一個容器連線到一個閘道器上,相當於一個容器兩個ip地址。

9. Docker Compose

目的:定義執行多個容器,避免一個個的運維容器
步驟:

  1. DockerFile
  2. docker-compose.yml
  3. run docker-compose up

配置項裡有一個 deploy.replicas 可以設定副本,叢集部署的時候使用這個引數

單機

10. Docker Swam

相當於是搭建一個小叢集,有manager有worker。

叢集

docker swarm init		# 初始化節點
docker swarm join-token manager		# 加入一個節點,並將該節點作為manager
docker swarm join-token worker		# 加入一個節點,並將該節點作為worker

11. Raft 協議

拜占庭將軍問題:很久很久以前,拜占庭是東羅馬帝國的首都。那個時候羅馬帝國國土遼闊,為了防禦目的,因此每個軍隊都分隔很遠,將軍與將軍之間只能靠信使傳遞訊息。在打仗的時候,拜占庭軍隊內所有將軍必需達成一致的共識,才能更好地贏得勝利。但是,在軍隊內有可能存有叛徒,擾亂將軍們的決定。這時候,在已知有成員不可靠的情況下,其餘忠誠的將軍需要在不受叛徒或間諜的影響下達成一致的協議。萊斯利·蘭伯特( Leslie Lamport )通過這個比喻,表達了計算機網路中所存在的一致性問題。這個問題被稱為拜占庭將軍問題。

二將軍問題:白軍駐紮在溝渠裡,藍軍則分散在溝渠兩邊。白軍比任何一支藍軍都更為強大,但是藍軍若能同時合力進攻則能夠打敗白軍。他們不能夠遠端的溝通,只能派遣通訊兵穿過溝渠去通知對方藍軍協商進攻時間。是否存在一個能使藍軍必勝的通訊協議,這就是兩將軍問題。

二將軍問題探討的是不可靠通道下兩方的通訊準確性問題,而拜占庭將軍問題探討的是多方通訊結果一致性和決策正確性的問題。
準確性是指傳送的是什麼,接收的就是什麼;一致性是在節點更多的情況下的準確性;正確性是無論收到的通訊結果是否有干擾(不完全滿足一致性),正常工作的節點能夠做出正確的決策。

=> 二將軍問題可以通過TCP3次握手來解決;拜占庭將軍問題可以通過Raft/Paxos(谷哥Chubby)/ZAB(zookeeper)/PBFT(區塊鏈)幾種演算法解決。另外 PS:raft,zab,paxos解決的是節點故障問題,而非拜占庭問題(節點故意欺騙)。PBFT解決了拜占庭問題。

Raft協議

Raft 協議的具體流程:

  1. 在最初,還沒有一個主節點的時候,所有節點的身份都是Follower。每一個節點都有自己的計時器,當計時達到了超時時間(Election Timeout),該節點會轉變為Candidate。
  2. 成為Candidate的節點,會首先給自己投票,然後向叢集中其他所有的節點發起請求,要求大家都給自己投票。
  3. 其他收到投票請求且還未投票的Follower節點會向發起者投票,發起者收到反饋通知後,票數增加。
  4. 當得票數超過了叢集節點數量的一半,該節點晉升為Leader節點。Leader節點會立刻向其他節點發出通知,告訴大家自己才是老大。收到通知的節點全部變為Follower,並且各自的計時器清零。

這裡需要說明一點,每個節點的超時時間都是不一樣的。比如A節點的超時時間是3秒,B節點的超時時間是5秒,C節點的超時時間是4秒。這樣一來,A節點將會最先發起投票請求,而不是所有節點同時發起。為什麼這樣設計呢?設想如果所有節點同時發起投票,必然會導致大家的票數差不多,形成僵局,誰也當不成老大。

那麼,成為Leader的節點是否就坐穩了老大的位置呢?並不是。Leader節點需要每隔一段時間向叢集其他節點發送心跳通知,表明你們的老大還活著。一旦Leader節點掛掉,發不出通知,那麼計時達到了超時時間的Follower節點會轉變為Candidate節點,發起選主投票,周而復始......

資料同步的流程:

  1. 由客戶端提交資料到Leader節點
  2. 由Leader節點把資料複製到叢集內所有的Follower節點。如果一次複製失敗,會不斷進行重試
  3. Follower節點們接收到複製的資料,會反饋給Leader節點
  4. 如果Leader節點接收到超過半數的Follower反饋,表明複製成功。於是提交自己的資料,並通知客戶端資料提交成功。
  5. 由Leader節點通知叢集內所有的Follower節點提交資料,從而完成資料同步流程。

ZAB協議

12. 容器服務

docker service create -p ip:埠 --name my-service xxx
# 和 docker run 的區別是,run是容器啟動,不具備擴縮容的概念;service是服務啟動,可以自動擴縮容

docker service ps my-service	# 檢視服務程序
docker service ls		# 檢視服務列表,這裡有一個 replicas,表示當前服務的副本
docker servie update --replicas N my-service	# 將 my-service 自動擴容到 N 個副本
docker service scale my-service=N		# 將 my-service 自動擴容到 N 個副本

有一個 --mode 引數,預設是 replicated,可以改成 global
replicated 只能在worker節點中執行,global的話manager節點也可以執行

灰度釋出:金絲雀釋出

命令 -> manager節點呼叫api -> schedule api -> worker節點建立並維護容器服務

映象使用的os版本不統一,比如Linux基於的os不一樣,版本不一樣,命令缺失,閹割版和增肥版都不統一,資料檔案可能都修改了位置等等