Docker环境部署与项目迁移完整技术文档

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这三个核心服务的快速安装与运行命令。

服务拉取镜像命令运行容器命令(基础版)关键参数说明
MySQLdocker pull mysql:8.0docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:8.0-e 设置环境变量(密码)
-p 端口映射
Nginxdocker pull nginx:latestdocker run --name my-nginx -p 80:80 -d nginx:latest-p 80:80 将宿主机80端口映射到容器80端口
Redisdocker pull redis:latestdocker 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

若依的微服务版部署需要DockerDocker Compose。安装时请注意版本,例如Docker Compose应使用V2版本而非旧的V1-4

  1. 安装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
  2. 安装Docker Compose
    鉴于若依微服务版部署需要-4,请确保安装V2版本的Docker Compose Plugin。bashCopyDownload# 对于较新的Docker版本,可能已经内置了Compose V2。你也可以使用以下命令安装: sudo yum install docker-compose-plugin # 验证安装 docker compose version

💎 总结

简单来说,先安装Docker,再部署若依,是一个高效且能规避许多麻烦的最佳实践。你可以根据上述步骤先配置好Docker环境,这将为后续若依的顺利部署打下坚实的基础。

希望这些信息能帮助你顺利完成若依的部署。如果你在具体的安装或配置过程中遇到其他问题,可以随时再来提问。


附录

开发环境组件容器化选择指南

在开发环境中使用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配置可能不适合你的具体环境,需要仔细研究并调整。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部