容器平臺

筱崋發表於2024-05-07

Podman

(01)Install Podman

Podman:安裝


  安裝容器管理工具的Podman。

[1] 安裝 Podman。

root@dlp:~# apt -y install podman

[2] 下載官方映象並建立一個容器,並在容器內輸出 [Welcome to the Podman World] 字樣。

# download the official image
root@dlp:~# podman pull ubuntu
# run echo inside a container
root@dlp:~# podman run ubuntu /bin/echo "Welcome to the Podman World"
Welcome to the Podman World
Resolved "ubuntu" as an alias (/etc/containers/registries.conf.d/shortnames.conf)
Trying to pull docker.io/library/ubuntu:latest...
Getting image source signatures
Copying blob 49b384cc7b4a done   |
Copying config bf3dc08bfe done   |
Writing manifest to image destination
bf3dc08bfed031182827888bb15977e316ad797ee2ccb63b4c7a57fdfe7eb31d

[3] 使用 [i] 和 [t] 選項連線到容器的互動式會話,如下所示。

  如果 [exit] 退出容器會話,則容器的過程完成。

root@dlp:~# podman run -it ubuntu /bin/bash
root@591e1ea31c34:/#     # connected
root@591e1ea31c34:/# uname -a
Linux 591e1ea31c34 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
root@591e1ea31c34:/# exit
exit
root@dlp:~#     # come back

[4] 如果要將容器作為守護程序執行,請新增 [d] 選項。

root@dlp:~# podman run -itd ubuntu /bin/bash
# show podman processes
root@dlp:~# podman ps
a45d9a04eb16c35c28bf2c223a41613a99c4eaddba7e619decbe27e851eb906b


CONTAINER ID  IMAGE                            COMMAND     CREATED         STATUS         PORTS       NAMES
a45d9a04eb16  docker.io/library/ubuntu:latest  /bin/bash   16 seconds ago  Up 16 seconds              angry_driscoll

# attach to container session
root@dlp:~# podman exec -it a45d9a04eb16 /bin/bash
root@a45d9a04eb16:/#     # connected
root@a45d9a04eb16:/# exit
# stop container process
# * if force stop, specify [podman kill ***]
root@dlp:~# podman stop a45d9a04eb16
root@dlp:~# podman ps
CONTAINER ID  IMAGE   COMMAND  CREATED  STATUS  PORTS   NAMES

(02)Add Container Images

Podman:新增容器映象


  新增修改設定的新容器映像。

[1] 例如,使用安裝 [apache2] 更新官方映象,並將其新增為新的容器映象。

# show container images
root@dlp:~# podman images
REPOSITORY                TAG         IMAGE ID      CREATED     SIZE
docker.io/library/ubuntu  latest      bf3dc08bfed0  5 days ago  78.7 MB

# run a container and install [apache2]
root@dlp:~# podman run ubuntu /bin/bash -c "apt-get update; apt-get -y install apache2"
root@dlp:~# podman ps -a | tail -1
# add the image that [apache2] was installed
root@dlp:~# podman commit 8ba738311a1b srv.world/ubuntu-apache2
# show container images
root@dlp:~# podman images
# confirm [apache2] to run a container
root@dlp:~# podman run srv.world/ubuntu-apache2 /usr/bin/whereis apache2
apache2: /usr/sbin/apache2 /usr/lib/apache2 /etc/apache2 /usr/share/apache2
8ba738311a1b  docker.io/library/ubuntu:latest  /bin/bash -c apt-...  26 seconds ago  Exited (0) 8 seconds ago              intelligent_haibt

Getting image source signatures
Copying blob 80098e3d304c skipped: already exists
Copying blob 8b942a48c2d6 done   |
Copying config 38d5083368 done   |
Writing manifest to image destination
38d5083368637cec96e051ebe22f2b5776538eb9ad7dc2143f4d617896ec05f4

REPOSITORY                TAG         IMAGE ID      CREATED         SIZE
srv.world/ubuntu-apache2  latest      38d508336863  26 seconds ago  226 MB
docker.io/library/ubuntu  latest      bf3dc08bfed0  5 days ago      78.7 MB

(03)容器服務接入

Podman:訪問容器上的服務


  如果要訪問在容器上作為守護程式執行的 HTTP 或 SSH 等服務,請按如下方式進行配置。

[1] 例如,使用已安裝 [apache2] 的容器。

root@dlp:~# podman images
# run a container and also start [apache2]
# map with [-p xxx:xxx] to [(Host Port):(Container Port)]
root@dlp:~# podman run -dt -p 8081:80 --security-opt apparmor=unconfined srv.world/ubuntu-apache2 /usr/sbin/apachectl -D FOREGROUND
root@dlp:~# podman ps
REPOSITORY                TAG         IMAGE ID      CREATED             SIZE
srv.world/ubuntu-apache2  latest      38d508336863  About a minute ago  226 MB
docker.io/library/ubuntu  latest      bf3dc08bfed0  5 days ago          78.7 MB

77c61575ad7b23c0091e0744cf691d8fb28484bd52a3be00280456e64309b191


CONTAINER ID  IMAGE                            COMMAND               CREATED         STATUS         PORTS                 NAMES
77c61575ad7b  srv.world/ubuntu-apache2:latest  /usr/sbin/apachec...  14 seconds ago  Up 14 seconds  0.0.0.0:8081->80/tcp  affectionate_mirzakhani

# create a test page
root@dlp:~# podman exec 77c61575ad7b /bin/bash -c 'echo "Apache2 on Podman Container" > /var/www/html/index.html'
# verify accesses
root@dlp:~# curl localhost:8081
Apache2 on Podman Container
# also possible to access via container network
root@dlp:~# podman inspect -l | grep \"IPAddress
root@dlp:~# curl 10.88.0.7
Apache2 on Podman Container
            "IPAddress": "10.88.0.7",
                    "IPAddress": "10.88.0.7",

(04)使用Dockerfile

Podman:使用Dockerfile


  使用Dockerfile並自動建立容器映像。

  它對容器映像的配置管理也很有用。

[1] 例如,建立一個已安裝並啟動 Nginx 的 Dockerfile。

root@dlp:~# vi Dockerfile
# create new
FROM ubuntu
MAINTAINER ServerWorld <admin@srv.world>

RUN apt-get update
RUN apt-get -y install nginx
RUN echo "Dockerfile Test on Nginx" > /var/www/html/index.html

EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

# build image ⇒ podman build -t [image name]:[tag] .
root@dlp:~# podman build -t srv.world/ubuntu-nginx:latest .
root@dlp:~# podman images
# run container
root@dlp:~# podman run -d -p 80:80 --security-opt apparmor=unconfined srv.world/ubuntu-nginx
root@dlp:~# podman ps
STEP 1/7: FROM ubuntu
STEP 2/7: MAINTAINER ServerWorld <admin@srv.world>
--> f2fc42956ea5
STEP 3/7: RUN apt-get update

.....
.....

STEP 6/7: EXPOSE 80
--> 79117f75b19a
STEP 7/7: CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
COMMIT srv.world/ubuntu-nginx:latest
--> 1b1a4d3f4f26
Successfully tagged srv.world/ubuntu-nginx:latest
1b1a4d3f4f26fdac6a7556c81a8cee65bfdbaaeff204ccc700f16b91d83e8dec

REPOSITORY                TAG         IMAGE ID      CREATED             SIZE
srv.world/ubuntu-nginx    latest      1b1a4d3f4f26  About a minute ago  125 MB
srv.world/ubuntu-apache2  latest      38d508336863  37 minutes ago      226 MB
docker.io/library/ubuntu  latest      bf3dc08bfed0  5 days ago          78.7 MB

1628817a1fa315f96be582e324daf4fad31bc51f1ef015be6dd3f2d2750fb5fd


CONTAINER ID  IMAGE                          COMMAND               CREATED         STATUS         PORTS               NAMES
1628817a1fa3  srv.world/ubuntu-nginx:latest  /usr/sbin/nginx -...  18 seconds ago  Up 18 seconds  0.0.0.0:80->80/tcp  intelligent_chatterjee

# verify accesses
root@dlp:~# curl localhost
Dockerfile Test on Nginx
# also possible to access via container network
root@dlp:~# podman inspect -l | grep \"IPAddress
root@dlp:~# curl 10.88.0.2
Dockerfile Test on Nginx
            "IPAddress": "10.88.0.2",
                    "IPAddress": "10.88.0.2",

Dockerfile 的格式為 [INSTRUCTION arguments] 。

有關指令,請參閱以下說明。

指令 描述
FROM 它為後續指令設定基礎映像。
MAINTAINER 它設定生成影像的“作者”欄位。
RUN 它將在建立 Docker 映像時執行任何命令。
CMD 它將在執行 Docker 容器時執行任何命令。
ENTRYPOINT 它將在執行 Docker 容器時執行任何命令。
LABEL 它將後設資料新增到影像中。
EXPOSE 它通知 Docker 容器將在執行時偵聽指定的網路埠。
ENV 它設定環境變數。
ADD 它複製新檔案、目錄或遠端檔案 URL。
COPY 它複製新檔案或目錄。
[ADD]的區別在於無法指定遠端URL,也不會自動提取存檔檔案。
VOLUME 它建立一個具有指定名稱的掛載點,並將其標記為持有 從本機主機或其他容器外部掛載的卷。
USER 它設定使用者名稱或 UID。
WORKDIR 它設定工作目錄。

(05)使用外部儲存

(06)使用外部儲存(NFS)

(07)使用登錄檔

(08)Podman網路基礎

(09)使用Docker CLI

(10)使用Docker Compose

(11)建立Pod

(12)普通使用者使用

(13)生成Systemd單元檔案

(14)容器資源使用情況

相關文章