AlmaLinux 10 容器技术指南
本指南详细介绍 AlmaLinux 10 上的容器技术,包括 Podman、Docker 的安装配置、最佳实践和企业级应用场景。
容器技术概览
AlmaLinux 10 容器生态
yaml
核心容器技术:
- Podman: 无守护进程容器引擎 (推荐)
- Docker: 传统容器平台
- Buildah: 容器镜像构建工具
- Skopeo: 容器镜像管理工具
容器编排:
- Kubernetes: 企业级容器编排
- OpenShift: Red Hat 容器平台
- Docker Compose: 单机多容器管理
存储和网络:
- CNI 插件: 容器网络接口
- CSI 驱动: 容器存储接口
- 多种存储后端支持
与其他发行版对比
特性 | AlmaLinux 10 | Ubuntu | Debian |
---|---|---|---|
默认容器引擎 | Podman | Docker | Docker |
无根容器 | ✅ 原生支持 | ✅ 需配置 | ✅ 需配置 |
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 run | podman run |
构建镜像 | docker build | podman build |
列出容器 | docker ps | podman ps |
查看日志 | docker logs | podman logs |
进入容器 | docker exec | podman exec |
多容器编排 | docker compose | podman-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 上构建高性能、安全的容器化应用环境。
相关文档: