1. 简介
Podman 是一个开源的容器管理工具,其命令行接口与 Docker 兼容,可用于管理容器和镜像。它基于 Open Container Initiative(OCI)标准,确保与其他容器技术的兼容性。
大多数 Docker 命令在 Podman 中都能正常运行,这使得 Docker 用户迁移到 Podman 变得更加简单。由于 Podman 遵循 OCI 标准,它可以与 Docker 仓库中的镜像协同工作,因为两者都使用 OCI 镜像格式。无需特殊配置,Podman 即可从 Docker 仓库拉取或推送镜像。
在本教程中,我们将学习如何使用 Podman 将镜像推送到 Docker 仓库。
所有命令均在 Ubuntu 22.04 上测试通过。
2. 前置条件
在将容器镜像推送到 Docker 仓库之前,需确保机器上已安装 Podman。
使用以下命令检查 Podman 是否已安装:
$ podman --version
podman version 3.4.4
如果未安装,可在 Ubuntu(20.10 及以上版本)和 Debian 的官方仓库中安装:
$ sudo apt-get update
$ sudo apt-get -y install podman
对于 macOS 和 Windows 用户,推荐使用 Podman 官方安装包。
此外,你需要一个 Docker 仓库账号(如 Docker Hub 或 Quay.io),本教程将使用 Docker Hub 作为示例。
3. 创建一个简单的 NodeJS 应用
首先安装 NodeJS:
$ sudo apt install nodejs
创建项目目录并进入:
$ mkdir -p ~/podman-node-server
$ cd ~/podman-node-server
初始化 npm 并安装 express:
$ npm init -y
$ npm install express
创建 server.js
文件,内容如下:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello, Podman! This is Baeldung');
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
更新 package.json
文件,添加启动脚本:
{
"name": "podman-node-server",
"version": "1.0.0",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"keywords": [],
"author": ""
}
运行服务验证是否正常:
$ npm start
使用浏览器或 curl 测试:
$ curl localhost:3000
Hello, Podman! This is Baeldung
✅ 示例截图:NodeJS 服务在本地运行
4. 使用 Podman 构建 Dockerfile 镜像
Podman 完全兼容 Docker 的 Dockerfile 构建机制,语法与 Docker 一致:
podman build -t <imagename:tag> .
支持的功能包括:
✅ 所有标准 Dockerfile 指令(FROM、RUN、COPY 等)
✅ 多阶段构建
✅ BuildKit 特性(如 build secrets、SSH 转发)
✅ 构建时变量(ARG)
✅ 支持官方 Docker Hub 镜像
✅ 支持 VOLUME 和 EXPOSE 指令
在项目根目录创建 Dockerfile:
FROM node:14
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "node", "server.js" ]
构建镜像:
$ podman build -t podman-node-server:latest .
查看镜像:
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/podman-node-server latest 6bc75f05e543 2 days ago 946 MB
docker.io/library/node 14 1d12470fa662 17 months ago 937 MB
5. 推送镜像到 Docker Hub
运行镜像验证构建是否正确:
$ podman run -d -p 3000:3000 podman-node-server
查看容器状态:
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a95f9d4571a localhost/podman-node-server:latest node server.js 10 seconds ago Up 11 seconds ago 0.0.0.0:3000->3000/tcp adoring_banzai
登录 Docker Hub:
$ podman login docker.io
Username: afkzoro
Password:
推送镜像:
$ podman push 6bc75f05e543 docker://docker.io/afkzoro/podman-node-server
✅ 推送成功后可在 Docker Hub 查看
也可以使用 CLI 搜索:
$ podman search docker.io/afkzoro
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/afkzoro/python-hello-world 0
docker.io docker.io/afkzoro/podman-node-server 0
6. 总结
本教程中我们使用 Podman 完成了以下操作:
✅ 构建了一个 NodeJS 应用
✅ 编写 Dockerfile 并使用 Podman 构建镜像
✅ 运行并验证容器功能
✅ 登录 Docker Hub 并推送镜像
Podman 是一个无守护进程的容器引擎,兼容 Docker 命令,功能更强大,推荐作为 Docker 的替代方案使用。如果你希望避免使用 Docker daemon 或希望在更安全的环境中运行容器,Podman 是一个非常不错的选择。