開發人員過去面臨的挑戰之一是讓應用程序在多個計算環境中可靠地運行。 通常,應用程序沒有按預期運行或遇到錯誤並完全失敗。 這就是概念的所在 containers 出生於。

什麼是容器鏡像?

Container 圖像是帶有在隔離環境中運行的可執行代碼的靜態文件。 容器映像包括應用程序在不同環境中運行所需的系統庫、依賴項和其他平台設置。

Red Hat Linux 提供了一組有用的容器工具,您可以利用這些工具直接使用需要 docker 命令的 Linux 容器。 這些包括:

  • Podman – 這是一個用於運行和管理的無守護進程的容器引擎 OCI root 或無 root 模式下的容器。 Podman 類似於 Docker 並且具有相同的命令選項,除了 Docker 是一個守護進程。 您可以使用以下方式拉取、運行和管理容器鏡像 podman 與您使用的方式大致相同 Docker. Podman 帶有許多高級功能,完全集成 systems, 並提供用戶命名空間支持,其中包括運行容器而無需 root 用戶。
  • Skopeo:這是一個命令行工具,用於將容器映像從一個註冊表複製到另一個註冊表。 您可以使用 Skopeo 將圖像複製到特定主機或從特定主機複製圖像,以及將圖像複製到另一個容器註冊表或環境。 除了複製圖像之外,您還可以使用它來檢查來自各種註冊表的圖像,並使用簽名來創建和驗證圖像。
  • Buildah:這是一組用於創建和管理容器的命令行工具 OCI 圖像使用 Dockers。

在本文中,我們將重點介紹使用 podmanSkopeo.

從遠程註冊表中搜索容器鏡像

podman search 允許您在選定的遠程註冊表中搜索容器映像。 註冊表的默認列表在 registries.conf 位於 /etc/containers/.

註冊表由 3 個部分定義。

  • [registries.search] – 本節指定默認註冊表, podman 可以搜索容器鏡像。 它在 registry.access.redhat.com, registry.redhat.io,docker.io 註冊表。
默認註冊表
  • [registries.insecure]– 本節規定了不實施 TLS 加密的註冊表,即不安全的註冊表。 默認情況下,不指定任何條目。
不安全的註冊表
不安全的註冊表
  • [registries.block] – 這會阻止或拒絕從您的本地系統訪問指定的註冊表。 默認情況下,不指定任何條目。
阻止註冊表
阻止註冊表

作為常規(non-root) 用戶運行 podman 命令,您可以定義自己的 registries.conf 在您的主目錄上($HOME/.config/containers/registries.conf) 覆蓋系統範圍的設置。

指定註冊表時的規則

在指定註冊表時,請記住以下幾點:

  • 每個註冊表都應該用單引號引起來。
  • 可以使用主機名或 IP 地址指定註冊表。
  • 如果指定了多個註冊表,則它們應該用逗號分隔。
  • 如果註冊表使用非標準端口 – 端口 TCP 端口 443 表示安全,80 表示不安全 – 端口號應與註冊表名稱一起指定,例如 registry.example.com:5566.

要使用以下語法在註冊表中搜索容器映像:

# podman search registry/container_image

例如,要搜索一個 Redis 中的圖像 registry.redhat.io 註冊表,調用命令:

# podman search registry.redhat.io/redis
搜索容器鏡像的註冊表
搜索容器鏡像的註冊表

搜索一個 MariaDB 容器鏡像運行。

# podman search registry.redhat.io/mariadb
搜索 MariaDB 容器鏡像
搜索 MariaDB 容器鏡像

要獲取容器映像的詳細描述,請使用 –no-trunc 在您獲得的結果中的容器圖像名稱之前。 例如,我們將嘗試獲取 MariaDB 容器鏡像的詳細描述,如下所示:

# podman search --no-trunc registry.redhat.io/rhel8/mariadb-103
MariaDB 容器鏡像列表說明
MariaDB 容器鏡像列表說明

拉取容器鏡像

從遠程註冊表中提取或檢索容器映像要求您首先進行身份驗證,然後再進行其他任何操作。 例如,要檢索 MariaDB 容器鏡像,首先登錄 Redhat 註冊表:

# podman login

提供您的用戶名和密碼,然後點擊“ENTER‘ 在你的鍵盤上。 如果一切順利,您應該會收到一條確認消息,表明登錄註冊表已成功。

Login Succeeded!

現在,您可以使用顯示的語法拉取圖像:

# podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

<registry> 指在 TCP 上提供容器鏡像存儲庫的遠程主機或註冊表 <port>. 這 <namespace><name> 基於 <namespace> 在註冊表。 最後, <tag> 指定容器鏡像的版本。 如果沒有指定,則使用默認標籤——最新的。

始終建議添加受信任的註冊表,即那些提供加密並且不允許匿名用戶生成具有隨機名稱的帳戶的註冊表。

要拉取 MariaDB 映像,請運行以下命令:

# podman pull registry.redhat.io/rhel8/mariadb-103
  • <registry> –registry.redhat.io
  • <namespace> – rhel8
  • <name> – 瑪麗亞數據庫
  • <tag> – 103
拉取 MariaDB 鏡像
拉取 MariaDB 鏡像

對於後續的容器鏡像拉取,由於您已經通過身份驗證,因此無需進一步登錄。 拉一個 Redis 容器鏡像,只需運行:

# podman pull registry.redhat.io/rhscl/redis-5-rhel7
拉取 Redis 容器鏡像
拉取 Redis 容器鏡像

列出容器映像

完成拉取鏡像後,您可以通過運行 podman images 命令查看主機上當前存在的鏡像。

# podman images
列出容器映像
列出容器映像

檢查容器鏡像

在運行容器之前,探查圖像並了解它的作用始終是一個好主意。 這 podman inspect 打印出關於容器的大量元數據,例如操作系統和架構。

要檢查圖像,請運行 podman inspect 後跟圖像 ID 或存儲庫。

# podman inspect IMAGE ID
OR
# podman inspect REPOSITORY

在下面的示例中,我們正在檢查 MariaDB 容器。

# podman inspect registry.redhat.io/rhel8/mariadb-103
檢查 MariaDB 容器鏡像
檢查 MariaDB 容器鏡像

要為容器提取特定元數據,請通過 –format 後跟元數據和容器標識(圖像 ID 或名稱)。

在下面的示例中,我們正在檢索有關 RHEL 8 基本容器的體系結構和描述的信息,該容器屬於 ‘Labels‘ 部分。

# podman inspect --format=’{{.Labels.architecture}}’ image ID
# podman inspect --format=’{{.Labels.description}}’ image ID
獲取有關容器架構的信息
獲取有關容器架構的信息

要檢查來自另一個註冊表的遠程映像,請使用 skopeo inspect. 在下面的示例中,我們正在檢查託管在 Docker.

# skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init
從 Docker Registry 檢查遠程鏡像
從 Docker Registry 檢查遠程鏡像

標記容器圖像

正如您可能已經註意到的,圖像名稱在本質上通常是通用的。 例如,redis 圖像被標記為:

registry.redhat.io/rhscl/redis-5-rhel7

標記圖像為它們提供了一個更直觀的名稱,以更好地理解它們包含的內容。 使用 podman tag,您可以創建一個圖像標籤,它本質上是包含不同部分的圖像名稱的別名。

這些是:

registry/username/NAME:tag

例如,更改 ID 為的 Redis 映像的通用名稱 646f2730318c ,我們將執行命令:

# podman tag 646f2730318c myredis

要在末尾添加標籤,請附加一個完整的冒號,後跟標籤號:

# podman tag 646f2730318c myredis:5.0

在不添加標籤號的情況下,它只會被分配最新的屬性。

為 Redis 容器鏡像設置名稱
為 Redis 容器鏡像設置名稱

運行容器鏡像

要運行容器,請使用 podman run. 例如:

# podman run image_id

要將容器作為守護程序服務在後台靜默運行,請使用 -d 如圖所示。

# podman run -d image_id

例如,要運行 redis 帶身份證的圖片 646f2730318c,我們將調用命令:

# podman run -d 646f2730318c
運行 Redis 容器鏡像
運行 Redis 容器鏡像

如果您正在運行基於操作系統的容器,例如 RHEL 8 基本映像,您可以使用 -it 指示。 這 -i 創建一個交互式會話,而 -t 產生一個終端會話。 這 –name 將容器名稱設置為 mybash 而是 ecbc6f53bba0 基礎鏡像的鏡像 ID。

# podman run -it --name=mybash ecbc6f53bba0

此後,您可以運行任何 shell 命令。 在下面的示例中,我們正在驗證容器映像的操作系統版本。

# cat /etc/os-release
驗證容器鏡像操作系統版本
驗證容器鏡像操作系統版本

要退出容器,只需調用 exit 命令。

# exit

一旦容器退出,它會自動停止。 要再次啟動容器,請使用 podman start-ai 如圖所示。

# podman start -ai mybash

再一次,這使您可以訪問 shell。

啟動容器鏡像
啟動容器鏡像

列出正在運行的容器鏡像

要列出當前正在運行的容器,請使用 podman ps 如圖所示。

# podman ps
列出正在運行的容器鏡像
列出正在運行的容器鏡像

要查看所有容器,包括那些在運行後退出的容器,請使用以下命令:

# podman ps -a
查看所有容器圖像
查看所有容器圖像

配置容器鏡像在 Systemd 服務下自動啟動

在本節中,我們將重點介紹如何將容器配置為直接在 RHEL 系統上作為 systemd 服務運行。

首先,獲取您喜歡的圖像。 在這種情況下,我們拉 Redis 來自 docker hub 的圖片:

# podman pull docker.io/redis

如果您的系統上正在運行 SELinux,則需要激活 container_manage_cgroup 運行容器的布爾值 systemd.

# setsebool -p container_manage_cgroup on

此後,在後台運行容器映像並將其分配給您的首選映像名稱。 在這個例子中,我們命名了我們的圖像 redis_server 並映射端口 6379 從容器到我們的 RHEL 8 主持人

# podman run -d --name redis_server -p 6379:6379 redis
在後台運行容器鏡像
在後台運行容器鏡像

接下來,我們將創建一個 systemd redis 中的單元配置文件 /etc/systemd/system/.

# vim /etc/systemd/system/redis-container.service

將以下內容粘貼到文件中。

[Unit]
Description=Redis container

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redis_server
ExecStop=/usr/bin/podman stop -t 2 redis_server

[Install]
WantedBy=local.target

保存並退出文件。

接下來,將容器配置為在啟動時自動啟動。

# systemctl enable redis-container.service

接下來,啟動容器並驗證其運行狀態。

# systemctl start redis-container.service
# systemctl status redis-container.service
驗證容器映像狀態
驗證容器映像狀態

為容器映像配置持久存儲

在運行容器時,謹慎的做法是在主機上配置持久性外部存儲。 這提供了一個備份,以防容器崩潰或被意外刪除。

為了持久化數據,我們要將位於主機中的目錄映射到容器內的目錄。

$ podman run --privileged -it -v /var/lib/containers/backup_storage:/mnt registry.redhat.io/ubi8/ubi /bin/bash

–privileged 當被通過 SELinux 設置為強制執行。 這 -v 指定位於主機上的外部卷。 這裡的容器體積是 /mnt.

一旦我們訪問了 shell,我們將創建一個示例文件 testing.txt 在裡面 /mnt 如圖所示。

$ echo "This tests persistent external storage" > /mnt/testing.txt

屆時我們將 exit 容器並檢查文件是否存在於主機上的外部存儲中

# exit
# cat /var/lib/containers/backup_storage/testing.txt

輸出⇒ This tests persistent external storage.

為容器配置持久存儲
為容器配置持久存儲

停止和移除容器

運行完容器後,可以使用 podman stop 其次是 container-id 您可以從 podman ps.

# podman stop container-id
停止容器鏡像
停止容器鏡像

要刪除不再需要的容器,首先,確保停止它,然後調用 podman rm 後跟容器 id 或名稱作為選項。

# podman rm container-id

要在一個命令中一次刪除多個容器,請指定容器 ids 用空格隔開。

# podman rm container-id-1 container-id-2 container-id-3
移除容器鏡像
移除容器鏡像

要清除所有容器,請運行以下命令:

# podman rm -a
清除所有容器
清除所有容器

刪除圖像

要刪除圖像,首先,確保從圖像生成的所有容器都已停止並刪除,如上一個子主題中所述。

接下來,繼續運行 podman -rmi 後跟圖像的ID,如圖所示:

# podman -rmi image-id
刪除圖像
刪除圖像

結論

這結束了本章關於管理和使用容器的內容 RHEL 8. 我們希望本指南能夠對容器以及如何在您的 RHEL 系統使用 podmanSkopeo.