如何在 Ubuntu 24.04 (Noble Numbat) 上安装 Podman
您是否开始了学习和掌握容器化技术的旅程?您在研究“最好的容器管理引擎”时是否偶然发现了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个月前
相关文章
- 【说站】Java如何在PDF添加注释
- 【说站】java软引用如何在浏览器使用
- 如何在 JavaScript 中使用正则表达式删除 HTML 标签?
- linux的shell脚本中如何在一个字符串中查找指定字符串是否存在
- 你如何在 Python 中循环字典?
- 如何在 Anaconda 中安装 Python 包?
- 你如何在 Python 中编写自动售货机代码?
- 如何在 Python 中读取 .data 文件?
- 如何在 Python 中创建静态类数据和静态类方法?
- 如何在 Python 中使用 Matplotlib 创建一个空的 Figure?
- 如何在 seaborn 中创建三角相关热图?
- 如何在Python中创建AGE计算器Web App PyWebIO?
- 如何在 Python 中只删除空文件夹?
- 如何在 Pandas 中创建一个空的数据帧并向其附加行和列?
- 如何在 Django 中创建抽象模型类?
- 如何在 Python 中使用 Pillow 连接图像?
- 如何在 Python 中将嵌套的 OrderedDict 转换为 Dict?
- 如何在 Python 中将分类特征转换为数字特征?
- 如何在 Django 中使用 MVT 创建一个基本项目?
- 如何在 Python 中终止 Windows 上运行的进程?