告别 CentOS 后,在 Rocky Linux 8 上玩转 Docker:手把手教你数据持久化与镜像管理
Rocky Linux 8 上的 Docker 数据持久化与镜像管理实战指南当 CentOS 逐渐退出历史舞台Rocky Linux 8 正成为企业级 Linux 用户的新宠。作为 CentOS 的完美替代品Rocky Linux 不仅继承了 RHEL 的稳定性还提供了更灵活的开源生态支持。在这个迁移浪潮中Docker 作为容器化技术的代表其重要性不言而喻。本文将带你深入探索在 Rocky Linux 8 上使用 Docker 的两个核心技能数据持久化与镜像生命周期管理这些正是从 CentOS 迁移过来的用户最需要掌握的实用技术。1. Rocky Linux 8 上的 Docker 环境准备1.1 系统基础配置在开始 Docker 之旅前我们需要确保 Rocky Linux 8 系统处于最佳状态。首先更新系统所有软件包sudo dnf update -y接下来安装必要的工具集这些工具将为后续 Docker 安装和管理提供支持sudo dnf install -y yum-utils device-mapper-persistent-data lvm2注意Rocky Linux 8 使用 dnf 作为包管理器与 CentOS 8 保持一致但命令选项可能有细微差别。1.2 Docker 安装与配置添加 Docker CE 的官方仓库国内用户可替换为阿里云镜像源sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装 Docker 社区版及其相关组件sudo dnf install -y docker-ce docker-ce-cli containerd.io启动 Docker 服务并设置为开机自启sudo systemctl enable --now docker验证安装是否成功sudo docker version如果看到客户端和服务端的版本信息说明安装已完成。为了提升拉取镜像的速度建议配置国内镜像加速器sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://your-mirror.mirror.aliyuncs.com] } EOF sudo systemctl restart docker2. Docker 数据持久化实战2.1 理解 Docker 存储机制Docker 默认使用联合文件系统UnionFS来管理容器内的文件这种设计带来了轻量化的优势但也意味着当容器删除时其中的所有更改都会丢失。数据持久化通过将主机目录挂载到容器内部实现了数据在容器删除后依然保留主机与容器间的数据共享多容器访问同一数据源的可能性2.2 挂载主机目录的三种方式在 Docker 中实现数据持久化主要有以下三种挂载方式挂载类型命令选项特点适用场景匿名卷-v /容器路径Docker 自动创建匿名卷临时数据存储命名卷-v 卷名:/容器路径可管理的持久化存储数据库等需要长期保存的数据绑定挂载-v /主机路径:/容器路径直接映射主机目录开发环境、配置文件共享2.3 绑定挂载的详细操作绑定挂载是最直接的数据持久化方式特别适合开发环境和需要频繁修改的场景。以下是一个完整的示例# 在主机创建数据目录 mkdir -p ~/docker_data/webapp # 运行容器并挂载目录 docker run -d --name my_webapp \ -v ~/docker_data/webapp:/var/www/html \ -p 8080:80 \ nginx:latest这个命令做了以下几件事创建了一个名为 my_webapp 的容器将主机的 ~/docker_data/webapp 目录挂载到容器的 /var/www/html将容器的 80 端口映射到主机的 8080 端口使用 nginx:latest 镜像验证挂载是否成功# 在主机创建测试文件 echo Hello from Host ~/docker_data/webapp/test.txt # 进入容器查看 docker exec -it my_webapp bash cat /var/www/html/test.txt你应该能看到 Hello from Host 的输出证明挂载成功。2.4 数据卷的高级管理对于生产环境使用 Docker 数据卷Volume是更专业的选择。数据卷完全由 Docker 管理不依赖于主机的目录结构。创建并管理数据卷# 创建数据卷 docker volume create mydb_data # 查看数据卷详情 docker volume inspect mydb_data # 使用数据卷运行容器 docker run -d --name mysql_db \ -v mydb_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDsecret \ mysql:5.7 # 删除不再使用的数据卷 docker volume prune提示数据卷的实际存储位置通常在 /var/lib/docker/volumes/ 下但建议通过 Docker 命令管理而非直接操作这些目录。3. Docker 镜像全生命周期管理3.1 镜像的获取与查看获取镜像是使用 Docker 的第一步理解镜像的组成对后续管理至关重要。搜索 Docker Hub 上的可用镜像docker search nginx拉取特定版本的镜像不指定标签时默认为 latestdocker pull nginx:1.21查看本地镜像列表及详细信息docker images docker inspect nginx:1.21删除不再需要的镜像docker rmi nginx:1.21注意删除镜像前需确保没有容器在使用它包括已停止的容器。3.2 镜像的构建与优化除了从仓库拉取我们还可以通过 Dockerfile 构建自定义镜像。以下是一个高效的 Dockerfile 示例# 使用轻量级基础镜像 FROM alpine:3.14 # 设置元数据 LABEL maintaineryour.emailexample.com LABEL version1.0 # 安装必要软件 RUN apk add --no-cache nginx \ mkdir -p /run/nginx # 复制配置文件 COPY nginx.conf /etc/nginx/nginx.conf # 暴露端口 EXPOSE 80 # 设置启动命令 CMD [nginx, -g, daemon off;]构建镜像并优化层数docker build -t my_nginx:1.0 -f Dockerfile .镜像构建的优化技巧合并多个 RUN 指令减少层数使用 .dockerignore 文件排除不必要的上下文选择合适的基础镜像如 alpine 版本按照变更频率排序指令利用缓存3.3 镜像的导出与导入在离线环境或需要迁移时可以将镜像保存为文件# 导出镜像为tar文件 docker save -o nginx_image.tar nginx:1.21 # 从tar文件导入镜像 docker load -i nginx_image.tar对于只想复制文件系统而不需要历史记录和元数据的情况可以使用 export/import# 导出容器文件系统 docker export my_webapp webapp_fs.tar # 从文件系统创建新镜像 cat webapp_fs.tar | docker import - my_webapp:snapshot4. 容器管理高级技巧4.1 容器状态监控与调试了解容器的实时状态对于维护至关重要。以下命令可以帮助你深入掌握容器运行情况查看容器日志docker logs -f --tail 100 my_webapp监控容器资源使用docker stats my_webapp进入运行中容器的 shelldocker exec -it my_webapp bash检查容器详细配置docker inspect my_webapp | less4.2 容器网络与存储管理Docker 的网络模型提供了多种连接方式。创建自定义网络可以实现更好的隔离# 创建桥接网络 docker network create --driver bridge my_network # 将容器连接到网络 docker network connect my_network my_webapp # 查看网络详情 docker network inspect my_network对于存储除了基本的挂载还可以使用 tmpfs 实现内存中的临时存储docker run -d --name tmpfs_test \ --tmpfs /app/cache:size100m,mode1777 \ nginx:latest4.3 容器与镜像的转换将运行中的容器保存为新镜像docker commit -m Added custom config -a Your Name my_webapp my_nginx:custom这个命令会创建一个新的镜像包含容器当前的文件系统和运行状态。但要注意提交的镜像会丢失原始 Dockerfile 的构建历史最佳实践是尽量通过 Dockerfile 重建而非 commit提交前应清理不必要的临时文件和缓存比较容器与原始镜像的差异docker diff my_webapp这个命令会显示所有被修改、添加或删除的文件列表帮助理解容器状态变化。5. 生产环境最佳实践5.1 安全加固措施在生产环境运行 Docker 需要特别注意安全性避免使用 root 用户运行容器docker run -d --name secure_app \ --user 1000:1000 \ -v /path/on/host:/path/in/container \ nginx:latest限制容器资源使用docker run -d --name limited_app \ --memory512m \ --cpus1.5 \ --pids-limit100 \ nginx:latest定期扫描镜像漏洞docker scan nginx:latest5.2 自动化运维方案对于大规模部署可以考虑以下自动化方案使用 docker-compose 管理多容器应用version: 3.8 services: web: image: nginx:latest ports: - 8080:80 volumes: - ./web:/usr/share/nginx/html db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: secret volumes: - db_data:/var/lib/mysql volumes: db_data:启动整个堆栈docker-compose up -d设置日志轮转防止磁盘爆满sudo tee /etc/docker/daemon.json -EOF { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } } EOF sudo systemctl restart docker5.3 监控与日志集中管理生产环境需要完善的监控体系使用 cAdvisor 监控容器资源部署 Prometheus Grafana 可视化监控配置 ELK 栈集中管理日志设置适当的告警阈值一个简单的资源监控方案docker run -d \ --namecadvisor \ --volume/:/rootfs:ro \ --volume/var/run:/var/run:ro \ --volume/sys:/sys:ro \ --volume/var/lib/docker/:/var/lib/docker:ro \ --publish8081:8080 \ --detachtrue \ gcr.io/cadvisor/cadvisor:v0.47.0访问 http://localhost:8081 即可查看容器资源使用情况。