Podman 和 Docker 的安裝、部署和設(shè)置
1、Linux 容器介紹
Linux容器是與系統(tǒng)其他部分隔離開的一系列進(jìn)程。運行這些進(jìn)程所需的所有文件都由另一個鏡像提供, 這意味著從開發(fā)到測試再到生產(chǎn)的整個過程中,Linux 容器都具有可移植性和一致性。因而,相對于依賴重復(fù)傳統(tǒng)測試環(huán)境的開發(fā)渠道,容器的運行速度要快得多。容器比較普遍也易于使用,因此也成了 IT 安全方面的重要組成部分。
容器可以確保您的應(yīng)用擁有必需的庫、依賴項和文件,讓您可以在生產(chǎn)中自如地遷移這些應(yīng)用,無需擔(dān)心會出現(xiàn)任何負(fù)面影響。實際上,您可以將容器鏡像中的內(nèi)容,視為 Linux 發(fā)行版的一個安裝實例,因為其中完整包含 RPM 軟件包、配置文件等內(nèi)容。
容器從出現(xiàn)開始,迅速成為現(xiàn)代數(shù)據(jù)中心的必要組成部分。目前流行的容器引擎包括Docker以及下一代符合Open Container Initiative(OCI)標(biāo)準(zhǔn)的容器。
Docker 是一個開源的應(yīng)用容器引擎,屬于 Linux 容器的一種封裝,Docker 提供簡單的容器使用接口,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中,然后發(fā)布到Linux 機器上,但Docker也有兩個主要缺點:
- Docker 需要在你的系統(tǒng)上運行一個守護(hù)進(jìn)程;
- Docker 是以 root 身份在你的系統(tǒng)上運行該守護(hù)程序。
這些缺點的存在可能有一定的安全隱患,為了解決這些問題,下一代容器化工具Podman出現(xiàn)了。
Podman是一個開源的容器管理工具,其可在大多數(shù)Linux平臺上使用,它是一種無守護(hù)程序的容器引擎,用于在Linux系統(tǒng)上開發(fā),管理和運行任何符合Open Container Initiative(OCI)標(biāo)準(zhǔn)的容器和容器鏡像, 提供了一個與Docker兼容的命令行前端。Podman控制下的容器既可以由root用戶運行,也可以由非特權(quán)用戶運行。
使用Podman,Skopeo和Buildah的新一代容器架構(gòu)工具后,可以解決由于docker守護(hù)程序?qū)е碌膯雍桶踩珕栴}。
2、Podman 和docker主要不同之處
docker 需要在我們的系統(tǒng)上運行一個守護(hù)進(jìn)程(docker daemon),而podman 不需要。
- 啟動容器的方式不同:docker cli 命令通過API跟 Docker Engine(引擎)交互告訴它我想創(chuàng)建一個container,然后docker Engine才會調(diào)用OCI container runtime(runc)來啟動一個container。這代表container的process(進(jìn)程)不會是Docker CLI的child process(子進(jìn)程),而是Docker Engine的child process。
- Podman是直接給OCI containner runtime(runc)進(jìn)行交互來創(chuàng)建container的,所以container process直接是podman的child process。
- docker需要使用root用戶來創(chuàng)建容器,但是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,所以說經(jīng)常使用Docker CLI的人使用Podman上手非常快。
運行一個容器
列出當(dāng)前所有的容器
查看一個鏡像信息
查看容器運行的日志
查看運行中容器資源使用情況
4、Docker部署
4.1 部署準(zhǔn)備工作
Docker CE即社區(qū)版(Community Edition),免費使用。這里以CentOS為例來介紹Docker的部署流程。在部署前,需要具備以下環(huán)境:
- CentOS 7 及以上版本的操作系統(tǒng)
- Linux內(nèi)核版本不低于3.10(CentOS 7 滿足最低內(nèi)核的要求)
- 已啟用centos-extras倉庫(默認(rèn)情況此倉庫是啟用的,使用yum repolist可以查看是否存在。如未啟用,可安裝yum-utils后執(zhí)行 yum-config-manager --enable extras 進(jìn)行啟用)
- 若安裝了舊版本Docker相關(guān)內(nèi)容,需進(jìn)行卸載,舊版本的Docker稱為docker或者docker-engine,卸載命令如下:(若未做說明,后續(xù)命令均以root用戶執(zhí)行)
若服務(wù)器能夠連接到互聯(lián)網(wǎng),可參考在線部署步驟進(jìn)行Docker安裝,如無法連接到互聯(lián)網(wǎng),可參考離線部署步驟進(jìn)行Docker安裝。
4.2 在線部署步驟
安裝必要的軟件包
先安裝如下的軟件包:yum-utils,方便后續(xù)配置yum倉庫
配置docker-ce穩(wěn)定倉庫
注意,docker-ce.repo中也包含了nightly及test倉庫,默認(rèn)沒有啟用,可以使用 sudo yum-con-fig-manager --enable docker-ce-nightly 進(jìn)行啟用,一般無需啟用。
安裝最新版本的docker-ce
該命令默認(rèn)安裝了最新版本的docker-ce,安裝過程中如需校驗GPG key,輸入"y"確認(rèn)即可。
執(zhí)行完成后,Docker已經(jīng)成功安裝,但是還未啟動,建議先不要啟動,完成后續(xù)“部署完成后相關(guān)設(shè)置”后再啟動Docker。
安裝指定版本的docker-ce
首先使用如下命令查看docker-ce.repo中有哪些docker-ce版本。
第二列的部分字符串(冒號之后連接號之前)是版本號,例如可以使用如下命令安裝指定版本:
該命令會安裝指定版本的docker-ce,安裝中如需校驗GPG key,輸入"y"確認(rèn)即可。
執(zhí)行完成后,Docker已經(jīng)成功安裝,但是還未啟動,建議先不要啟動,完成后續(xù)“部署完成后相關(guān)設(shè)置”后再啟動Docker。
4.3 離線部署步驟
執(zhí)行完成后,Docker已經(jīng)成功安裝,但是還未啟動,建議先不要啟動,完成后續(xù)“部署完成后相關(guān)設(shè)置”后再啟動Docker。
官方步驟及存在的坑
安裝18.09.1版本:
官方給的文檔說明是,到Docker官網(wǎng)下載指定版本的rpm包 https://download.docker.com/linux/centos/7/x86_64/stable/Packages/,然后再使用yum進(jìn)行安裝。
這種方式會存在一個問題,在完全離線的環(huán)境中,直接安裝docker官網(wǎng)下載的rpm包會缺少很多依賴,這些依賴需要手動去下載相應(yīng)的rpm包進(jìn)行升級或者安裝,非常麻煩。因此這里推薦以下方法進(jìn)行離線安裝。
下載所有的rpm包到本地
(1)在可以上網(wǎng)的環(huán)境(例如個人電腦),安裝一臺與離線環(huán)境機器相同操作系統(tǒng)的虛擬機,確保該虛擬機能夠訪問互聯(lián)網(wǎng),在安裝虛擬機操作系統(tǒng)時最好選擇最小化安裝。假設(shè)操作系統(tǒng)為CentOS。
(2)安裝完畢后,配置機器的yum源(建議配置阿里云的鏡像),先備份/etc/yum.repos.d/。
(3)然后配置CentOS-Base.repo及docker-ce.repo
(4)下載docker-ce相關(guān)的rpm包。
創(chuàng)建repo倉庫
在以上能聯(lián)網(wǎng)的虛機上安裝createrepo創(chuàng)建倉庫。
此時會在 /tmp/rpm_download 下生成repodata倉庫數(shù)據(jù)文件夾。
在離線環(huán)境進(jìn)行安裝
拷貝以上文件到離線環(huán)境的機器上,配置本地yum源進(jìn)行安裝。
將以上文件夾拷貝到離線環(huán)境的機器上,假設(shè)目錄也為/tmp/rpm_download
配置離線環(huán)境機器的本地yum源。
至此,完成了離線環(huán)境下docker的安裝。
4.4 部署完成后相關(guān)設(shè)置
配置非root用戶使用Docker命令
Docker daemon默認(rèn)監(jiān)聽一個Unix套接字(/var/run/docker.sock),這個Unix套接字默認(rèn)屬于用戶root,其他用戶如果要使用docker命令行與daemon通信,則必須使用sudo。
非root用戶每次都使用sudo比較麻煩,可以創(chuàng)建一個名為“docker”的組(安裝完docker后默認(rèn)就有),然后把非root用戶加入到docker組里面,就可以直接訪問Docker daemon了。
注意,如果已經(jīng)使用了sudo,然后再把該用戶加入到docker組,可能會因為目錄權(quán)限的問題導(dǎo)致報錯,使用以下命令修復(fù)即可。
配置Docker開機自啟動
CentOS 7中使用Systemd管理服務(wù),執(zhí)行以下命令即可。
配置默認(rèn)的日志驅(qū)動
Docker daemon的默認(rèn)日志驅(qū)動是json-file,可以把docker容器的標(biāo)注輸出、標(biāo)準(zhǔn)錯誤輸出到j(luò)son文件中,也可以支持其他日志驅(qū)動,例如local、journald,通過在/etc/docker/daemon.json中配置。
也可以在創(chuàng)建容器時,指定容器使用的日志驅(qū)動,例如:
配置Docker daemon監(jiān)聽TCP端口
默認(rèn)情況下,Docker
daemon監(jiān)聽一個本地的Unix
socket,接收來自本地docker客戶端的請求。如果要從遠(yuǎn)程訪問,比如docker-compose、docker-swarm之類的工具需要與Docker
daemon通信,可以讓Docker daemon監(jiān)聽一個本地的tcp端口。
CentOS系統(tǒng)下,修改文件/usr/lib/systemd/system/docker.service,修改如下內(nèi)容:
然后重啟docker。
使用 netstat -tnlp | grep 2375 可以看到dockerd進(jìn)程監(jiān)聽了2375端口。
配置鏡像下載加速
默認(rèn)情況下Docker會從國外的鏡像倉庫pull鏡像,可以使用國內(nèi)的倉庫鏡像服務(wù)器以加快pull image 的速度,同時增加下載的并發(fā)數(shù)。
CentOS系統(tǒng)下,修改docker配置文件/etc/docker/daemon.json。
然后重啟docker。
配置Docker的默認(rèn)網(wǎng)橋
Docker服務(wù)啟動后默認(rèn)會創(chuàng)建一個docker0網(wǎng)橋,它使用的默認(rèn)網(wǎng)段是172.xx.xx.xx,假設(shè)部署docker的機器也是用這個網(wǎng)段,則可能會有沖突,可以修改docker默認(rèn)的網(wǎng)段。
CentOS系統(tǒng)下,修改docker配置文件/etc/docker/daemon.json
然后重啟docker。
4.5 功能驗證
啟動Docker
查看docker狀態(tài)信息
運行hello-world容器
首次運行會從遠(yuǎn)程鏡像倉庫下載hello-world鏡像,并啟動一個容器,當(dāng)容器運行時會輸出一段信息,然后自動退出,通過 docker ps -a 可以查看。
Docker daemon的日志
systemd使用journalctl命令統(tǒng)一管理所有Unit的啟動日志,使用以下命令可以查看Docker daemon日志。
Docker卸載
5、本章小結(jié)
本文介紹了容器的部署過程和簡單的容器操作,分別說明了Docker和下一代容器工具Podman的區(qū)別。目前,Docker容器引擎還被很多的工程師廣泛使用,但是由于其本身的局限性,未來符合OCI標(biāo)準(zhǔn)的Podman還是會逐漸成為社區(qū)主流,而被廣大的開發(fā)人員、運維人員所接受。技術(shù)在不斷發(fā)展,新的工具在涌現(xiàn),我們可以根據(jù)相應(yīng)的新的容器工具鏈,構(gòu)建一個與
Docker 完全兼容,然而卻更加輕量、靈活和安全的容器環(huán)境。
參考引用:Podman 官網(wǎng)地址: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