一入程式設計深似海,從此節操是路人。
最近使用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 執行並測試。
本文核心:主要介紹podman(docker)打包本地 jar 檔案,製作映象執行測試。
準備
如果沒有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 [email protected]:/opt/dkr/
關於podman,支援Windows、MacOS與Linux發行版,可以前往github獲取更多版本安裝包(exe、zip、pkg、tar.gz、source),便於在網路隔離情況下部署。如果網路環境允許,可以使用作業系統支援的安裝工具進行安裝,比如RHEL系列使用yum或者dnf管理工具,Debian與Ubuntu使用apt工具。
podman開源倉庫:https://github.com/containers/podman
如果獲取資源緩慢,這是正常現象,你可能需要加速一下,或者使用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。
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 "[email protected]"
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
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;
可以看到使用 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命令。
當然,你還可以使用 podman top 檢視容器負載,範例檢視最新容器狀態:
podman top -l
善用podman自帶幫助檔案,有一定基礎後這是最有效的方式,需要有一定閱讀英文檔案積累。
列出podman全部檔案提示,範例:
podman help
man podman
只檢視 podman ps 幫助檔案,範例:
podman help ps
podman ps --help
閒扯
開始使用,感覺命令太多,哎呀記不住,怎麼辦?沒有捷徑可走,多敲幾遍,自然而然記住了。主要做札記,使用筆電記錄,記錄過程也是思考的過程。分類整理,容器管理,容器內映象管理。其次靠工作經驗以及平時積累總結出常用以及實用命令,熟悉後,使用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提供了快速啟動,以 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
podman開源倉庫:https://github.com/containers/podman
最後,希望對你的工作有所幫助,以上總結僅供參考!
靜下心來,才發現原來不會的還有很多。
一分耕耘,一分收穫。
多總結,你會發現,自己的知識寶庫越來越豐富。
——END——