容器學習:Podman 和 Docker 的安裝、部署和設置
容器部署是實際使用和實踐容器的第一步,本文結合筆者實際生產實踐使用,詳細梳理了 Podman 和 Docker 如何在不同環境下(在線環境及離線環境)進行安裝和部署,以及在部署後如何對 Docker 的常用功能進行相關設置以便更好地使用,並對容器部署中可能遇到的坑進行了說明。本文適合容器初學者,可以依照步驟完成容器的部署安裝及使用,爲後續的深入學習打下基礎。
【分享者】周颯, 上海某金融單位系統架構師。從事數據中心運維工作,主要負責數據中心 kubernetes 容器私有云的建設及維護。
1 Linux 容器介紹
Linux 容器是與系統其他部分隔離開的一系列進程。運行這些進程所需的所有文件都由另一個鏡像提供, 這意味着從開發到測試再到生產的整個過程中,Linux 容器都具有可移植性和一致性。因而,相對於依賴重複傳統測試環境的開發渠道,容器的運行速度要快得多。容器比較普遍也易於使用,因此也成了 IT 安全方面的重要組成部分。
容器可以確保您的應用擁有必需的庫、依賴項和文件,讓您可以在生產中自如地遷移這些應用,無需擔心會出現任何負面影響。實際上,您可以將容器鏡像中的內容,視爲 Linux 發行版的一個安裝實例,因爲其中完整包含 RPM 軟件包、配置文件等內容。
容器從出現開始,迅速成爲現代數據中心的必要組成部分。目前流行的容器引擎包括 Docker 以及下一代符合 Open Container Initiative(OCI)標準的容器。
Docker 是一個開源的應用容器引擎,屬於 Linux 容器的一種封裝,Docker 提供簡單的容器使用接口,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到 Linux 機器上,但 Docker 也有兩個主要缺點:
-
Docker 需要在你的系統上運行一個守護進程;
-
Docker 是以 root 身份在你的系統上運行該守護程序。
這些缺點的存在可能有一定的安全隱患,爲了解決這些問題,下一代容器化工具 Podman 出現了。
Podman 是一個開源的容器管理工具,其可在大多數 Linux 平臺上使用,它是一種無守護程序的容器引擎,用於在 Linux 系統上開發,管理和運行任何符合 Open Container Initiative(OCI)標準的容器和容器鏡像, 提供了一個與 Docker 兼容的命令行前端。Podman 控制下的容器既可以由 root 用戶運行,也可以由非特權用戶運行。
使用 Podman,Skopeo 和 Buildah 的新一代容器架構工具後,可以解決由於 docker 守護程序導致的啓動和安全問題。
2 Podman 和 docker 主要不同之處
docker 需要在我們的系統上運行一個守護進程 (docker daemon),而 podman 不需要。
-
啓動容器的方式不同:docker cli 命令通過 API 跟 Docker Engine(引擎) 交互告訴它我想創建一個 container,然後 docker Engine 纔會調用 OCI container runtime(runc) 來啓動一個 container。這代表 container 的 process(進程) 不會是 Docker CLI 的 child process(子進程),而是 Docker Engine 的 child process。
-
Podman 是直接給 OCI containner runtime(runc) 進行交互來創建 container 的,所以 container process 直接是 podman 的 child process。
-
docker 需要使用 root 用戶來創建容器,但是 podman 不需要。
3 Podman 部署和常見操作
Podman 的安裝部署非常簡便,參考如下:
- Arch Linux & Manjaro Linux
sudo pacman -S podman
- Fedora,Centos,RHEL
sudo yum -y install podman
- Gentoo
sudo emerge app-emulation/libpod
- 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 的部署流程。在部署前,需要具備以下環境:
-
CentOS 7 及以上版本的操作系統
-
Linux 內核版本不低於 3.10(CentOS 7 滿足最低內核的要求)
-
已啓用 centos-extras 倉庫(默認情況此倉庫是啓用的,使用 yum repolist 可以查看是否存在。如未啓用,可安裝 yum-utils 後執行 yum-config-manager --enable extras 進行啓用)
-
若安裝了舊版本 Docker 相關內容,需進行卸載,舊版本的 Docker 稱爲 docker 或者 docker-engine,卸載命令如下:(若未做說明,後續命令均以 root 用戶執行)
若服務器能夠連接到互聯網,可參考在線部署步驟進行 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