1. 程式人生 > 其它 >Docker容器與守護程序運維管理

Docker容器與守護程序運維管理

一、Docker容器配置進階

1、容器的自動重啟

Docker提供重啟策略控制容器退出時或Docker重啟時是否自動啟動該容器。
使用 --restart 選項指定重啟策略。

[root@localhost ~]# docker run --help
      --restart string                 Restart policy to apply when a container exits (default "no")

作用:容器自動重啟;重啟策略能夠確保關聯的多個容器按照正確的順序啟動。

使用重啟策略時的注意事項:

  1. 重啟策略只在容器成功啟動後才會生效。(容器執行後生效)
  2. 如果手動停止一個容器,那麼它的重啟策略會被忽略,直到Docker守護程序重啟或容器手動重啟。(手動停止,暫停重啟策略)
  3. Docker Swarm服務的重啟策略採用不同的配置方式。(叢集採用不同的重啟策略)
  4. 重啟策略不同於dockerd命令的--live-restore選項,這個選項可使Docker升級中,即使網路和使用者輸入都終端,容器依然保持執行。
  5. Docker建議使用重啟策略,並避免使用程序管理器啟動容器:(1)同時使用兩者會產生衝突;(2)程序管理器依賴於作業系統,Docker無法監控。

2、在Docker停止時保持容器繼續執行

預設情況下,Docker守護程序終止時,正在執行的容器會關閉。

實時恢復(Live Restore):管理員配置守護程序,讓容器在守護程序不可用時依然執行。

實時恢復的作用:減少因Docker守護程序崩潰、計劃停機或升級導致的容器停機時間。

(1)啟用實時恢復功能

第一種方式是在Docker守護程序配置檔案中設定:

[root@localhost ~]# vi /etc/docker/daemon.json 
{
  "live-restore":true
}

# 配置生效方法一:
# 修改配置後重啟守護程序生效
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker

# 配置生效方法二:
# 重新載入Docker守護程序,避免容器停止
[root@localhost ~]# systemctl reload docker

# 測試
# 1.啟動兩個容器
[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS          PORTS     NAMES
1dd65fa55b80   top                "/bin/sh -c 'exec to…"   5 weeks ago   Up 38 seconds             test_exec_entry
52a7de98ccc7   test_shell_entry   "/bin/sh -c 'top -b'"    5 weeks ago   Up 52 seconds             test

# 2.停止docker守護程序
[root@localhost ~]# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
  docker.socket

[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Wed 2022-05-11 00:23:16 CST; 8s ago
     Docs: https://docs.docker.com
  Process: 1697 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
  Process: 1853 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/SUCCESS)
 Main PID: 1853 (code=exited, status=0/SUCCESS)

# 3.檢視容器是否依然執行
[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS              PORTS     NAMES
1dd65fa55b80   top                "/bin/sh -c 'exec to…"   5 weeks ago   Up About a minute             test_exec_entry
52a7de98ccc7   test_shell_entry   "/bin/sh -c 'top -b'"    5 weeks ago   Up 2 minutes                  test

另一種恢復方式:在手動啟動dockerd程序時指定--live-restore選項。
不建議使用這種方式,因為不會設定systemd或其他程序管理器的環境,會導致意外發生。

(2)升級期間的實時恢復

實時恢復功能支援Docker守護程序在升級期間保持容器的執行。

存在的問題:

  1. 只支援Docker 補丁版本升級,不支援主要版本和次要版本的升級。
  2. 升級過程中跳過版本,守護程序可能無法恢復其與容器的連線。

(3)重啟時的實時恢復

限定條件:只有Docker守護程序選項未發生變化,實時恢復才能恢復容器。

(4)實時恢復功能對執行容器的影響

守護程序停止,正在執行的容器可能會填滿守護程序通常讀取的FIFO日誌,組織容器記錄更多日誌資料。

緩衝區填滿,必須重新啟動Docker守護程序來重新整理。
可以更改/proc/sys/fs/pipe-max=size來修改核心的緩衝區大小。

[root@localhost ~]# cat /proc/sys/fs/pipe-max-size 
1048576

3.一個容器中執行多個服務

注意:一個容器可以有多個程序,但為了高效利用Docker,不要讓一個容器負責整個應用程式的多個方面,而要通過使用者定義網路和共享卷連線多個容器來實現應用程式的多個方面。

容器的主程序複製管理它啟動的所有程序。

解決子程序回收:--init選項可以將一個精簡的初始化程序作為主程序插入容器,並在容器退出時回收所有的程序。

解決多程序啟停最好方式:設定一個上層的程序統一處理這些程序的生命週期(sysinit\upstart\systemd)

在一個容器執行多個服務的方式:

  1. 將所有命令放入包裝器指令碼中,並提供測試和除錯資訊,使用CMD指令執行包裝器指令碼。
  2. 如果有一個主程序需要首先啟動並保持執行,但是臨時需要執行一些其他程序(可能與主程序互動),可以使用bash指令碼的作業控制實現。
  3. 在容器中使用supervisord等程序管理器。

4、容器健康檢查機制

程序級的健康檢查:最簡單的,檢驗程序是否執行。重啟策略可以根據檢查情況重啟已停止的容器。這個檢查不足:無法發現應用程式問題。

Docker提供了健康檢查機制,可以通過Dockerfile檔案在映象中注入,也可以在啟動容器時通過相應選項實現。

(1)在Dockerfile中使用HEALTHCHECK指令

可以在Dockerfile中使用HEALTHCHECK指令宣告健康檢測配置,用於判斷容器主程序的服務狀態是否正常,反映容器的實際健康狀態。

Dockerfile構建映象時,加入了HEALTHCHECK指令,基於這樣映象啟動的容器,就具備了健康狀態檢查能力,能自動進行健康檢查。

Dockerfile中,只能出現一次HEALTHCHECK指令,出現多次,僅最後一次生效。

一旦有一次健康檢查成功,Docker就會確認容器為健康狀態。

HEALTHCHECK指令格式:

  1. 設定檢查容器健康狀況的命令
HEALTHCHECK [選項] CMD <命令> 

# 選項:
    --interval:設定容器執行後開始健康檢查的時間間隔,預設30s。
    --timeout:設定允許健康檢查命令允許的最長時間,預設30s。超時即失敗。
    --start-period:設定容器啟動的初始化時間。(啟動過程中的健康檢查失敗不報錯)
    --retries:設定允許連續重試的次數,預設3次。(連續檢查失敗後視為不健康)

# CMD指令後的命令:指定執行健康檢查的具體命令。可以使用shell格式或exec格式。

# 返回值:CMD指令後面的“命令” 執行完畢返回值表示容器的執行狀況。
    0:成功。容器是健康且可用的。
    1:失敗。容器不健康,不能正常工作。
    2:保留值。暫時不要使用。

# 案例:每5分鐘健康檢查一次,訪問web伺服器主頁,每次檢查3秒以內
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1       # || 表示上一條命令執行失敗後,才執行下一條命令,退出返回值為1,告訴docker健康檢查失敗
  1. 表示禁止從基礎映象繼承HEALTHCHECK指令設定
HEALTHCHECK NONE 

(2)啟動容器時通過相應選項實現健康檢查

可以在執行 docker rundocker create 命令啟動建立容器時指定容器的健康檢查策略。

[root@localhost ~]# docker run --help
      --health-cmd string              Command to run to check health                                      # 指定和執行健康檢查
      --health-interval duration       Time between running the check (ms|s|m|h) (default 0s)              # 設定容器執行後開始健康檢查的時間間隔(單位:ms/s/m/h),預設是0s
      --health-retries int             Consecutive failures needed to report unhealthy                     # 設定連續失敗需要報告的次數
      --health-start-period duration   Start period for the container to initialize before starting        # 設定容器啟動的初始化時間(單位:ms/s/m/h),預設是0s
                                       health-retries countdown (ms|s|m|h) (default 0s)
      --health-timeout duration        Maximum time to allow one check to run (ms|s|m|h) (default 0s)      # 設定允許健康檢查命令允許的最長時間(單位:ms/s/m/h),預設是0s
      --no-healthcheck                 Disable any container-specified HEALTHCHECK                         # 禁用容器健康檢查指令

5、執行時選項覆蓋Dockerfile指令

Dockerfile中的FROMMAINTAINERRUNADD這四個指令在執行時是不能被覆蓋的,其他的指令在執行docker run(或docker create)命令時都會被相應地覆蓋。

從映象執行一個容器時,可以指定一個新的命令來覆蓋Dockerfile的CMD指令。

如果映象的Dockerfile還聲明瞭ENTRYPOINT指令,則Dockerfile的CMD指令或容器執行時指定的命令均作為引數追加到ENTRYPOINT指令中。