Skip to content

AlmaLinux 10 容器技术指南

本指南详细介绍 AlmaLinux 10 上的容器技术,包括 Podman、Docker 的安装配置、最佳实践和企业级应用场景。

容器技术概览

AlmaLinux 10 容器生态

yaml
核心容器技术:
  - Podman: 无守护进程容器引擎 (推荐)
  - Docker: 传统容器平台
  - Buildah: 容器镜像构建工具
  - Skopeo: 容器镜像管理工具

容器编排:
  - Kubernetes: 企业级容器编排
  - OpenShift: Red Hat 容器平台
  - Docker Compose: 单机多容器管理

存储和网络:
  - CNI 插件: 容器网络接口
  - CSI 驱动: 容器存储接口
  - 多种存储后端支持

与其他发行版对比

特性AlmaLinux 10UbuntuDebian
默认容器引擎PodmanDockerDocker
无根容器✅ 原生支持✅ 需配置✅ 需配置
SELinux 集成✅ 深度集成❌ 不支持❌ 不支持
企业级安全✅ 强化版本✅ 基础版本✅ 基础版本
长期支持10年5年5年

Podman 容器引擎

Podman 安装和配置

基础安装

bash
# 安装 Podman 和相关工具
dnf install -y podman buildah skopeo

# 验证安装
podman --version
buildah --version
skopeo --version

# 查看系统信息
podman system info

容器镜像源配置

bash
# 配置国内镜像加速
cat > /etc/containers/registries.conf << 'EOF'
[registries.search]
registries = ['docker.io', 'quay.io', 'registry.redhat.io']

[registries.insecure]
registries = []

[registries.block]
registries = []

# 阿里云镜像加速
[[registry]]
prefix = "docker.io"
location = "docker.io"

[[registry.mirror]]
location = "registry.cn-hangzhou.aliyuncs.com"

# 中科大镜像加速
[[registry.mirror]]
location = "docker.mirrors.ustc.edu.cn"

# 网易镜像加速
[[registry.mirror]]
location = "hub-mirror.c.163.com"
EOF

# 重启 Podman 服务 (如果运行)
systemctl restart podman

基础容器操作

镜像管理

bash
# 搜索镜像
podman search nginx

# 拉取镜像
podman pull docker.io/library/nginx:latest
podman pull registry.almalinux.org/almalinux:10

# 列出本地镜像
podman images

# 查看镜像详细信息
podman inspect nginx:latest

# 删除镜像
podman rmi nginx:latest

容器生命周期管理

bash
# 运行容器
podman run -d --name webserver -p 80:80 nginx:latest

# 列出运行中的容器
podman ps

# 列出所有容器 (包括停止的)
podman ps -a

# 查看容器日志
podman logs webserver
podman logs -f webserver  # 实时跟踪日志

# 进入容器
podman exec -it webserver /bin/bash

# 停止容器
podman stop webserver

# 启动已停止的容器
podman start webserver

# 删除容器
podman rm webserver

# 强制删除运行中的容器
podman rm -f webserver

容器网络配置

bash
# 创建自定义网络
podman network create mynetwork

# 列出网络
podman network ls

# 查看网络详情
podman network inspect mynetwork

# 在指定网络中运行容器
podman run -d --name web1 --network mynetwork nginx
podman run -d --name web2 --network mynetwork nginx

# 端口映射
podman run -d -p 8080:80 -p 8443:443 --name webserver nginx

# 查看端口映射
podman port webserver

数据卷管理

绑定挂载

bash
# 挂载主机目录到容器
mkdir -p /host/data
podman run -d -v /host/data:/container/data --name datacontainer almalinux:10

# 只读挂载
podman run -d -v /host/data:/container/data:ro --name readonly-container almalinux:10

# 挂载配置文件
podman run -d -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro nginx

命名卷

bash
# 创建命名卷
podman volume create mydata

# 列出卷
podman volume ls

# 查看卷详情
podman volume inspect mydata

# 使用命名卷
podman run -d -v mydata:/data --name persistent-container almalinux:10

# 删除卷
podman volume rm mydata

容器镜像构建

使用 Dockerfile

bash
# 创建示例 Dockerfile
cat > Dockerfile << 'EOF'
FROM registry.almalinux.org/almalinux:10

# 安装依赖
RUN dnf update -y && \
    dnf install -y nginx && \
    dnf clean all

# 复制配置文件
COPY nginx.conf /etc/nginx/nginx.conf
COPY index.html /usr/share/nginx/html/

# 暴露端口
EXPOSE 80

# 启动命令
CMD ["nginx", "-g", "daemon off;"]
EOF

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

# 查看构建历史
podman history my-nginx:latest

使用 Buildah

bash
# 创建新的容器
buildah from almalinux:10

# 设置工作容器
CONTAINER=$(buildah from almalinux:10)

# 在容器中执行命令
buildah run $CONTAINER -- dnf install -y httpd
buildah run $CONTAINER -- systemctl enable httpd

# 配置容器
buildah config --port 80 $CONTAINER
buildah config --cmd "httpd -D FOREGROUND" $CONTAINER

# 提交为镜像
buildah commit $CONTAINER my-httpd:latest

# 清理
buildah rm $CONTAINER

多容器应用部署

使用 Podman Compose

bash
# 安装 podman-compose
dnf install -y python3-pip
pip3 install podman-compose

# 创建 docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: webapp
    volumes:
      - db_data:/var/lib/mysql

  redis:
    image: redis:latest
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data

volumes:
  db_data:
  redis_data:
EOF

# 启动服务
podman-compose up -d

# 查看服务状态
podman-compose ps

# 查看日志
podman-compose logs

# 停止服务
podman-compose down

使用 Pod 概念

bash
# 创建 Pod (类似 Kubernetes Pod)
podman pod create --name webapp-pod -p 80:80 -p 3306:3306

# 在 Pod 中运行容器
podman run -d --pod webapp-pod --name web nginx
podman run -d --pod webapp-pod --name db mysql:8.0

# 列出 Pod
podman pod ls

# 查看 Pod 详情
podman pod inspect webapp-pod

# 停止 Pod
podman pod stop webapp-pod

# 删除 Pod
podman pod rm webapp-pod

Docker 容器引擎

Docker 安装配置

安装 Docker Engine

bash
# 添加 Docker 仓库
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 启动 Docker 服务
systemctl enable --now docker

# 验证安装
docker --version
docker compose version

# 测试运行
docker run hello-world

Docker 配置优化

bash
# 配置 Docker 守护进程
cat > /etc/docker/daemon.json << 'EOF'
{
  "registry-mirrors": [
    "https://registry.cn-hangzhou.aliyuncs.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ],
  "storage-driver": "overlay2",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "live-restore": true,
  "userland-proxy": false,
  "experimental": false
}
EOF

# 重启 Docker 服务
systemctl restart docker

# 验证配置
docker system info

Docker 与 Podman 对比

命令对照表

功能Docker 命令Podman 命令
运行容器docker runpodman run
构建镜像docker buildpodman build
列出容器docker pspodman ps
查看日志docker logspodman logs
进入容器docker execpodman exec
多容器编排docker composepodman-compose

架构差异

yaml
Docker 架构:
  - 客户端-服务器架构
  - 需要 Docker 守护进程
  - root 权限运行守护进程
  - 集中式容器管理

Podman 架构:
  - 无守护进程架构
  - 直接与 OCI 运行时交互
  - 支持无根容器
  - 分布式容器管理

企业级容器最佳实践

安全性配置

无根容器配置

bash
# 配置普通用户运行容器
# 以非 root 用户身份执行以下命令

# 检查用户 namespace 配置
cat /etc/subuid
cat /etc/subgid

# 如果没有配置,添加用户映射
echo "username:100000:65536" >> /etc/subuid
echo "username:100000:65536" >> /etc/subgid

# 重新登录用户以使配置生效
# 然后运行无根容器
podman run -d --name rootless-nginx nginx

SELinux 容器安全

bash
# 检查 SELinux 状态
sestatus

# 查看容器相关的 SELinux 策略
semanage fcontext -l | grep container

# 为容器数据目录设置正确的 SELinux 标签
mkdir -p /opt/containers/data
semanage fcontext -a -t container_file_t "/opt/containers/data(/.*)?"
restorecon -R /opt/containers/data

# 运行容器时指定 SELinux 标签
podman run -d -v /opt/containers/data:/data:Z nginx

# 查看容器的 SELinux 上下文
podman exec containerid ls -Z /data

容器安全扫描

bash
# 安装 Trivy 安全扫描工具
dnf install -y wget
wget https://github.com/aquasecurity/trivy/releases/download/v0.45.0/trivy_0.45.0_Linux-64bit.rpm
dnf install -y ./trivy_0.45.0_Linux-64bit.rpm

# 扫描容器镜像漏洞
trivy image nginx:latest
trivy image almalinux:10

# 扫描文件系统
trivy fs /path/to/project

# 生成报告
trivy image --format json -o report.json nginx:latest

监控和日志

容器监控配置

bash
# 安装 cAdvisor
podman run -d \
  --name cadvisor \
  -p 8080:8080 \
  --privileged \
  --device /dev/kmsg \
  -v /:/rootfs:ro \
  -v /var/run:/var/run:ro \
  -v /sys:/sys:ro \
  -v /var/lib/docker/:/var/lib/docker:ro \
  -v /dev/disk/:/dev/disk:ro \
  gcr.io/cadvisor/cadvisor:latest

# 配置 Prometheus 监控
cat > prometheus.yml << 'EOF'
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['localhost:8080']
  
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['localhost:9100']
EOF

# 运行 Prometheus
podman run -d \
  --name prometheus \
  -p 9090:9090 \
  -v ./prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

集中化日志管理

bash
# 配置 rsyslog 接收容器日志
cat > /etc/rsyslog.d/30-docker.conf << 'EOF'
# Docker logging
$template DockerLogs,"/var/log/docker/%syslogtag:R,ERE,1,FIELD:([a-zA-Z0-9_-]+)--end%.log"
:syslogtag, startswith, "docker/" ?DockerLogs
& stop
EOF

systemctl restart rsyslog

# 配置容器使用 syslog 驱动
podman run -d \
  --log-driver syslog \
  --log-opt syslog-address=udp://localhost:514 \
  --log-opt tag="docker/{{.Name}}" \
  nginx

生产环境部署

高可用容器服务

bash
# 创建容器服务配置
cat > /etc/systemd/system/webapp.service << 'EOF'
[Unit]
Description=Web Application Container
After=network.target
Requires=network.target

[Service]
Type=exec
ExecStartPre=/usr/bin/podman pull nginx:latest
ExecStart=/usr/bin/podman run --rm --name webapp \
  -p 80:80 \
  -v /opt/webapp/html:/usr/share/nginx/html:ro \
  nginx:latest
ExecStop=/usr/bin/podman stop webapp
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

# 启用服务
systemctl enable --now webapp.service

# 检查服务状态
systemctl status webapp.service

容器备份和恢复

bash
# 导出容器为 tar 文件
podman export containerid > container-backup.tar

# 导出镜像
podman save -o image-backup.tar nginx:latest

# 导入镜像
podman load -i image-backup.tar

# 容器数据备份
podman run --rm \
  -v webapp_data:/source:ro \
  -v /backup:/backup \
  almalinux:10 \
  tar czf /backup/webapp-data-$(date +%Y%m%d).tar.gz -C /source .

# 恢复数据
podman run --rm \
  -v webapp_data:/target \
  -v /backup:/backup \
  almalinux:10 \
  tar xzf /backup/webapp-data-20241201.tar.gz -C /target

容器性能优化

资源限制和调优

CPU 和内存限制

bash
# 限制 CPU 使用
podman run -d \
  --cpus="1.5" \
  --memory="512m" \
  --name limited-container \
  nginx

# 设置 CPU 优先级
podman run -d \
  --cpu-shares=512 \
  --name low-priority \
  nginx

# 内存交换控制
podman run -d \
  --memory="1g" \
  --memory-swap="2g" \
  --name swap-controlled \
  nginx

# 查看容器资源使用
podman stats
podman stats --no-stream limited-container

存储性能优化

bash
# 使用 tmpfs 挂载
podman run -d \
  --tmpfs /tmp:rw,size=100m \
  --name fast-tmp \
  nginx

# 配置存储驱动选项
cat > /etc/containers/storage.conf << 'EOF'
[storage]
driver = "overlay"

[storage.options.overlay]
mountopt = "nodev,metacopy=on"
EOF

# 清理未使用的镜像和容器
podman system prune -f
podman image prune -f

网络性能优化

网络配置调优

bash
# 使用 host 网络模式 (最佳性能)
podman run -d --network host nginx

# 优化容器网络
cat > /etc/cni/net.d/10-podman.conflist << 'EOF'
{
  "cniVersion": "0.4.0",
  "name": "podman",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "cni-podman0",
      "isGateway": true,
      "ipMasq": true,
      "hairpinMode": true,
      "ipam": {
        "type": "host-local",
        "routes": [{"dst": "0.0.0.0/0"}],
        "ranges": [
          [{"subnet": "10.88.0.0/16", "gateway": "10.88.0.1"}]
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true}
    },
    {
      "type": "firewall"
    },
    {
      "type": "tuning"
    }
  ]
}
EOF

故障排查和调试

常见问题解决

容器无法启动

bash
# 查看详细错误信息
podman logs containerid

# 检查容器配置
podman inspect containerid

# 调试模式运行
podman run -it --rm nginx /bin/bash

# 检查镜像层
podman history nginx:latest

网络连接问题

bash
# 检查网络配置
podman network ls
podman network inspect podman

# 测试网络连通性
podman run --rm -it busybox ping 8.8.8.8

# 检查端口占用
ss -tlnp | grep :80

性能问题诊断

bash
# 实时监控容器资源使用
podman stats

# 检查系统资源
top
iotop
iftop

# 容器内进程分析
podman exec containerid top
podman exec containerid ps aux

总结: AlmaLinux 10 提供了完整的容器技术栈,Podman 作为默认容器引擎提供了更安全的无守护进程架构,而 Docker 仍然可用于需要兼容性的场景。通过合理的配置和优化,可以在 AlmaLinux 10 上构建高性能、安全的容器化应用环境。

相关文档:

基于 MIT 许可发布