目录
1. 文档概述
本文档旨在全面总结使用Docker技术进行基础环境搭建(以若依项目为例)并将其整体打包迁移的完整流程与方法。它涵盖了从核心概念理解、单一服务安装,到多服务编排与整体迁移的方方面面,旨在成为日后项目部署和知识传递的参考手册。
2. Docker核心概念与价值
2.1 什么是Docker?
Docker是一个开源的应用容器引擎,它允许开发者将应用及其所有依赖项(库、框架、运行时等)打包到一个标准化的单元中,这个单元就称为容器。
2.2 核心概念关系图
Diagram
CodeDownload
Mermaid rendering failed.
- 镜像:一个只读的模板,用于创建容器。例如,一个镜像可以包含一个完整的Ubuntu操作系统,里面仅安装了MySQL。
- 容器:镜像的一个运行实例。容器是轻量级、可执行的独立环境,包含了运行应用所需的一切。
- 关系:镜像相当于
类,容器相当于对象。
2.3 Docker在部署中的核心价值
- 环境一致性:保障开发、测试、生产环境完全一致,杜绝“在我电脑上是好的”问题。
- 隔离性:应用运行在独立的容器中,互不干扰。
- 便携性:一次构建,随处运行。
- 高效性:秒级启动,资源开销小。
3. Docker及常用服务安装指南
3.1 Docker & Docker Compose 安装
在Linux(以CentOS 7为例)上安装:
bashCopyDownload
# 1. 卸载旧版本(如有) sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 2. 安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 3. 设置稳定的仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 4. 安装Docker Engine sudo yum install docker-ce docker-ce-cli containerd.io # 5. 启动Docker并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 6. 安装Docker Compose Plugin (V2) sudo yum install docker-compose-plugin # 7. 验证安装 docker --version docker compose version
3.2 核心服务安装命令汇总
下表列出了MySQL、Nginx、Redis这三个核心服务的快速安装与运行命令。
| 服务 | 拉取镜像命令 | 运行容器命令(基础版) | 关键参数说明 |
|---|---|---|---|
| MySQL | docker pull mysql:8.0 | docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:8.0 | -e 设置环境变量(密码)-p 端口映射 |
| Nginx | docker pull nginx:latest | docker run --name my-nginx -p 80:80 -d nginx:latest | -p 80:80 将宿主机80端口映射到容器80端口 |
| Redis | docker pull redis:latest | docker run --name my-redis -p 6379:6379 -d redis:latest | -p 6379:6379 映射Redis默认端口 |
重要提示:以上为最简命令,生产环境务必配置数据持久化,否则容器删除后数据会丢失。
3.3 带数据持久化的服务安装
MySQL (持久化数据):
bashCopyDownload
docker run --name my-mysql \ -v /host/path/mysql_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -p 3306:3306 \ -d mysql:8.0
Nginx (持久化配置和网页文件):
bashCopyDownload
# 先在宿主机创建目录
mkdir -p /host/path/nginx/{conf,html,logs}
# 运行容器并挂载目录
docker run --name my-nginx \
-v /host/path/nginx/html:/usr/share/nginx/html \
-v /host/path/nginx/conf:/etc/nginx/conf.d \
-p 80:80 \
-d nginx:latest
4. 项目整体打包与迁移方案
当您在源机器上安装好Docker并配置了所有服务后,可以通过以下两种主流方案将其“打包”并迁移到新的机器上。
4.1 方案对比:完整镜像打包 vs Docker Compose编排
| 维度 | 方案一:打包完整镜像 | 方案二:使用Docker Compose |
|---|---|---|
| 核心思想 | 将运行中的容器状态快照,保存为新的镜像并导出。 | 用YAML文件定义所有服务、配置和依赖关系。 |
| 流程 | 配置 -> 提交为镜像 -> 导出为文件 -> 导入 -> 运行 | 编写YAML文件 -> 拷贝文件 -> 一键启动 |
| 优点 | – 环境高度固化,一致性极强 – 非常适合离线部署 | – 配置即代码,易于版本管理 – 灵活性强,易于修改和扩展 – 行业标准实践 |
| 缺点 | – 镜像体积庞大 – 配置不透明,修改困难 | – 首次部署需拉取镜像(可解决) – 需学习YAML语法 |
| 推荐度 | ⭐⭐⭐ (适用于特定离线场景) | ⭐⭐⭐⭐⭐ (推荐的标准做法) |
4.2 方案一详解:打包完整镜像
此方案适用于将某个特定时间点的完整环境状态(包括所有数据)进行固化迁移。
bashCopyDownload
# 1. 将正在运行的容器提交为新的镜像 docker commit my-mysql my-mysql-with-data:v1 docker commit my-nginx my-nginx-with-config:v1 docker commit my-redis my-redis-with-data:v1 # 2. 将多个镜像打包到一个tar文件中 docker save -o my-full-stack-backup.tar \ my-mysql-with-data:v1 \ my-nginx-with-config:v1 \ my-redis-with-data:v1 # 3. 在新机器上加载镜像 docker load -i my-full-stack-backup.tar # 4. 使用加载的镜像运行容器(命令与原镜像类似) docker run --name new-mysql -d my-mysql-with-data:v1 # ... 以此类推
4.3 方案二详解:使用Docker Compose (强烈推荐)
这是现代Docker部署的最佳实践。您只需要维护一个文本文件,即可描述整个应用栈。
4.3.1 创建 docker-compose.yml 文件
yamlCopyDownload
# docker-compose.yml
version: '3.8'
# 定义所有服务
services:
mysql:
image: mysql:8.0 # 指定镜像,直接从仓库拉取
container_name: my-app-mysql
environment:
MYSQL_ROOT_PASSWORD: "123456" # 环境变量
MYSQL_DATABASE: ruoyi # 初始数据库
volumes:
- mysql_data:/var/lib/mysql # 使用命名卷持久化数据
ports:
- "3306:3306"
networks:
- app-network
redis:
image: redis:latest
container_name: my-app-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- app-network
nginx:
image: nginx:latest
container_name: my-app-nginx
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d # 挂载自定义Nginx配置
- ./nginx/html:/usr/share/nginx/html # 挂载静态网页文件
depends_on: # 定义启动依赖顺序
- mysql
- redis
networks:
- app-network
# 定义数据卷,保证数据持久化
volumes:
mysql_data:
redis_data:
# 定义自定义网络,方便服务间通信
networks:
app-network:
driver: bridge
4.3.2 项目目录结构
在迁移时,您需要打包整个项目目录:
textCopyDownload
my-docker-project/ ├── docker-compose.yml # 核心编排文件 ├── nginx/ │ ├── conf.d/ # Nginx配置文件 │ │ └── default.conf │ └── html/ # 网站静态文件 │ └── index.html └── README.md # 项目说明
4.3.3 迁移与部署命令
bashCopyDownload
# 1. 将整个项目目录拷贝到新机器 # 2. 进入项目目录 cd my-docker-project # 3. 一键启动所有服务 (-d 表示后台运行) docker compose up -d # 4. 查看服务状态 docker compose ps # 5. 停止并移除所有服务(同时会移除网络,但保留数据卷) docker compose down
5. 完整部署流程总览
以下流程图清晰地展示了从零开始,到最终实现环境迁移的完整路径和关键决策点。

6. 常见问题与技巧
- 权限问题:在Linux上,非root用户运行Docker命令需加入
docker用户组:sudo usermod -aG docker $USER,然后重新登录。 - 端口冲突:如果宿主机端口已被占用,修改
-p参数,例如-p 3307:3306。 - 查看日志:使用
docker logs <container_name>排查容器启动问题。 - 清理资源:定期使用
docker system prune清理无用的镜像、容器和网络。
建议在部署若依之前就安装好Docker。这样做不仅能让后续的环境部署工作更顺畅,还能有效避免各种因环境差异导致的问题-2。
下面这个时间线可以帮你更直观地理解Docker在若依部署中的角色和安装时机:

Diagram
🔧 提前安装Docker的好处
提前准备好Docker环境,主要有以下好处:
- 环境隔离与一致性:Docker容器可以将若依系统依赖的MySQL、Redis、Nacos等服务与你的宿主机系统隔离开。这保证了你在本地开发测试的环境,与最终部署到服务器的环境高度一致,有效避免“在我电脑上是好的”这类问题-2。
- 简化部署流程:使用Docker后,你可以通过标准的镜像和容器操作来管理若依的各项服务,无需在宿主机上手动安装、配置各种中间件,大大简化了部署过程-2。
- 一键启动与复用:结合Docker Compose,你可以通过一个
docker-compose.yml文件定义所有服务,实现一键启动和停止整个若依系统。这套配置可以在不同环境中轻松复用-5。
📦 安装Docker与Docker Compose
若依的微服务版部署需要Docker和Docker Compose。安装时请注意版本,例如Docker Compose应使用V2版本而非旧的V1-4。
- 安装Docker
以下是在CentOS 7系统上安装Docker的示例步骤-2-4:bashCopyDownload# 安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker的YUM源 sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker sudo yum install docker-ce docker-ce-cli containerd.io # 启用并启动Docker服务 sudo systemctl enable docker sudo systemctl start docker # 检查Docker环境是否安装成功 docker version - 安装Docker Compose
鉴于若依微服务版部署需要-4,请确保安装V2版本的Docker Compose Plugin。bashCopyDownload# 对于较新的Docker版本,可能已经内置了Compose V2。你也可以使用以下命令安装: sudo yum install docker-compose-plugin # 验证安装 docker compose version
💎 总结
简单来说,先安装Docker,再部署若依,是一个高效且能规避许多麻烦的最佳实践。你可以根据上述步骤先配置好Docker环境,这将为后续若依的顺利部署打下坚实的基础。
希望这些信息能帮助你顺利完成若依的部署。如果你在具体的安装或配置过程中遇到其他问题,可以随时再来提问。
附录
- Docker 官方文档
- Docker Compose 官方文档
- Docker Hub (查找官方镜像)
开发环境组件容器化选择指南
在开发环境中使用Docker,一个核心原则是:对于那些需要隔离环境、简化部署、并且易于实现数据持久化的无状态服务或依赖(如数据库、中间件、运行环境),优先考虑Docker;而对于那些与宿主机系统深度集成、有复杂资源需求或涉及图形界面的应用,则建议采用传统安装方式。
| 分类 | 组件示例 | 建议方式 | 核心原因 |
|---|---|---|---|
| 🗄️ 数据库与服务 | MySQL, PostgreSQL, Redis, MongoDB, Elasticsearch | 推荐 Docker | 一键部署、数据持久化容易、版本切换灵活,与宿主机环境解耦。 |
| 🔧 开发语言与运行时 | Node.js, Python, PHP, JDK (Java), .NET SDK, Go, Qt for Python (PySide6) | 强烈推荐 Docker | 完美的环境隔离。对于PySide6,容器化可以解决Linux桌面环境下依赖库和显示相关的冲突问题(通过挂载 /tmp/.X11-unix 实现GUI显示)。 |
| 🌐 Web服务器与中间件 | Nginx, Apache HTTP Server, Tomcat, RabbitMQ | 推荐 Docker | 配置标准化、快速启动、易于集成到开发栈中。 |
| 📦 完整应用 | 若依(Spring Boot+Vue), WordPress, Django应用, Laravel应用, Wiki.js | 推荐 Docker | 将应用及其依赖整体打包,保证环境一致。像Wiki.js这样的现代化Wiki系统,将所有依赖(Node.js)都容器化,部署和管理变得极其简单。 |
| 🛠️ 编译与构建工具 | C++编译工具链(GCC/Clang) | 视情况而定 | 场景1(推荐Docker):需要特定版本的GCC或交叉编译环境时,容器是完美的隔离方案。 场景2(推荐本地):如果只是日常编译,对宿主机无污染,本地安装更直接。 |
| ☸️ 容器编排与基础设施 | Kubernetes (K8s), Minikube | 慎用 Docker | 架构复杂,属于”基础设施”而非”应用组件”。在单机开发中可能带来复杂性和安全隐患。 |
| 💻 集成开发环境与重型GUI工具 | Visual Studio Code, IntelliJ IDEA, PyCharm, 数据库图形化工具(如Navicat) | 不建议 Docker | 严重依赖原生图形界面和系统API,文件系统交互频繁。容器化后性能差、体验不佳,得不偿失。 |
用好Docker的技巧与注意事项
表格给出了大致原则,但要真正发挥Docker在开发环境的作用,还需要注意以下几点:
- 确保数据持久化:运行数据库或任何有状态服务时,务必使用
-v参数挂载宿主机目录到容器内(如 MySQL 的/var/lib/mysql),防止容器删除时数据丢失。 - 注重配置管理:将应用配置文件(如Nginx的
.conf,MySQL的my.cnf)放在宿主机并通过-v挂载,方便修改和管理。 - 合理分配资源:Docker会消耗不少系统资源。对于MySQL、Redis等,在开发环境下,你可能需要根据实际情况通过Docker命令调整其CPU和内存限制。
- 理解网络连接:在Docker中运行服务时,注意正确配置容器网络,以便服务之间能相互访问。
- 镜像选择与安全:优先选择官方镜像,并注意及时更新,以确保安全并减少漏洞。避免在Dockerfile中存储安全凭证。
⚠️ 避免Docker使用误区
不要过度依赖容器解决所有环境问题:Docker虽好,但也要认识到它只是工具之一。保证开发环境和生产环境的一致性,不能完全依赖Docker,还需要良好的流程和规范。
并非所有场景都适合Docker:如表格中提到的K8s和IDE,在Docker中运行可能会带来不必要的麻烦。
谨慎使用默认配置:直接使用默认的Docker配置可能不适合你的具体环境,需要仔细研究并调整。