摘要:Docker作为容器化技术的核心,已成为企业级项目部署的标准方案,其轻量、可移植、隔离性强的特点,彻底解决了"开发环境能跑,生产环境跑不起来"的痛点。本文基于Docker 26.0,详细讲解Docker核心概念、镜像制作、容器管理、Docker Compose集群编排,结合SpringBoot项目容器化、Nginx+MySQL集群部署两个实战场景,附完整配置文件与操作命令,适合后端开发者、运维工程师快速掌握容器化部署技巧,提升项目部署效率与稳定性。
一、前言:Docker的核心价值与应用场景
在传统项目部署中,环境依赖冲突、部署流程繁琐、服务器资源利用率低等问题频发,而Docker通过"打包镜像、运行容器"的方式,将应用及其依赖打包成一个可移植的镜像,实现"一次构建、到处运行"。Docker广泛应用于微服务部署、持续集成/持续部署(CI/CD)、测试环境隔离、云服务器资源优化等场景,是现代DevOps流程的核心工具。
本文从Docker基础操作入手,逐步深入到镜像优化、容器编排,结合企业级实战案例,帮助开发者快速上手Docker,掌握容器化部署的核心技巧,解决实际部署中的常见问题。
二、Docker核心基础(快速入门)
2.1 核心概念解析
-
镜像(Image):Docker的核心组件,是一个只读的模板,包含运行应用所需的代码、依赖、环境变量等,相当于"容器的模板",可用于创建多个容器。
-
容器(Container):镜像的运行实例,是一个独立的运行环境,具有隔离性,容器之间互不干扰,可随时启动、停止、删除。
-
仓库(Repository):用于存储Docker镜像的仓库,分为公有仓库(如Docker Hub)和私有仓库(如企业内部私有仓库),方便镜像的管理与共享。
-
Docker Compose:Docker官方提供的集群编排工具,通过一个YAML文件定义多个容器的配置,实现多容器的统一启动、停止、管理,简化集群部署流程。
2.2 Docker基础操作命令(实战必备)
bash
# 1. 安装Docker(CentOS 8为例)
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y
systemctl start docker
systemctl enable docker
docker --version # 验证安装
# 2. 镜像相关操作
docker pull nginx:1.25 # 拉取指定版本镜像
docker images # 查看本地所有镜像
docker rmi nginx:1.25 # 删除镜像
docker build -t my-app:1.0 . # 基于Dockerfile构建镜像
# 3. 容器相关操作
docker run -d -p 80:80 --name nginx-container nginx:1.25 # 启动容器(后台运行、端口映射、命名)
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包括停止的)
docker stop nginx-container # 停止容器
docker start nginx-container # 启动已停止的容器
docker rm nginx-container # 删除容器
docker logs -f nginx-container # 查看容器日志
docker exec -it nginx-container /bin/bash # 进入容器内部
# 4. 镜像推送与拉取(私有仓库为例)
docker tag my-app:1.0 192.168.1.100:5000/my-app:1.0 # 给镜像打标签
docker push 192.168.1.100:5000/my-app:1.0 # 推送镜像到私有仓库
docker pull 192.168.1.100:5000/my-app:1.0 # 从私有仓库拉取镜像
三、实战场景:Docker容器化部署与集群编排
3.1 实战1:SpringBoot项目容器化部署
将SpringBoot项目打包成Docker镜像,实现容器化部署,解决环境依赖问题,步骤如下:
dockerfile
# 1. 编写Dockerfile(项目根目录下)
# 基础镜像(Java 17)
FROM openjdk:17-jdk-slim
# 作者信息
MAINTAINER dev@example.com
# 复制SpringBoot打包后的jar包到容器中
COPY target/my-springboot-app-1.0.jar /app.jar
# 暴露端口(与SpringBoot项目端口一致)
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
# 2. 打包SpringBoot项目(生成jar包)
mvn clean package -Dmaven.test.skip=true
# 3. 构建Docker镜像
docker build -t my-springboot-app:1.0 .
# 4. 启动容器(映射端口8080,挂载日志目录)
docker run -d -p 8080:8080 -v /var/log/my-app:/var/log/my-app --name springboot-container my-springboot-app:1.0
# 5. 验证部署(访问接口)
curl http://localhost:8080/health
3.2 实战2:Docker Compose编排Nginx+MySQL+SpringBoot集群
使用Docker Compose编排多容器集群,实现Nginx反向代理、MySQL数据库、SpringBoot应用的统一部署与管理,配置文件如下:
yaml
# docker-compose.yml(项目根目录下)
version: '3.8'
services:
# MySQL服务
mysql:
image: mysql:8.0
container_name: mysql-container
restart: always # 容器异常自动重启
environment:
MYSQL_ROOT_PASSWORD: 123456 # root密码
MYSQL_DATABASE: my_db # 初始化数据库
MYSQL_USER: my_user # 自定义用户
MYSQL_PASSWORD: my_password # 自定义用户密码
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql # 挂载数据目录,避免数据丢失
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql # 初始化SQL脚本
networks:
- my-network # 加入自定义网络
# SpringBoot应用服务
springboot-app:
image: my-springboot-app:1.0
container_name: springboot-container
restart: always
depends_on:
- mysql # 依赖MySQL服务,MySQL启动后再启动该服务
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/my_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
SPRING_DATASOURCE_USERNAME: my_user
SPRING_DATASOURCE_PASSWORD: my_password
networks:
- my-network
# Nginx服务(反向代理)
nginx:
image: nginx:1.25
container_name: nginx-container
restart: always
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf # 挂载Nginx配置文件
- ./nginx/html:/usr/share/nginx/html # 挂载静态资源
- ./nginx/logs:/var/log/nginx # 挂载日志目录
depends_on:
- springboot-app # 依赖SpringBoot服务
networks:
- my-network
# 自定义网络(实现容器间通信)
networks:
my-network:
driver: bridge
# 挂载卷(持久化数据)
volumes:
mysql-data:
bash
# 启动集群(在docker-compose.yml所在目录执行)
docker-compose up -d
# 查看集群状态
docker-compose ps
# 停止集群
docker-compose down
# 重启集群
docker-compose restart
# 查看集群日志
docker-compose logs -f
四、Docker优化与常见问题排查
4.1 镜像优化技巧
-
选用轻量基础镜像:优先使用alpine、slim版本的基础镜像(如openjdk:17-jdk-slim),减少镜像体积。
-
多阶段构建:通过多阶段构建,只保留运行所需的文件,删除构建过程中的临时文件,大幅减小镜像体积。
-
合理使用缓存:Docker构建镜像时会缓存每一步操作,将不变的步骤(如安装依赖)放在前面,变化的步骤(如复制项目文件)放在后面,提升构建效率。
4.2 常见问题排查
-
容器启动失败:使用docker logs 容器名称 查看日志,定位错误(如端口占用、配置错误、依赖服务未启动)。
-
容器间无法通信:确保容器加入同一网络,使用容器名称作为主机名进行通信(如SpringBoot连接MySQL时,主机名填写mysql)。
-
数据丢失:确保关键数据(如MySQL数据)通过挂载卷持久化,避免容器删除后数据丢失。
五、总结与延伸
本文结合实战场景,详细讲解了Docker的基础操作、镜像制作、容器管理,以及Docker Compose集群编排,实现了SpringBoot项目的容器化部署和多容器集群管理,解决了传统部署中的诸多痛点。
延伸学习:可深入研究Docker Swarm(Docker官方集群管理工具)、Kubernetes(K8s)容器编排、Docker镜像仓库搭建(Harbor)、CI/CD与Docker的集成(Jenkins+Docker),进一步提升容器化部署与运维能力。