
以前學編程語言的時候,總是從 hello world 開始,
此處也就借用 hello world 來開始 podman
1. hello world
podman 能讓你在容器內運行一個程序,
如:輸出 hello world

如上:
podman run ubuntu:15.10 /bin/echo "hello world"
podman run
podman 的命令格式為:podman COMMAND ...
run 這個 COMMAND 用來 運行(啟動)一個 容器
ununtu:15.10
用來指定要運行的 鏡像,
podman 首先會在本地主機上查找該鏡像是否存在,
鏡像不存在的話,就會到 鏡像倉庫 里面下載鏡像,(如上行 3,可以看到 podman 也是到 docker 倉庫查找鏡像)
/bin/echo "Hello world"
在容器里面執行的命令,最后一行可以看到輸出的結果
好多時候會是 /bin/bash,來配合其他選項(-i,-t)提供一個 shell 環境
2. 容器幾個基本的概念
(雖然這些文章是說 podman,但在初學的過程中,感覺理解 podman 無法避開 docker 的樣子,所以會有一些 docker 的內容;podman 和 docker 的使用類似,(類比 yum 和 dnf),命令有很大的重合部分)
docker 中的基本組成:
-
鏡像(image)
-
鏡像可以理解為一個“模板”,是一個靜態的磁盤文件,這個文件里面會包含一些特定的軟件包,
-
如:將 apache 的相關內容制作為一個鏡像,將來加載運行這個鏡像的時候,就得到了一個可以運行 apache 的環境。
-
類比:虛擬機中安裝 CentOS 8 的時候,需要一個 CentOS 8 的 iso 鏡像
-
(上一節 OCI 提到,主要的標准之一就是 Image)
-
-
容器(container)
- 鏡像運行起來后,就是一個容器
-
倉庫
-
倉庫就是用來保存鏡像,本機上沒有的鏡像,就到倉庫里面查找。
-
類比 yum 本機上沒有的程序,就到倉庫里面查找
-
公開倉庫
-
私有倉庫(個人搭建)
-
3. 運行交互式容器
過 podman 的兩個參數 -i -t 讓 podman 運行的容器提供“交互”界面
(docker 也是一樣,前面說過 podman 和 docker 的命令有很大一部分重合,后續不在贅述)
-i | --interactive
Keep STDIN open even if not attached
-t | --tty
Allocate a pseudo-TTY for container (也就是提供一個終端)
示例如下:

如上:
前面說過 podman run 是將一個鏡像(ubuntu:15.10)運行起來,得到一個容器,
這個容器需要執行 /bin/bash 這個命令,
通過 -i 和 -t 參數,來運行容器中的 bash ,保留了交互的 tty,得到了一個可以交互的界面,
可以看到,執行 podman run 命令前后,
由 centos 變成了 unbutu,
且 PS1 也有了明顯的變化。
退出交互 tty,可以通過 exit 或 ctrl+d
4. 后台運行容器
比如說,apache 提供的網頁服務,並不需要他一直在終端里面進行交互,
有的時候希望他在后台運行,提供服務即可。
4.1 后台運行
后台運行容器需要選項:
-d | --detach
Run container in background and print container ID(也就是在后台運行容器,並打印出容器的 ID)
示例如下:
podman run -d ubuntu:15.10 /bin/bash -c \ "while true; do echo hello world; sleep 1; done"
bash -c "xxx" 大概的意思就是將 xxx 當做一個命令來執行,可以 man bash 具體查看。
"while true; do echo hello world; sleep 1; done" 展開得:
while true
do
echo hello world
sleep 1
done
也就是無限進行循環下面的內容:
輸出 hello world,然后 休息 1 秒,
總體來說,就是運行容器,然后再后台無限進行循環。
運行截圖如下:
如上,
運行命令后,只輸出了一個字符串,表示容器的 ID
具體執行的內容都在后台。
4.2 podman ps
接下來,第二個 podman 的命令:
podman ps
可以查看 正在運行 的容器
可以有選項:
--all | -a
Show all the containers created by Podman,
default is only running containers.(也就是 podman ps 默認情況下只會顯示運行中的容器)
選項 -a 的示例后續再來

如上圖:
第一字段,Container ID,也就是容器 ID
第二字段,容器使用的 Image(前面說過,podman 運行 Image 后,就得到了容器)
第三字段,啟動容器時候運行的命令
第四字段,容器創建的時間 Created
第五字段,容器狀態 Status
- created (已創建)
- restarting (重啟中)
- running 或 Up (運行中,上圖就是 UP 狀態)
- removing (遷移中)
- paused (暫停)
- exited (停止)
- dead (死亡)
上圖,太長了,沒截完,

第六字段,容器的端口信息和使用的連接類型(tcp\udp) Ports
第七字段,自動分配的容器名稱,Names
可以通過容器的 ID 和 Name 來指定容器,
運行容器時,可以通過 --name XXX 來自己指定容器的名字,需要唯一
額外的示例,如:

4.3 podman log
podman log XXX
podman logs 命令能夠查看到容器內的標准輸出
上面的例子中,不是在后台一直輸出 hello world 嘛,通過這個命令能夠看到

如上,
前面說過,可以使用 容器名、容器 ID 來指定具體的容器
5. 進入后台運行的容器
前面提到,-d 選項會使得容器在后台運行,
如果想要進入后台運行中的容器,可以:
5.1 podman attach
podman attach XXX
示例如下:

如上,
podman attach test,進入 test 這個容器后,能發現 PS1 有了明顯的變化,表明進入了容器。
通過 podman attach 進入容器后,如果從里面退出,會導致容器的停止。
5.2 podman exec
podman exec XXX
示例如下:

如上,
podman exec 一個后台容器,在退出后,容器依舊在運行,
因此,推薦使用 exec 進入容器,這樣的話,退出的時候,不會導致容器停止。
6. 停止容器
podman stop
能夠停止容器的運行

類似於 stop,還有 podman restart xxx 命令可以對容器重啟
前面說過 podman ps 是查看 運行中的容器,
因此,上圖中的容器停止以后,podman ps 就看不到容器了
但是 podman ps -a 就能看到該容器,只不過狀態是 Exited
7. 啟動已經停止的容器
對於已經停止的容器,可以使用於 podman start 來啟動,
如:

如上,原本容器狀態是 Exited,通過 start 命令之后,變為了 Up
8. 刪除容器
8.1 podman rm
podman rm will remove one or more containers from the host.
前面說的 stop 容器,容器依舊存在,只不過狀態是 Exited,
要想容器消失,還是需要將容器刪除掉。

如上,
podman stop 后的容器,狀態為 exited
通過 podman rm 可以將這些容器刪除掉
對於 up 的容器無法刪除,(需要 -f | --force)
8.2 --rm 選項

如上,
通過 stop 停止的容器,是狀態變為了 Exited,需要通過 rm 刪除,
可以在運行容器的時候添加 --rm 選項,表示退出的時候將容器刪除
--rm
Remove container (and pod if created) after exit

如上,
運行容器的時候,添加了 --rm 選項,
行 4 退出容器后,ps -a,並沒有 Exited 狀態的容器
9. 幫助信息
podman COMMAND --help
man podman-COMMAND