一、Docker 核心定位:跨环境迁移的 "环境一致性" 救星
Docker 是基于 Go 语言开发的开源应用级虚拟化引擎,核心使命是解决软件跨环境迁移时的 "环境不一致" 问题------ 让应用从开发、测试到生产环境实现 "一次构建,到处运行",彻底规避因环境差异导致的各类诡异 Bug。
二、传统部署的 4 大痛点
- 环境不一致:开发用 JDK1.8,测试用 JDK1.7,代码上线直接冲突;
- 依赖管理复杂:不同应用依赖不同版本的库文件,容易出现 "版本兼容地狱";
- 资源利用率低:传统虚拟机需安装完整操作系统,占用大量内存、磁盘资源;
- 部署流程繁琐:手动配置环境、安装依赖,步骤多易出错,效率极低。
三、Docker 容器化的 4 大核心优势
- 环境标准化:将应用、依赖、配置打包成镜像,任何支持 Docker 的环境都能一致运行;
- 轻量级高效:容器共享宿主机操作系统内核,无需额外占用系统资源,启动速度达秒级;
- 快速可移植:一次构建镜像,可在开发机、测试服务器、云服务器等任意环境部署;
- 简化部署:无需手动配置环境,直接通过镜像启动容器,部署流程标准化、自动化。
四、Docker 核心理念:不可变基础设施
- 应用与运行环境打包为不可修改的镜像,每次部署使用相同镜像,避免 "人工配置差异";
- 运行时配置通过环境变量或外部配置文件注入,不修改镜像本身;
- 问题修复需重新构建镜像,而非直接修改运行中的容器,确保环境可追溯、可复现。
五、Docker 整体架构(5 大核心组件)
| 组件 | 作用说明 |
|---|---|
| Clients(客户端) | 接收用户指令(如 docker run、docker pull),传递给 Docker 守护进程执行 |
| Hosts(主机) | 运行 Docker 守护进程和容器的服务器(本地主机 / 远程主机均可) |
| Image(镜像) | 容器的 "模板",包含应用、依赖、环境配置,可创建多个容器(类与对象的关系) |
| Container(容器) | 镜像的运行实例,是独立的应用运行环境(镜像启动后生成) |
| Registry(仓库) | 存储镜像的远程仓库(Docker Hub 官方仓库 / 企业私有仓库) |
镜像加速器配置(阿里云)
- 登录阿里云控制台 → 搜索 "容器镜像服务 ACR";
- 进入 "镜像工具" → "镜像加速器",复制专属加速器地址;
- 按文档配置 Docker daemon.json,加速镜像拉取(解决官方仓库访问慢问题)。
六、Docker 常用命令大全(分类整理)
1. 服务相关命令(操作 Docker 守护进程)
bash
systemctl start docker # 启动Docker服务
systemctl status docker # 查看Docker运行状态
systemctl restart docker # 重启Docker服务
systemctl enable docker # 设置Docker开机自启
2. 镜像相关命令=
bash
docker images # 查看本地所有镜像
docker images -q # 仅查看所有镜像ID
docker search 镜像名 # 搜索远程仓库镜像(如docker search redis)
docker pull 镜像名 # 拉取镜像(默认最新版,如docker pull redis)
docker pull 镜像名:版本号 # 拉取指定版本(如docker pull redis:5.0)
docker rmi 镜像ID/镜像名 # 删除本地镜像
docker rmi $(docker images -q)# 一次性删除所有本地镜像(慎用)
3. 容器相关命令
bash
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(含停止状态)
# 创建并启动容器(交互式+后台运行,示例:centos7)
docker run -itd --name=容器名 镜像名:版本 # 如docker run -itd --name=c1 centos:7
docker exec -it 容器名/ID /bin/bash # 交互式进入运行中的容器
docker start 容器名/ID # 启动停止的容器
docker stop 容器名/ID # 停止运行中的容器
docker rm 容器名/ID # 删除容器(需先停止,强制删除加-f)
docker inspect 容器名/ID # 查看容器详细配置信息
4. 命令参数说明(高频)
-i:保持标准输入打开,支持容器交互;-t:分配伪终端,与-i结合(-it)实现交互式操作;-d:后台运行容器(守护进程模式);--name:指定容器名称(默认自动生成);-v:挂载数据卷(宿主机路径:容器内路径)。
七、数据卷:容器数据持久化与共享方案
1. 核心问题解决
- 容器删除后,内部数据默认丢失 → 数据卷挂载实现持久化;
- 容器与宿主机、容器与容器之间无法直接共享数据 → 数据卷作为 "桥梁"。
2. 数据卷本质
宿主机中的一个目录 / 文件,与容器目录绑定后:
- 双向同步:宿主机 / 容器任意一方修改,另一方实时同步;
- 独立存在:容器删除后,数据卷数据不丢失;
- 多容器共享:多个容器可挂载同一个数据卷,实现数据交互。
3. 数据卷容器配置(多容器共享)
- 创建数据卷容器(匿名数据卷):
bash
docker run -itd --name=vol-container -v /volume centos:7
- 其他容器挂载该数据卷:
bash
docker run -itd --name=c1 --volumes-from vol-container centos:7
docker run -itd --name=c2 --volumes-from vol-container centos:7
- c1、c2 的
/volume目录数据实时同步; - vol-container 停止 / 删除后,数据卷仍存在,c1、c2 可正常访问。
八、实战:Docker 部署常用中间件
1. 部署 MySQL(外部可访问)
核心:挂载数据卷(持久化数据、配置、日志)
bash
docker run -itd --name=mysql -p 3306:3306 \
-v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
-v /usr/local/docker/mysql/log:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
- 外部 MySQL 客户端通过
宿主机IP:3306连接,密码 123456; - 数据、配置、日志持久化到宿主机,容器删除后数据不丢失。
2. 部署 Tomcat(外部访问项目)
bash
docker run -itd --name=tomcat -p 8080:8080 \
-v /usr/local/docker/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat:8.5
- 本地项目打包为 war 包,放入宿主机
/usr/local/docker/tomcat/webapps; - 浏览器访问
宿主机IP:8080/项目名即可访问。
3. 部署 Nginx(静态资源 + 反向代理)
- 准备配置文件:在
/usr/local/docker/nginx目录下创建nginx.conf(从 Nginx 官网复制默认配置,按需修改); - 启动容器:
bash
docker run -itd --name=nginx -p 80:80 \
-v /usr/local/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
nginx:1.21
- 测试:在
/usr/local/docker/nginx/html创建index.html,浏览器访问宿主机IP即可看到内容。
4. 部署 Redis(持久化配置)
bash
docker run -itd --name=redis -p 6379:6379 \
-v /usr/local/docker/redis/data:/data \
-v /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf \
redis:5.0 redis-server /etc/redis/redis.conf
- 配置文件中开启持久化(如 AOF/RDB),数据持久化到宿主机
/usr/local/docker/redis/data。
九、Dockerfile:自定义镜像(以 SpringBoot 项目为例)
1. Dockerfile 核心概念
Dockerfile 是构建镜像的 "脚本文件",包含一系列指令(如 From、ADD、CMD),用于定义镜像的构建流程,支持自定义应用镜像。
2. 实战:打包 SpringBoot 项目为 Docker 镜像
步骤 1:准备工作
- Maven 打包 SpringBoot 项目,得到
demo.jar; - 创建
docker-files目录,将demo.jar放入该目录,在目录内创建Dockerfile。
步骤 2:编写 Dockerfile
dockerfile
bash
# 基础镜像(Java8环境)
From java:8
# 作者信息
MAINTAINER mrhan<mrhan@ithan.cn>
# 将本地jar包添加到容器,并重命名为app.jar
ADD demo.jar app.jar
# 容器启动时执行的命令
CMD java -jar app.jar
步骤 3:构建镜像
bash
# 进入docker-files目录,执行构建命令(最后的.表示当前目录)
docker build -t springboot-demo:1.0 .
步骤 4:启动容器
bash
docker run -itd --name=springboot-app -p 8081:8080 springboot-demo:1.0
- 浏览器访问
宿主机IP:8081,即可访问 SpringBoot 应用。
3. 容器转镜像(应急场景)
若需基于运行中的容器创建镜像(如修改容器配置后固化):
bash
docker commit -m "描述信息" 容器名/ID 新镜像名:版本
⚠️ 注意:挂载的数据卷不会纳入镜像,需通过 Dockerfile 的COPY/ADD指令添加。
十、Docker Compose:服务编排工具
当应用依赖多个容器(如 SpringBoot+MySQL+Redis)时,用 Docker Compose 一键管理所有服务。
1. 核心命令
bash
docker-compose up -d # 后台启动所有服务
docker-compose ps # 查看服务运行状态
docker-compose restart # 重启所有服务
docker-compose restart 服务名 # 重启指定服务
docker-compose stop # 停止所有服务
docker-compose rm # 删除所有服务(需先停止)
十一、Docker 私有仓库(企业级部署)
1. 核心用途
企业内部镜像存储(避免敏感镜像上传至 Docker Hub),实现镜像统一管理。
2. 关键操作
bash
# 登录私有仓库
docker login 私有仓库地址 -u 用户名 -p 密码
# 给镜像打标签(符合私有仓库命名规范)
docker tag 本地镜像名:版本 私有仓库地址/镜像名:版本
# 推送镜像到私有仓库
docker push 私有仓库地址/镜像名:版本
# 从私有仓库拉取镜像
docker pull 私有仓库地址/镜像名:版本
十二、Docker 容器 vs 传统虚拟机(核心差异)
| 对比维度 | Docker 容器 | 传统虚拟机(VM) |
|---|---|---|
| 底层依赖 | 共享宿主机内核 | 完整操作系统(含内核) |
| 资源占用 | 轻量(MB 级) | 重量级(GB 级) |
| 启动速度 | 秒级 | 分钟级 |
| 环境一致性 | 高(镜像打包) | 低(手动配置) |
| 可移植性 | 强(一次构建,到处运行) | 弱(依赖虚拟机环境) |
| 资源利用率 | 高(支持多容器密集部署) | 低(单个 VM 占用大量资源) |
十三、总结
Docker 通过 "镜像 + 容器" 的核心架构,彻底解决了传统部署的环境不一致、依赖复杂、部署繁琐等痛点,是微服务架构下跨环境部署的首选方案。本文从基础概念、命令操作、实战部署到高级特性(Dockerfile、Compose、私有仓库),覆盖 Docker 全流程使用,适合入门到进阶的学习路径。
掌握 Docker 后,你可以轻松实现 "开发环境一键复制"、"应用快速部署"、"跨平台迁移无压力",大幅提升开发和运维效率。建议结合实际项目多练手(如打包自己的 SpringBoot 项目、搭建多容器服务),加深对 Docker 核心思想的理解~
如果您觉得这篇文章对您有帮助,请点赞关注,我会持续分享更多实用的技术文章。如有任何问题,欢迎在评论区留言讨论。