容器學習:Podman 和 Docker 的安裝、部署和設置

容器部署是實際使用和實踐容器的第一步,本文結合筆者實際生產實踐使用,詳細梳理了 Podman 和 Docker 如何在不同環境下(在線環境及離線環境)進行安裝和部署,以及在部署後如何對 Docker 的常用功能進行相關設置以便更好地使用,並對容器部署中可能遇到的坑進行了說明。本文適合容器初學者,可以依照步驟完成容器的部署安裝及使用,爲後續的深入學習打下基礎。

【分享者】周颯, 上海某金融單位系統架構師。從事數據中心運維工作,主要負責數據中心 kubernetes 容器私有云的建設及維護。

1 Linux 容器介紹

Linux 容器是與系統其他部分隔離開的一系列進程。運行這些進程所需的所有文件都由另一個鏡像提供, 這意味着從開發到測試再到生產的整個過程中,Linux 容器都具有可移植性和一致性。因而,相對於依賴重複傳統測試環境的開發渠道,容器的運行速度要快得多。容器比較普遍也易於使用,因此也成了 IT 安全方面的重要組成部分。

容器可以確保您的應用擁有必需的庫、依賴項和文件,讓您可以在生產中自如地遷移這些應用,無需擔心會出現任何負面影響。實際上,您可以將容器鏡像中的內容,視爲 Linux 發行版的一個安裝實例,因爲其中完整包含 RPM 軟件包、配置文件等內容。

容器從出現開始,迅速成爲現代數據中心的必要組成部分。目前流行的容器引擎包括 Docker 以及下一代符合 Open Container Initiative(OCI)標準的容器。

Docker 是一個開源的應用容器引擎,屬於 Linux 容器的一種封裝,Docker 提供簡單的容器使用接口,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到 Linux 機器上,但 Docker 也有兩個主要缺點:

這些缺點的存在可能有一定的安全隱患,爲了解決這些問題,下一代容器化工具 Podman 出現了。

Podman 是一個開源的容器管理工具,其可在大多數 Linux 平臺上使用,它是一種無守護程序的容器引擎,用於在 Linux 系統上開發,管理和運行任何符合 Open Container Initiative(OCI)標準的容器和容器鏡像, 提供了一個與 Docker 兼容的命令行前端。Podman 控制下的容器既可以由 root 用戶運行,也可以由非特權用戶運行。

使用 Podman,Skopeo 和 Buildah 的新一代容器架構工具後,可以解決由於 docker 守護程序導致的啓動和安全問題。

2 Podman 和 docker 主要不同之處

docker 需要在我們的系統上運行一個守護進程 (docker daemon),而 podman 不需要。

3 Podman 部署和常見操作

Podman 的安裝部署非常簡便,參考如下:

  1. Arch Linux & Manjaro Linux

sudo pacman -S podman

  1. Fedora,Centos,RHEL

sudo yum -y install podman

  1. Gentoo

sudo emerge app-emulation/libpod

  1. MacOS

brew cask install podman

基本常用命令:

podman info

podman version

podman images

podman rmi

podman ps

Podman CLI 裏面很多指令都和 Docker CLI 相同,官方給出了這麼個例子 alias docker=podman,所以說經常使用 Docker CLI 的人使用 Podman 上手非常快。

運行一個容器

列出當前所有的容器

查看一個鏡像信息

查看容器運行的日誌

查看運行中容器資源使用情況

4 Docker 部署

4.1 部署準備工作

Docker CE 即社區版(Community Edition),免費使用。這裏以 CentOS 爲例來介紹 Docker 的部署流程。在部署前,需要具備以下環境:

若服務器能夠連接到互聯網,可參考在線部署步驟進行 Docker 安裝,如無法連接到互聯網,可參考離線部署步驟進行 Docker 安裝。

4.2 在線部署步驟

安裝必要的軟件包

先安裝如下的軟件包:yum-utils,方便後續配置 yum 倉庫

配置 docker-ce 穩定倉庫

注意,docker-ce.repo 中也包含了 nightly 及 test 倉庫,默認沒有啓用,可以使用 sudo yum-con-fig-manager --enable docker-ce-nightly 進行啓用,一般無需啓用。

安裝最新版本的 docker-ce

該命令默認安裝了最新版本的 docker-ce,安裝過程中如需校驗 GPG key,輸入 "y" 確認即可。

執行完成後,Docker 已經成功安裝,但是還未啓動,建議先不要啓動,完成後續 “部署完成後相關設置” 後再啓動 Docker。

安裝指定版本的 docker-ce

首先使用如下命令查看 docker-ce.repo 中有哪些 docker-ce 版本。

第二列的部分字符串 (冒號之後連接號之前) 是版本號,例如可以使用如下命令安裝指定版本:

該命令會安裝指定版本的 docker-ce,安裝中如需校驗 GPG key,輸入 "y" 確認即可。

執行完成後,Docker 已經成功安裝,但是還未啓動,建議先不要啓動,完成後續 “部署完成後相關設置” 後再啓動 Docker。

4.3 離線部署步驟

執行完成後,Docker 已經成功安裝,但是還未啓動,建議先不要啓動,完成後續 “部署完成後相關設置” 後再啓動 Docker。

官方步驟及存在的坑

安裝 18.09.1 版本:

官方給的文檔說明是,到 Docker 官網下載指定版本的 rpm 包 https://download.docker.com/linux/centos/7/x86_64/stable/Packages/,然後再使用 yum 進行安裝。

這種方式會存在一個問題,在完全離線的環境中,直接安裝 docker 官網下載的 rpm 包會缺少很多依賴,這些依賴需要手動去下載相應的 rpm 包進行升級或者安裝,非常麻煩。因此這裏推薦以下方法進行離線安裝。

下載所有的 rpm 包到本地

(1)在可以上網的環境(例如個人電腦),安裝一臺與離線環境機器相同操作系統的虛擬機,確保該虛擬機能夠訪問互聯網,在安裝虛擬機操作系統時最好選擇最小化安裝。假設操作系統爲 CentOS。

(2)安裝完畢後,配置機器的 yum 源(建議配置阿里雲的鏡像),先備份 / etc/yum.repos.d/。

(3)然後配置 CentOS-Base.repo 及 docker-ce.repo

(4)下載 docker-ce 相關的 rpm 包。

創建 repo 倉庫

在以上能聯網的虛機上安裝 createrepo 創建倉庫。

此時會在 /tmp/rpm_download 下生成 repodata 倉庫數據文件夾。

在離線環境進行安裝

拷貝以上文件到離線環境的機器上,配置本地 yum 源進行安裝。

將以上文件夾拷貝到離線環境的機器上,假設目錄也爲 / tmp/rpm_download

配置離線環境機器的本地 yum 源。

至此,完成了離線環境下 docker 的安裝。

4.4 部署完成後相關設置

配置非 root 用戶使用 Docker 命令

Docker daemon 默認監聽一個 Unix 套接字 (/var/run/docker.sock),這個 Unix 套接字默認屬於用戶 root,其他用戶如果要使用 docker 命令行與 daemon 通信,則必須使用 sudo。

非 root 用戶每次都使用 sudo 比較麻煩,可以創建一個名爲 “docker” 的組(安裝完 docker 後默認就有),然後把非 root 用戶加入到 docker 組裏面,就可以直接訪問 Docker daemon 了。

注意,如果已經使用了 sudo,然後再把該用戶加入到 docker 組,可能會因爲目錄權限的問題導致報錯,使用以下命令修復即可。

配置 Docker 開機自啓動

CentOS 7 中使用 Systemd 管理服務,執行以下命令即可。

配置默認的日誌驅動

Docker daemon 的默認日誌驅動是 json-file,可以把 docker 容器的標註輸出、標準錯誤輸出到 json 文件中,也可以支持其他日誌驅動,例如 local、journald,通過在 / etc/docker/daemon.json 中配置。

也可以在創建容器時,指定容器使用的日誌驅動,例如:

配置 Docker daemon 監聽 TCP 端口

默認情況下,Docker daemon 監聽一個本地的 Unix socket,接收來自本地 docker 客戶端的請求。如果要從遠程訪問,比如 docker-compose、docker-swarm 之類的工具需要與 Docker daemon 通信,可以讓 Docker daemon 監聽一個本地的 tcp 端口。

CentOS 系統下,修改文件 / usr/lib/systemd/system/docker.service,修改如下內容:

然後重啓 docker。

使用 netstat -tnlp | grep 2375 可以看到 dockerd 進程監聽了 2375 端口。

配置鏡像下載加速

默認情況下 Docker 會從國外的鏡像倉庫 pull 鏡像,可以使用國內的倉庫鏡像服務器以加快 pull image 的速度,同時增加下載的併發數。

CentOS 系統下,修改 docker 配置文件 / etc/docker/daemon.json。

然後重啓 docker。

配置 Docker 的默認網橋

Docker 服務啓動後默認會創建一個 docker0 網橋,它使用的默認網段是 172.xx.xx.xx,假設部署 docker 的機器也是用這個網段,則可能會有衝突,可以修改 docker 默認的網段。

CentOS 系統下,修改 docker 配置文件 / etc/docker/daemon.json

然後重啓 docker。

4.5 功能驗證

啓動 Docker

查看 docker 狀態信息

運行 hello-world 容器

首次運行會從遠程鏡像倉庫下載 hello-world 鏡像,並啓動一個容器,當容器運行時會輸出一段信息,然後自動退出,通過 docker ps -a 可以查看。

Docker daemon 的日誌

systemd 使用 journalctl 命令統一管理所有 Unit 的啓動日誌,使用以下命令可以查看 Docker daemon 日誌。

Docker 卸載

5 本章小結

本文介紹了容器的部署過程和簡單的容器操作,分別說明了 Docker 和下一代容器工具 Podman 的區別。目前,Docker 容器引擎還被很多的工程師廣泛使用,但是由於其本身的侷限性,未來符合 OCI 標準的 Podman 還是會逐漸成爲社區主流,而被廣大的開發人員、運維人員所接受。技術在不斷髮展,新的工具在湧現,我們可以根據相應的新的容器工具鏈,構建一個與 Docker 完全兼容,然而卻更加輕量、靈活和安全的容器環境。

參考引用:

Podman 官網地址:https://podman.io/Podman

https://www.redhat.com/zh/topics/containers/whats-a-linux-container

https://baijiahao.baidu.com/s?id=1653853217702500436&wfr=spider&for=pc

https://www.redhat.com/zh/topics/containers/whats-a-linux-container

https://www.cnblogs.com/shoufu/p/11803010.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/RBEJZl4o63T27U6ooNfZqQ