Podman 和 Docker 的安裝、部署和設置
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的安裝部署非常簡便,參考如下:
(1). Arch Linux & Manjaro Linux
sudo pacman -S podman
(2). Fedora,Centos,RHEL
sudo yum -y install podman
(3). Gentoo
sudo emerge app-emulation/libpod
(4). 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上手非??臁?/span>
運行一個容器
列出當前所有的容器
查看一個鏡像信息
查看容器運行的日志
查看運行中容器資源使用情況
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/Podmanhttps://www.redhat.com/zh/topics/containers/whats-a-linux-containerhttps://baijiahao.baidu.com/s?id=1653853217702500436&wfr=spider&for=pchttps://www.redhat.com/zh/topics/containers/whats-a-linux-containerhttps://www.cnblogs.com/shoufu/p/11803010.html