目录
简介
一、Docker概念
1.1 什么是Docker容器技术
1.2 Docker与传统虚拟化的区别
1.3 Docker的核心优势
二、CentOS系统Docker环境部署
2.1 准备工作:系统配置
2.2 配置阿里云镜像仓库
2.3 安装Docker引擎
2.4 内核参数优化
三、Docker镜像操作
3.1 获取镜像:从仓库拉取资源
3.2 查看镜像信息:管理本地镜像库
3.3 镜像标签管理:为镜像添加别名
3.4 镜像删除与迁移:清理和备份镜像
四、Docker容器操作
4.1 容器创建与启动
4.2 容器状态管理
4.3 容器交互与调试
4.4 容器迁移与备份
五、Docker数据卷管理
5.1 数据卷基础操作
5.2 容器与数据卷挂载
六、总结
6.1 典型应用场景
6.2 下一步学习建议
Docker作为当前最流行的容器化技术,彻底改变了应用程序的开发、测试和部署方式。本文将从Docker的核心概念出发,逐步引导你完成环境搭建,并深入掌握镜像与容器的操作技巧,为后续的容器化应用开发奠定坚实基础。
Docker是一种轻量级的操作系统级虚拟化技术,它能够将应用程序及其依赖项打包成一个独立的容器单元。这个容器就像一个"盒子",里面包含了运行应用所需的所有资源:代码、运行时环境、系统工具和库文件等。
与传统虚拟机不同,Docker容器共享宿主机的操作系统内核,因此具有轻量、启动快速的特点。这种设计使得单个物理主机可以同时运行数千个容器,极大提高了资源利用率。
特性 |
Docker容器 |
传统虚拟机 |
启动速度 |
秒级 |
分钟级 |
资源占用 |
几乎无额外开销 |
损耗约50%系统资源 |
单机支持量 |
上千个容器 |
几十个虚拟机 |
隔离级别 |
资源级隔离 |
操作系统级完全隔离 |
首先需要对系统进行基础配置,确保Docker能正常运行:
# 关闭防火墙
systemctl stop firewalld # 停止防火墙服务
systemctl disable firewalld # 禁止防火墙开机自启
# 关闭SELinux
setenforce 0 # 临时关闭SELinux
sed -i 's/=enforcing/=disabled/' /etc/selinux/config # 永久关闭
解释:防火墙和SELinux可能会干扰Docker的网络功能和文件访问,因此需要提前关闭。setenforce 0
是临时生效,修改配置文件则是永久生效。
使用国内镜像源可以显著提高下载速度:
# 下载Docker官方YUM仓库配置
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 修改仓库配置,适配CentOS 8
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo
# 清除旧缓存并生成新索引
dnf clean all
dnf makecache
解释:默认的Docker官方仓库在国内访问速度较慢,通过阿里云镜像源可以加速下载。$releasever
变量替换为8以适配CentOS 8系统,$basearch
指定64位架构。
完成仓库配置后,即可安装Docker:
# 安装Docker CE稳定版
dnf -y install docker-ce
# 配置国内镜像加速
mkdir -p /etc/docker
cat >/etc/docker/daemon.json <
解释:daemon.json
配置文件中指定了国内镜像加速器地址,解决Docker Hub访问受限问题。native.cgroupdriver=systemd
确保Docker与CentOS的cgroup驱动兼容。docker version
命令会显示客户端和服务端版本信息,确认安装成功。
为了支持Docker的高级网络功能,需要优化内核参数:
# 添加内核参数
cat >>/etc/sysctl.conf<
解释:ip_forward=1
启用IP转发,支持容器间网络通信;桥接相关参数确保Docker容器的网络防火墙规则正常工作。
# 拉取指定版本的Nginx镜像
docker pull nginx:1.24.0
# 拉取仓库中所有标签的镜像
docker pull -a nginx
# 通过摘要精确拉取镜像
docker pull nginx@sha256:abcdef1234567890
解释:docker pull
命令从镜像仓库下载镜像。不指定标签时默认拉取latest
版本;-a
参数用于获取一个镜像的所有版本;摘要(DIGEST)是镜像的唯一哈希标识,确保拉取精确版本。
# 列出本地所有镜像
docker images
# 显示镜像详细JSON信息
docker inspect nginx:1.24.0
# 只显示镜像ID
docker images -q nginx
# 过滤显示虚悬镜像(无标签镜像)
docker images -f dangling=true
解释:docker images
输出包含仓库名、标签、镜像ID、大小等信息;docker inspect
返回底层详细数据,常用于调试;-q
参数在脚本中便于批量处理;dangling=true
过滤出构建失败或未正确标记的镜像。
# 为镜像添加新标签
docker tag nginx:1.24.0 nginx:v1
# 查看重命名后的镜像
docker images nginx
解释:docker tag
不会创建新镜像,只是为现有镜像添加别名。例如将nginx:1.24.0
标记为nginx:v1
,便于版本管理和识别。
# 通过标签删除镜像
docker rmi nginx:v1
# 通过ID强制删除镜像
docker rmi -f c15a2b3c4d5e
# 导出镜像为tar包
docker save -o nginx.tar nginx:1.24.0
# 从tar包导入镜像
docker load < nginx.tar
注意事项:删除镜像前需确保没有容器依赖该镜像(可用docker ps -a
检查);docker save
保存的镜像包含所有层信息,适合跨环境迁移;镜像删除是不可逆操作,执行前请确认。
# 创建交互式容器(未启动)
docker create -it centos:7
# 直接创建并启动容器
docker run -d -p 8080:80 nginx:1.24.0
# 带卷挂载的容器启动
docker run -v /data:/usr/share/nginx/html -d nginx:1.24.0
参数解析:
-i
:保持标准输入打开,支持交互-t
:分配伪终端,模拟交互式环境-d
:后台运行容器-p 8080:80
:将容器80端口映射到宿主机8080端口-v /data:/usr/share/nginx/html
:挂载宿主机目录到容器内# 启动已创建的容器
docker start container_id
# 停止容器(等待10秒后强制终止)
docker stop container_id
# 强制终止容器
docker kill container_id
# 删除停止的容器
docker rm container_id
# 强制删除运行中的容器
docker rm -f container_id
最佳实践:停止容器时优先使用docker stop
,给应用程序足够时间处理事务;删除容器前确保数据已备份或持久化存储。
# 进入容器的交互式shell
docker exec -it container_id /bin/bash
# 执行单次命令并查看输出
docker exec container_id ls /etc
# 查看容器日志
docker logs -f container_id
解释:docker exec
允许在运行中的容器内执行命令,-it
参数组合提供交互式终端;docker logs
用于查看容器内应用的输出日志,-f
参数实时跟踪日志更新。
# 导出容器文件系统为tar包
docker export container_id > centos7.tar
# 从tar包导入生成新镜像
cat centos7.tar | docker import - centos7:exported
# 对比export与save:
# docker save保存镜像所有层(包括历史)
# docker export仅保存容器当前文件系统
应用场景:当需要将配置好的容器迁移到其他环境时,export
和import
是常用方案。但需注意export
不保留镜像历史,导入后生成的新镜像需要重新标记。
# 创建命名数据卷
docker volume create my_vol
# 查看所有数据卷
docker volume ls
# 查看数据卷详细信息
docker volume inspect my_vol
# 删除闲置数据卷
docker volume prune
解释:数据卷是独立于容器生命周期的持久化存储,即使容器删除,数据卷中的数据依然保留。docker volume prune
会删除所有未被容器使用的数据卷。
# 挂载宿主机目录到容器
docker run -v /host/path:/container/path nginx:1.24.0
# 挂载命名数据卷到容器
docker run -v my_vol:/usr/share/nginx/html nginx:1.24.0
# 只读挂载(容器无法修改数据)
docker run -v /host/path:/container/path:ro nginx:1.24.0
最佳实践:对于数据库等需要持久化存储的应用,建议使用命名数据卷而非宿主机目录,以保证跨主机迁移的兼容性;敏感配置文件建议使用只读挂载。
Docker作为云原生技术的基石,其价值不仅在于应用容器化,更在于它推动了软件开发、测试和部署流程的全面革新。
掌握本文内容后,建议进一步学习:
接下来建议通过实战项目巩固所学知识,例如将一个Java Web应用容器化,或者搭建基于Docker的微服务架构。随着学习的深入,你会发现Docker与Kubernetes、Prometheus等技术的结合将释放出更大的技术能量,为构建弹性、可扩展的现代应用系统奠定基础。