podman 入門實戰

文正耕耘發表於2023-03-08

ppma2p6.png

一入程式設計深似海,從此節操是路人。

最近使用podman,就想著寫一篇總結性的筆記,以備後續參考。就如同寫程式碼,不寫註釋,過了一段時間可能會想這是我寫的嗎?不會吧,還要理一下邏輯才能讀懂,不利於後期維護。

感覺整體體驗下來,映象獲取、容器建立、容器監控、容器移除,和docker差不多,感覺可以作為替代品。

什麼是podman

Podman is a utility provided as part of the libpod library. It can be used to create and maintain containers. The following tutorial will teach you how to set up Podman and perform some basic commands.

大意是 podman 使用libpod庫提供的一部分,打造應用程式。你可以使用podman建立容器、維護容器。

每個人使用環境可能不一樣,在介紹podman安裝與使用時,我想先介紹自己的環境

個人使用環境

作業系統:Linux發行版Centos9-stream。

容器環境:podman 4.2.0。

測試執行服務:Maven 構建 Java web 應用程式打包成 jar。

Linux-Centos9-stream使用podman(docker)製作本地映象,Maven構建 jar 執行並測試。

  1. 專案構建(spring官網 & 阿里雲 腳手架構架,IDE開發工具構建)。
  2. 專案打包(maven 打包,mvn install)。
  3. 專案釋出(上傳至伺服器Linux 發行版Centos9-stream)。
  4. 製作本地映象(podman(docker) 容器製作映象)。

本文核心:主要介紹podman(docker)打包本地 jar 檔案,製作映象執行測試。

準備

  • 本地環境:MySQL、JDK、Maven、jar包檔案,用於測試。
  • 伺服器環境:podman(docker)環境,openJDK。

如果沒有jar包環境,可以去spring官網和阿里雲springboot腳手架官網線上構建demo。
spring initializr:https://start.spring.io/
阿里云云原生應用腳手架:https://start.aliyun.com/

cd demo
mvn install
scp -r target\demo-1.0.jar root@192.168.245.132:/opt/dkr/  

podman安裝

關於podman,支援Windows、MacOS與Linux發行版,可以前往github獲取更多版本安裝包(exe、zip、pkg、tar.gz、source),便於在網路隔離情況下部署。如果網路環境允許,可以使用作業系統支援的安裝工具進行安裝,比如RHEL系列使用yum或者dnf管理工具,Debian與Ubuntu使用apt工具。

podman開源倉庫:https://github.com/containers/podman

ppma6t1.png

如果獲取資源緩慢,這是正常現象,你可能需要加速一下,或者使用BT工具。

如果使用Linux發行版線上安裝,可以更換國內映象源,比如阿里雲、騰訊雲、華為雲。

1、安裝podman(docker)

yum install -y podman

在RHEL9中可以使用yum或者dnf命令安裝服務。

檢視podman版本:podman -v

[root@Centos9-Stream demo]# podman -v
podman version 4.2.0

2、啟動podman

systemctl start podman

RHEL7以及以上推薦使用systemctl命令去管理服務,使用service命令也是相容的,用法有些區別。

設定開機自啟:systemctl enable podman

[root@Centos9-Stream ~]# systemctl enable podman
Created symlink /etc/systemd/system/default.target.wants/podman.service → /usr/lib/systemd/system/podman.service.
[root@Centos9-Stream ~]# systemctl status podman
○ podman.service - Podman API Service
     Loaded: loaded (/usr/lib/systemd/system/podman.service; enabled; vendor preset: disabled)
     Active: inactive (dead) since Sun 2023-02-26 16:56:43 CST; 2min 33s ago
...
2月 26 16:56:38 Centos9-Stream podman[3173]: time="2023-02-26T16:56:38+08:00" level=info msg="/usr/bin/podman filtering at log level info"
...
2月 26 16:56:43 Centos9-Stream systemd[1]: podman.service: Deactivated successfully.

使用命令 systemctl enable podman 設定podman服務開機自啟,檢視pdoman狀態:systemctl status podman,發現由 disabled 轉變成了enabled。如果不想開機自啟,可以使用禁用命令:systemctl disable podman。

podman製作本地映象

Dockerfile檔案作用:個人理解,相當於路標,透過相關命令去指引我們如何前進,構建映象。

1、打包本地jar:新建Dockerfile檔案

將上傳的 jar 檔案複製到與Dockerfile同一目錄,比如我演示目錄在 /opt/dkr:

cp springboot-crud-0.0.1-SNAPSHOT.jar /opt/dkr/

建立Dockerfile檔案:

touch Dockerfile

編輯Dockerfile檔案:

vim Dockerfile

填充如下內容:

 FROM openjdk:17
 MAINTAINER Fisher "dywangk@gmail.com"
 ADD springboot-crud-0.0.1-SNAPSHOT.jar crud-app.jar

FROM:從哪裡獲取到 JDK 作為執行 jar 包支撐環境,此處我獲取的是 openjdk17 與 springboot 指定 jdk 版本對應上。
MAINTAINER:指定維護人。可選項,可加可不加。
ADD:新增 jar 檔案。可以使用COPY替代。
RUN:顧名思義,執行。執行命令以及服務,本次測試沒加上,在 podman build 時執行。

2、打包本地jar作為映象

透過 podman build 命令構建本地映象服務。

podman build -f Dockerfile -t springboot:crud-app.jar

檢視images,注意對應上IMAGE ID

[root@Centos9-Stream ~]# podman images
REPOSITORY                 TAG           IMAGE ID      CREATED       SIZE
none				       none			 4f7431dafa0a  2 hours ago   519 MB
docker.io/library/openjdk  17            5e28ba2b4cdb  9 months ago  475 MB

透過podman images命令檢視images發現REPOSITORY和TAG是none,接下來會繼續介紹指定TAG。
注意:podman images 是列出本地儲存映象列表,相當於 podman image list;podman image 是用於管理映象。

例如刪除映象:

podman image rm 4f7431dafa0a
podman image rm -f 4f7431dafa0a

3、指定tag

使用 podman tag 命令去新增標籤名,tag 後面追加 IMAGE ID 以及本地打包好的映象。

podman tag 4f7431dafa0a srpingboot:crud-app.jar

再次檢視images,發現REPOSITORY和TAG有內容了。

[root@Centos9-Stream ~]# podman images
REPOSITORY                 TAG           IMAGE ID      CREATED       SIZE
localhost/srpingboot       crud-app.jar  4f7431dafa0a  2 hours ago   519 MB
docker.io/library/openjdk  17            5e28ba2b4cdb  9 months ago  475 MB

4、執行jar服務

使用 podman run 命令啟動容器中的本地映象服務。-p 引數,指定埠8082和傳輸協議TCP;--name 引數,用於指定容器名稱;-it -d 引數,用於將服務置於後臺;java -jar 引數, 與平時本地環境直接啟動 java -jar服務是同樣地命令。

podman run -p 8082:8081/tcp --name crud -it -d localhost/srpingboot:crud-app java -jar crud-app.jar 

你可以再啟動一個服務,埠對映到8088,注意,--name 取名不能重複,示例如下:

podman run -p 8088:8081/tcp --name crud7 -it -d localhost/srpingboot:crud-app java -jar crud-app.jar 

檢視執行中的服務,使用命令:podman ps

[root@Centos9-Stream dkr]# podman ps
CONTAINER ID  IMAGE                              COMMAND               CREATED      STATUS          PORTS                   NAMES
920899cf9aad  localhost/srpingboot:crud-app.jar  java -jar crud-ap...  2 hours ago  Up 2 hours ago  0.0.0.0:8082->8081/tcp  crud

將8081埠對映到8082上,訪問時使用埠是8082。

列出容器埠對映:podman port crud

[root@Centos9-Stream dkr]# podman port crud
8081/tcp -> 0.0.0.0:8082

例如:訪問介面,如果你沒有在controller層編寫任何程式碼,訪問顯示的是404。當然這些並不重要,只需要印證podman(docker)打包本地jar包正常執行就足夠了。
http://192.168.245.132:8082/thymeleaf/findCity

ppmar79.png

5、檢視日誌
檢視日誌命令 podman logs,後面追加IMAGE ID:920899cf9aad,IMAGE ID理解為唯一值便於檢索。

podman logs 920899cf9aad

反饋結果

2023-02-13T12:56:21.113Z  INFO 1 --- [           main] com.example.Application                  : Started Application in 7.021 seconds (process running for 8.49)
...
2023-02-13T12:56:59.312Z  INFO 1 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms
Hibernate: select c.Name, c.CountryCode from world.city c;

ppmaR1K.png

可以看到使用 JPA show-sql 列印出了自己指定的SQL語句:

select c.Name, c.CountryCode from world.city c;

6、停止容器

採用 podman stop 命令手動停止一個或多個容器:

podman stop crud

7、啟動容器

當容器意外宕掉或者手動停止了,此時可以使用 podman start 啟動一個或多個容器:

podman start crud

8、監控容器

檢視(監控)容器健康狀態,主要分析CPU、記憶體負載:podman stats,使用ctrl + c 退出。如下圖所示:

podman  stats

當然,可以配合重定向輸出到日誌檔案:podman stats > podman-stats.log,初次已覆蓋形式;再次使用重定向輸出命令:podman stats >> podman-stats.log,採用追加形式。檢視日誌檔案內容,可以使用tail、cat、vim命令。

ppmaykR.png

當然,你還可以使用 podman top 檢視容器負載,示例檢視最新容器狀態:

podman top -l

善用podman自帶幫助文件,有一定基礎後這是最有效的方式,需要有一定閱讀英文文件積累。

列出podman全部文件提示,示例:

podman help
man podman

只檢視 podman ps 幫助文件,示例:

podman help ps
podman ps --help

ppmacfx.png

podman(docker)命令回顧

閒扯

開始使用,感覺命令太多,哎呀記不住,怎麼辦?沒有捷徑可走,多敲幾遍,自然而然記住了。主要做札記,使用筆記本記錄,記錄過程也是思考的過程。分類整理,容器管理,容器內映象管理。其次靠工作經驗以及平時積累總結出常用以及實用命令,熟悉後,使用podman自帶的幫助文件提高工作效率

只停留在看和札記上,顯得很抽象,需要配合搭建環境去感受。運用越多,實際工作中越有底氣。

回顧一下,製作本地映象使用到了哪些命令。你會發現,自己實踐一遍,需要掌握哪些命令,用到的還不少。僅僅透過構建本地映象到執行,涉及到知識面有限,我並沒有介紹到容器初始化(init)、連線(attach)、內容自動更新(auto-update)、提交(commit)、比對(diff)等等命令。

回顧命令

檢視容器列表,正在執行中的容器:podman ps

podman ps

啟動一個或者更多容器:podman start,示例啟動crud7

podman start crud7

停止一個或者更多容器:podman stop,示例停止crud7

podman stop crud7

檢視(監控)容器健康狀態,示例:

podman  stats

從遠端地址拉取映象:podman pull

檢視 podman 版本命令:podman -v

從容器定義配置檔案Dockerfile, 構建自定義映象命令:podman build

給映象加上tag(標籤名):podman tag

新的容器中執行一條命令,比如我在文中執行到 jar 服務:podman run

管理映象:podman image

檢視本地(已拉取)映象列表:podman images

移除一個或多個容器:podman rm ,根據容器ID移除。例如:

podman rm 03dd5a923f51

從本地儲存移除一個或多個映象:podman rmi

檢視容器中執行服務後的日誌:podman logs

配合Linux中grep、tail命令進行檢索

podman logs cd57c4af7fb8 | grep 8081
podman logs cd57c4af7fb8 | tail -f

此處,我已知使用到了埠8081,直接匹配比較精確,也可以模糊一點,只輸入80。使用 tail -f 命令,檢視最近的10條資訊。

列出容器埠對映:podman port ,示例,查詢名稱為crud的容器:

podman port crud

搜尋遠端地址映象:podman search ,例如搜尋 openjdk17:

podman search openjdk17

使用 podman 幫助文件:podman help

使用幫助命令時候,同樣可以配合 grep 命令匹配已知的命令:

podman help  | grep images
podman help images

podman快速入門

podman提供了快速啟動,以 httpd 服務為示例:映象獲取、容器建立、容器監控、容器移除。

快速入門,參考podman文件

https://podman.io/getting-started/

此處演示使用 podman 獲取 httpd(web中介軟體Apache服務)。

搜尋命令:podman search ,示例如下:

[root@Centos9-Stream kart]# podman search httpd --filter=is-official
NAME                     DESCRIPTION
docker.io/library/httpd  The Apache HTTP Server Project

獲取 httpd 服務

podman pull docker.io/library/httpd

列出所有映象列表

podman images

執行容器

 podman run -dt -p 8080:80/tcp docker.io/library/httpd

獲取的是最新版,此處,你可能需要修改才能執行:

podman run -dt -p 8080:80/tcp docker.io/library/httpd:latest

查詢正在執行的容器:

podman ps

測試容器,訪問 httpd

http://localhost:8080/

或者使用 curl命令:

curl http://localhost:8080
<html><body><h1>It works!</h1></body></html>

看到頁面顯示:It works! ,代表測試執行httpd服務成功。

監控容器,示例:

podman top amazing_matsumoto

檢視日誌,指定容器NAME,示例:

podman logs amazing_matsumoto

停止容器,根據容器(CONTAINER)ID或者NAME都行。注意,如果沒有指定NAME,會生成隨機字串。

示例根據NAME停止容器:

podman stop amazing_matsumoto

查出所有容器(包含退出的、建立的),示例:

podman ps -a

移除容器,示例:

podman rm amazing_matsumoto

透過管道符配合 grep 命令搜尋,發現確實移除掉了,示例:

podman ps -a | grep amazing_matsumoto

基本命令文件:可以下載文件,包含:PDF、HTML、Epub三種格式。

https://docs.podman.io/en/latest/Commands.html

  • latest:最新版
  • stable:穩定版
  • v4.3:歷史版本podman4.3

podman開源倉庫:https://github.com/containers/podman

最後,希望對你的工作有所幫助,以上總結僅供參考!

靜下心來,才發現原來不會的還有很多。

一分耕耘,一分收穫。

多總結,你會發現,自己的知識寶庫越來越豐富。

——END——

相關文章