雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

如何在 Ubuntu 24.04 (Noble Numbat) 上安装 Podman

2024-07-01 137

您是否开始了学习和掌握容器化技术的旅程?您在研究“最好的容器管理引擎”时是否偶然发现了Podman? Podman 是一个免费使用的应用程序,可以管理容器和 Pod。借助其强大的命令行界面,您可以构建、查找、运行和管理容器的整个生命周期。 Podman 作为 Docker 更安全的替代方案而受到广泛关注。但与 docker 不同的是,podman 不需要后台运行的守护进程。

Podman 最初是在 containerd 的基础上构建的,并符合开放容器倡议 (OCI) 标准。它支持以下容器相关功能:

  • 容器镜像管理:使用 podman 构建容器镜像、推送到注册表或从注册表中拉取。
  • 容器化应用程序的运行run子命令用于从镜像运行容器、进入其shell并管理容器中的应用程序
  • 存储管理:Podman 允许您创建持久卷、附加到容器以及删除卷。
  • 网络管理:Podman 为您提供管理容器网络的命令。创建网桥,并将网络连接到应用程序。
  • Pod 管理:Podman 的主要关注点不是 Pod 管理,但它使您能够将容器组作为 Pod 进行管理。这与您在 Kubernetes 中获得的功能类似。

这篇文章的内容:

  • 如何在 Ubuntu 24.04 上安装 podman
  • 如何使用 Dockerfile 构建 Docker 镜像
  • 如何在 Podman 中运行容器
  • 如何在 Podman 容器中挂载外部存储
  • 如何在 Podman 中运行 pod
  • 如何在 Podman 中创建网络并与容器一起使用

1 – 在 Ubuntu 24.04 上安装 Podman

更新 Ubuntu 系统中的软件包列表。

sudo apt update

使用 Ubuntu 上可用的 apt 包管理工具安装 Podman。

sudo apt install podman -y

安装只需几秒钟。

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  aardvark-dns buildah catatonit conmon containernetworking-plugins crun fuse-overlayfs golang-github-containers-common golang-github-containers-image libslirp0 libsubid4 libyajl2 login netavark
  passt passwd slirp4netns uidmap
Suggested packages:
  containers-storage libwasmedge0 docker-compose
The following NEW packages will be installed:
  aardvark-dns buildah catatonit conmon containernetworking-plugins crun fuse-overlayfs golang-github-containers-common golang-github-containers-image libslirp0 libsubid4 libyajl2 netavark passt
  podman slirp4netns uidmap
The following packages will be upgraded:
  login passwd
2 upgraded, 17 newly installed, 0 to remove and 187 not upgraded.
Need to get 33.4 MB of archives.
After this operation, 130 MB of additional disk space will be used.
Get:1 http://ke.archive.ubuntu.com/ubuntu noble/main amd64 login amd64 1:4.13+dfsg1-4ubuntu3 [202 kB]
Get:2 http://ke.archive.ubuntu.com/ubuntu noble/main amd64 passwd amd64 1:4.13+dfsg1-4ubuntu3 [845 kB]
Get:3 http://ke.archive.ubuntu.com/ubuntu noble/universe amd64 netavark amd64 1.4.0-4 [1,666 kB]
8% [3 netavark 1,217 kB/1,666 kB 73%]
... 

2 – 使用 Dockerfile 构建您的应用程序

通过检查 Podman 的版本来验证其安装。

$ podman --version
podman version 4.9.3

让我们使用 Dockerfile 构建 Nginx Web 服务器镜像。创建一个名为 Dockerfile 的新文件

vim Dockerfile

添加以下内容 - 如果您有适合您自己的特定应用程序的 Dockerfile,请使用它。

FROM ubuntu
MAINTAINER Josphat Mutai <[email >

RUN apt update
RUN apt install nginx -y
RUN echo "Hello World from Podman" > /var/www/html/index.html

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

使用 podman build 命令构建容器镜像。

podman build -t nginx:latest .

这将下载 Ubuntu 基础镜像,安装 nginx 包,创建简单的 hello world 网页,并将服务运行的端口设置为 80。

....
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up nginx (1.18.0-6ubuntu14.4) ...
Processing triggers for libc-bin (2.35-0ubuntu3.6) ...
--> 10af6f97e841
STEP 5/7: RUN echo "Hello World from Podman" > /var/www/html/index.html
--> 5f7aff2e1220
STEP 6/7: EXPOSE 80
--> b506f58bddca
STEP 7/7: CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
COMMIT nginx:latest
--> 4bf25c100a11
Successfully tagged localhost/nginx:latest
4bf25c100a116551b0d727e827d560357f6a5edc15265e2fb7805f16677e2ecc

构建后,通过列出可用的容器映像进行确认。

$ podman images
REPOSITORY                TAG         IMAGE ID      CREATED         SIZE
localhost/nginx           latest      4bf25c100a11  40 seconds ago  188 MB
docker.io/library/ubuntu  latest      7af9ba4f0a47  10 days ago     80.4 MB

3 – 在容器中运行容器化应用程序

我们有一个容器映像,可用于创建应用程序的运行实例 - 这是一个容器。您可以使用 podman run 命令创建容器。

podman run -d -p 8080:80 --name nginx  localhost/nginx

-d 标志将指示 podman 在后台运行容器并分离,-p 8080 将服务绑定在本地主机端口号 8080 上。容器将有一个名称nginx

列出系统中正在运行的 Podman 容器。

$ podman ps
CONTAINER ID  IMAGE                   COMMAND               CREATED        STATUS        PORTS                 NAMES
40c59fdad9ae  localhost/nginx:latest  /usr/sbin/nginx -...  3 seconds ago  Up 3 seconds  0.0.0.0:8080->80/tcp  nginx

通过服务器IP端口8080访问应用程序的网页。

curl 命令还可用于通过 CLI 测试应用程序功能。

$ curl http://192.168.1.201:8080/
Hello World from Podman

4 – 在 Podman 容器中安装外部存储

如果删除容器,则其中存储的所有数据都会丢失。为了持久保存数据,需要外部存储。我们可以看看一些可用的选项。

1.使用本地目录

例如,我们在 /data 下创建一个目录

mkdir -p ~/data/container
echo "Test file for container data persistence"|tee ~/data/container/test.txt

要将目录挂载到容器中,请运行:

$ podman run -it -v ~/data/container:/mnt ubuntu /bin/bash
root@ebd6efbb01bf:/# cat  /mnt/test.txt
Test file for container data persistence

2. 使用 Podman 卷

Podman 卷将数据存储在 /var/lib/containers/storage/volumes/ 目录中。让我们创建一个测试卷来测试这一点。

podman volume create testvolume

您可以检查创建的卷以查看其安装点。

jkmutai@ubuntu-2404-server:~$ podman volume ls
DRIVER      VOLUME NAME
local       testvolume

jkmutai@ubuntu-2404-server:~$ podman volume inspect testvolume
[
     {
          "Name": "testvolume",
          "Driver": "local",
          "Mountpoint": "/home/jkmutai/.local/share/containers/storage/volumes/testvolume/_data",
          "CreatedAt": "2024-04-21T13:13:47.175944787Z",
          "Labels": {},
          "Scope": "local",
          "Options": {},
          "MountCount": 0,
          "NeedsCopyUp": true,
          "NeedsChown": true,
          "LockNumber": 3
     }
]

要安装卷,请使用以下命令。

$ podman run -it -v testvolume:/mnt ubuntu /bin/bash

通过列出容器中的安装点进行验证。

root@8bf46bd77811:/# df -hT
Filesystem                        Type     Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4      15G  5.7G  8.3G  41% /mnt
tmpfs                             tmpfs    392M  184K  392M   1% /etc/hosts
shm                               tmpfs     63M     0   63M   0% /dev/shm
overlay                           overlay   15G  5.7G  8.3G  41% /
tmpfs                             tmpfs     64M     0   64M   0% /dev

要删除卷,请运行:

podman volume rm testvolume

3.NFS文件系统

创建包含 NFS 访问信息的卷。

podman volume create \
--opt type=nfs4 \
--opt o=rw \
--opt device=192.168.1.22:/nfsshare nfsvolume 

在哪里;

  • 192.168.1.22是您的 NFS 服务器的 IP 地址
  • /nfsshare 是 NFS 共享上的导出路径 - NFS 共享。

现在,像任何其他卷一样将该卷安装在容器中。

 podman run -it -v nfsvolume:/nfsshare ubuntu

5 – 如何在 Podman 中运行 pod

创建一个 pod,其服务将在端口 8085

podman pod create -p 8085:80 -n mypod

列出已创建的 Pod。

$ podman pod ls
POD ID        NAME        STATUS      CREATED        INFRA ID      # OF CONTAINERS
fd73821c2dbb  mypod       Created     5 seconds ago  aaacb992072e  1

然后,您可以在 pod 内创建一个容器。

podman run -dt --pod mypod localhost/nginx

查看正在运行的容器

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS         PORTS                 NAMES
aaacb992072e  localhost/podman-pause:4.9.3-0                        About a minute ago  Up 19 seconds  0.0.0.0:8085->80/tcp  fd73821c2dbb-infra
e3d2331926fc  localhost/nginx:latest          /usr/sbin/nginx -...  19 seconds ago      Up 19 seconds  0.0.0.0:8085->80/tcp  heuristic_tu

测试服务。

$ curl localhost:8085
Hello World from Podman

我们创建多个容器,例如运行 Nginx 和 MySQL,如下所示。

podman run -dt --pod new:mypod2 -p 8086:80 -p 3306:3306 localhost/nginx
podman run -dt --pod mypod2 -e MYSQL_ROOT_PASSWORD=DBPassword docker.io/library/mariadb

列出容器

$ podman ps
CONTAINER ID  IMAGE                             COMMAND               CREATED             STATUS             PORTS                                         NAMES
aaacb992072e  localhost/podman-pause:4.9.3-0                          7 minutes ago       Up 6 minutes       0.0.0.0:8085->80/tcp                          fd73821c2dbb-infra
e3d2331926fc  localhost/nginx:latest            /usr/sbin/nginx -...  6 minutes ago       Up 6 minutes       0.0.0.0:8085->80/tcp                          heuristic_tu
54c1f7f605af  localhost/podman-pause:4.9.3-0                          About a minute ago  Up About a minute  0.0.0.0:3306->3306/tcp, 0.0.0.0:8086->80/tcp  1f3c516682fc-infra
38aec09c76dc  localhost/nginx:latest            /usr/sbin/nginx -...  About a minute ago  Up About a minute  0.0.0.0:3306->3306/tcp, 0.0.0.0:8086->80/tcp  competent_easley
543ebb2a4874  docker.io/library/mariadb:latest  mariadbd              26 seconds ago      Up 26 seconds      0.0.0.0:3306->3306/tcp, 0.0.0.0:8086->80/tcp  lucid_nash

测试可用性。

$ curl localhost:8086
Hello World from Podman

$ mysql -u root -p'DBPassword' -h 192.168.1.201 -e "show variables like 'hostname';"
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| hostname      | mypod2 |
+---------------+--------+

6 – 创建 Podman 网络

要创建具有子网 172.20.50.0/24 的新网络,请使用:

podman network create --subnet 172.20.50.0/24 network50

将其连接到容器上。

podman run --network network50 ubuntu /bin/bash

您可以将网络连接到正在运行的容器

 podman network connect <networkname> <container>

要断开连接,请使用:

 podman network disconnect <networkname> <container>

检查容器中的路由

 podman exec <container> /bin/bash -c "apt update; apt -y install iproute2; ip route"
podman exec <container> ip route

要完全删除网络,请使用:

podman network ls
podman network rm <networkname>
podman network rm -f <networkname>

更多 Podman 实际使用示例请参考 Podman 文档。


更新于:4个月前
赞一波!

文章评论

评论问答