Podman教程#

技术介绍#

Podman(Pod Manager)是一种开源的容器管理工具,它提供了与Docker兼容的命令行界面,但不需要守护进程。Podman可以在没有root权限的情况下运行容器,提供了更好的安全性。

Podman核心概念#

  • 容器:运行在隔离环境中的应用
  • Pod:一组共享网络和存储的容器
  • 镜像:容器的只读模板
  • :持久化存储
  • 网络:容器间通信
  • 镜像仓库:存储和分发镜像

Podman架构#

  • 无守护进程:Podman直接与容器运行时和Linux内核交互,不需要守护进程
  • Rootless容器:支持在没有root权限的情况下运行容器
  • Docker兼容:提供与Docker兼容的命令行界面
  • 集成Pod:原生支持Kubernetes Pod概念

入门级使用#

安装Podman#

在不同操作系统上安装Podman:

# Ubuntu/Debian
apt-get update
apt-get install podman

# CentOS/RHEL
yum install podman

# Fedora
dnf install podman

# 验证安装
podman --version
podman info

基本Podman命令#

使用Podman的基本命令:

# 查看Podman版本
podman --version

# 查看Podman信息
podman info

# 搜索镜像
podman search ubuntu

# 拉取镜像
podman pull ubuntu:20.04

# 查看本地镜像
podman images

# 运行容器
podman run -it --name mycontainer ubuntu:20.04 /bin/bash

# 查看运行中的容器
podman ps

# 查看所有容器
podman ps -a

# 停止容器
podman stop mycontainer

# 启动容器
podman start mycontainer

# 删除容器
podman rm mycontainer

# 删除镜像
podman rmi ubuntu:20.04

容器操作#

操作Podman容器:

# 进入运行中的容器
podman exec -it mycontainer /bin/bash

# 查看容器日志
podman logs mycontainer

# 查看容器详细信息
podman inspect mycontainer

# 复制文件到容器
podman cp localfile.txt mycontainer:/path/to/destination/

# 从容器复制文件
podman cp mycontainer:/path/to/source/file.txt localfile.txt

# 导出容器
podman export mycontainer > container.tar

# 导入容器
podman import container.tar newimage:latest

初级使用#

Podman网络#

使用Podman网络:

# 查看Podman网络
podman network ls

# 创建Podman网络
podman network create mynetwork

# 运行容器时指定网络
podman run -it --name container1 --network mynetwork ubuntu:20.04 /bin/bash
podman run -it --name container2 --network mynetwork ubuntu:20.04 /bin/bash

# 查看网络详细信息
podman network inspect mynetwork

# 删除Podman网络
podman network rm mynetwork

Podman卷#

使用Podman卷:

# 创建Podman卷
podman volume create myvolume

# 查看Podman卷
podman volume ls

# 运行容器时挂载卷
podman run -it --name mycontainer -v myvolume:/data ubuntu:20.04 /bin/bash

# 查看卷详细信息
podman volume inspect myvolume

# 删除Podman卷
podman volume rm myvolume

# 清理未使用的卷
podman volume prune

Podman Pod#

使用Podman Pod:

# 创建Pod
podman pod create --name mypod

# 查看Pod
podman pod ls

# 在Pod中运行容器
podman run -d --pod mypod --name web nginx:latest
podman run -d --pod mypod --name db postgres:12

# 查看Pod中的容器
podman pod inspect mypod

# 停止Pod
podman pod stop mypod

# 删除Pod
podman pod rm mypod

中级使用#

Podmanfile#

使用Podmanfile构建镜像:

# 使用官方Ubuntu镜像作为基础
FROM ubuntu:20.04

# 维护者信息
LABEL maintainer="yourname@example.com"

# 更新软件包列表
RUN apt-get update && apt-get install -y \
    curl \
    wget \
    git \
    && rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /app

# 复制文件到容器
COPY . /app

# 暴露端口
EXPOSE 8080

# 定义环境变量
ENV APP_ENV=production

# 容器启动时执行的命令
CMD ["/bin/bash"]

构建和运行镜像:

# 构建镜像
podman build -t myapp:latest .

# 运行容器
podman run -it --name myapp -p 8080:8080 myapp:latest

Podman Compose#

使用Podman Compose管理多容器应用:

# 安装Podman Compose
pip3 install podman-compose

# 创建docker-compose.yml
cat > docker-compose.yml <<EOF
version: '3'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - db
  db:
    image: postgres:12
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
EOF

# 启动应用
podman-compose up -d

# 查看服务状态
podman-compose ps

# 查看服务日志
podman-compose logs

# 停止服务
podman-compose down

Rootless容器#

使用Rootless容器:

# 检查当前用户
whoami

# 配置Rootless容器
podman unshare cat /etc/subuid
podman unshare cat /etc/subgid

# 运行Rootless容器
podman run -it --name rootless-container ubuntu:20.04 /bin/bash

# 查看容器状态
podman ps

# 查看容器用户
podman exec rootless-container whoami

中上级使用#

Podman安全最佳实践#

Podman安全最佳实践:

# 使用非root用户运行容器
podman run -it --name secure-container --user 1000:1000 ubuntu:20.04 /bin/bash

# 限制容器资源
podman run --memory=128m --cpus=0.5 --name limited-container ubuntu:20.04

# 使用只读文件系统
podman run --read-only --name readonly-container ubuntu:20.04

# 限制容器能力
podman run --cap-drop=ALL --name limited-capabilities ubuntu:20.04

# 使用SELinux
podman run --security-opt label=type:container_runtime_t --name selinux-container ubuntu:20.04

Podman镜像管理#

管理Podman镜像:

# 查看镜像历史
podman history ubuntu:20.04

# 查看镜像元数据
podman inspect ubuntu:20.04

# 标签镜像
podman tag ubuntu:20.04 myregistry.com/ubuntu:20.04

# 推送镜像到仓库
podman push myregistry.com/ubuntu:20.04

# 从仓库拉取镜像
podman pull myregistry.com/ubuntu:20.04

# 清理未使用的镜像
podman image prune

Podman与Kubernetes集成#

将Podman与Kubernetes集成:

# 创建Pod YAML文件
cat > pod.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: web
    image: nginx:latest
    ports:
    - containerPort: 80
  - name: db
    image: postgres:12
    env:
    - name: POSTGRES_PASSWORD
      value: password
EOF

# 使用Podman播放Kubernetes YAML
podman play kube pod.yaml

# 查看Pod
podman pod ls

# 停止Pod
podman pod stop mypod

# 导出Pod为Kubernetes YAML
podman generate kube mypod > pod-exported.yaml

高级使用#

Podman远程操作#

远程操作Podman:

# 在服务器上启用Podman远程API
systemctl enable --now podman.socket

# 在客户端配置远程连接
cat > ~/.config/containers/containers.conf <<EOF
[engine]
  enabled = true
[engine.service_destinations]
  [engine.service_destinations.ssh]
    uri = "ssh://user@server:22/run/user/1000/podman/podman.sock"
EOF

# 远程运行容器
podman --remote run -it ubuntu:20.04 /bin/bash

# 远程查看容器
podman --remote ps

Podman监控和日志管理#

监控Podman容器:

# 使用Podman stats查看容器资源使用情况
podman stats

# 配置容器日志
podman run --log-driver=journald --name logged-container ubuntu:20.04

# 查看容器日志
podman logs logged-container

# 使用Prometheus监控Podman
podman run -d --name prometheus \
  -p 9090:9090 \
  -v ./prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

Podman企业级部署#

企业级Podman部署:

# 配置镜像仓库
cat > /etc/containers/registries.conf <<EOF
[[registry]]
location = "myregistry.com"
EOF

# 配置证书
mkdir -p /etc/containers/certs.d/myregistry.com
cp cert.pem /etc/containers/certs.d/myregistry.com/

# 配置认证
podman login myregistry.com

# 部署应用
podman run -d --name app \
  -p 80:80 \
  --restart=always \
  myregistry.com/app:latest

# 配置健康检查
podman run -d --name healthy-app \
  --health-cmd="curl -f http://localhost/ || exit 1" \
  --health-interval=30s \
  --health-timeout=10s \
  --health-retries=3 \
  nginx:latest

大师级使用#

Podman与GitLab CI集成#

将Podman与GitLab CI集成:

# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - podman build -t myregistry.com/myapp:$CI_COMMIT_SHA .
    - podman push myregistry.com/myapp:$CI_COMMIT_SHA

test:
  stage: test
  script:
    - podman run --name test-container myregistry.com/myapp:$CI_COMMIT_SHA npm test

deploy:
  stage: deploy
  script:
    - podman pull myregistry.com/myapp:$CI_COMMIT_SHA
    - podman run -d --name myapp -p 80:80 myregistry.com/myapp:$CI_COMMIT_SHA
  only:
    - main

Podman集群管理#

使用Podman管理多节点:

# 在多个节点上安装Podman
# 节点1
ssh node1 "apt install podman"

# 节点2
ssh node2 "apt install podman"

# 节点3
ssh node3 "apt install podman"

# 部署应用到多个节点
podman run -d --name app1 -p 8080:80 node1:myapp:latest
podman run -d --name app2 -p 8081:80 node2:myapp:latest
podman run -d --name app3 -p 8082:80 node3:myapp:latest

# 使用负载均衡器
podman run -d --name haproxy \
  -p 80:80 \
  -v ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
  haproxy:latest

Podman安全审计#

进行Podman安全审计:

# 检查容器安全配置
podman inspect --format '{{.HostConfig.SecurityOpt}}' mycontainer

# 检查容器能力
podman inspect --format '{{.HostConfig.CapAdd}}' mycontainer

# 检查容器权限
podman inspect --format '{{.Config.User}}' mycontainer

# 使用Trivy扫描镜像漏洞
podman run --rm -v /var/run/podman/podman.sock:/var/run/docker.sock \
  aquasec/trivy image myapp:latest

# 使用Podman Bench进行安全检查
# 下载Podman Bench脚本
wget https://raw.githubusercontent.com/containers/podman/main/contrib/podman-bench/podman-bench.sh
chmod +x podman-bench.sh
./podman-bench.sh

实战案例#

案例一:部署Web应用#

场景:部署一个基于Node.js的Web应用。

解决方案:使用Podman构建和运行Web应用。

实施步骤

  1. 创建Podmanfile

    FROM node:14-alpine
    
    WORKDIR /app
    
    COPY package*.json ./
    RUN npm install --only=production
    
    COPY . .
    
    EXPOSE 3000
    
    CMD ["npm", "start"]
  2. 构建镜像

    podman build -t node-app:latest .
  3. 创建Pod并运行容器

    # 创建Pod
    podman pod create --name node-app-pod -p 3000:3000
    
    # 运行应用容器
    podman run -d --pod node-app-pod --name web node-app:latest
    
    # 运行数据库容器
    podman run -d --pod node-app-pod --name db \
      -e MONGO_INITDB_ROOT_USERNAME=admin \
      -e MONGO_INITDB_ROOT_PASSWORD=password \
      mongo:4.4

结果

  • 成功构建了Node.js应用的Podman镜像
  • 创建了包含Web应用和MongoDB数据库的Pod
  • 应用可以通过http://localhost:3000访问

案例二:Rootless容器部署#

场景:在没有root权限的情况下部署容器。

解决方案:使用Podman的Rootless容器功能。

实施步骤

  1. 配置用户映射

    # 检查用户映射
    cat /etc/subuid
    cat /etc/subgid
    
    # 如果没有映射,添加映射
    sudo usermod --add-subuids 100000-165535 $USER
    sudo usermod --add-subgids 100000-165535 $USER
  2. 重启会话

    # 注销并重新登录,或重启系统
  3. 运行Rootless容器

    # 运行Rootless容器
    podman run -d --name rootless-nginx -p 8080:80 nginx:latest
    
    # 查看容器
    podman ps
    
    # 验证容器以非root用户运行
    podman exec rootless-nginx whoami

结果

  • 成功配置了Rootless容器
  • 运行了非root权限的Nginx容器
  • 应用可以通过http://localhost:8080访问

案例三:Podman与Kubernetes集成#

场景:使用Podman管理Kubernetes Pod。

解决方案:使用Podman的Kubernetes集成功能。

实施步骤

  1. 创建Kubernetes Pod YAML

    # pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: k8s-pod
    spec:
      containers:
      - name: web
        image: nginx:latest
        ports:
        - containerPort: 80
      - name: redis
        image: redis:latest
        ports:
        - containerPort: 6379
  2. 使用Podman播放Kubernetes YAML

    podman play kube pod.yaml
  3. 查看Pod

    podman pod ls
    podman ps
  4. 导出Pod为Kubernetes YAML

    podman generate kube k8s-pod > exported-pod.yaml

结果

  • 成功使用Podman播放Kubernetes YAML
  • 创建了包含Nginx和Redis的Pod
  • 导出了Pod配置为Kubernetes YAML

总结#

Podman是一种强大的容器管理工具,通过本教程的学习,您已经掌握了从入门到大师级的Podman使用技术。

主要技术回顾#

  • 基础操作:Podman的基本命令和操作
  • 容器管理:创建、启动、停止和删除容器
  • Pod管理:创建和管理Pod
  • 镜像管理:构建、标记和推送镜像
  • 网络配置:配置Podman网络
  • 存储配置:使用Podman卷
  • 高级功能:Rootless容器、Kubernetes集成、远程操作
  • 企业级应用:安全最佳实践、监控、CI/CD集成

最佳实践#

  1. 使用Rootless容器:尽可能使用Rootless容器,提高安全性
  2. 网络隔离:为不同的应用创建独立的网络,提高安全性
  3. 存储管理:使用适当的存储后端,支持快照和备份
  4. 资源限制:为容器设置适当的资源限制,避免资源争用
  5. 安全配置:使用非特权容器,配置SELinux,提高安全性
  6. 监控容器:使用Prometheus等工具监控容器状态
  7. 自动化部署:与CI/CD集成,实现自动化构建、测试和部署
  8. 定期更新:定期更新Podman版本,获取最新的安全补丁和功能

注意事项#

  1. 兼容性:Podman与Docker命令兼容,但有些功能可能有所不同
  2. 权限管理:Rootless容器需要正确配置用户映射
  3. 网络配置:合理配置网络,确保容器间通信安全
  4. 存储管理:定期清理未使用的镜像、容器和卷,释放存储空间
  5. 安全审计:定期进行Podman安全审计,发现和修复安全问题
  6. 备份策略:制定容器数据备份策略,确保数据安全
  7. 灾难恢复:建立容器环境的灾难恢复计划,应对突发情况

通过合理学习和使用Podman,您可以获得与Docker相似的体验,但具有更好的安全性和不需要守护进程的优势。Podman是容器技术的重要发展方向,掌握Podman技术将为您的职业发展带来更多机会。