一、Docker 核心概念
- 镜像 (image):只读模板,打包好的运行环境(如 mysql:8.0、java:17),相当于系统安装盘
- 容器 (container):镜像运行实例,独立隔离环境,可启停删除,一个镜像可跑多个容器
- Dockerfile:文本脚本,自定义构建镜像
- Docker Compose:多容器编排工具,一键启动多个关联服务(前端 + 后端 + mysql+redis)
- 仓库 (Registry):存放镜像,官方公共仓库 Docker Hub,企业私有仓库 Harbor
第一部分:Docker 安装(三大主流系统)
1. CentOS 7/8 / Rocky Linux
1.1 卸载旧版本
bash
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1.2 安装依赖 & yum 源
bash
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
1.3 安装 Docker 引擎
bash
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
1.4 启动、开机自启
bash
systemctl start docker
systemctl enable docker
# 验证是否安装成功
docker -v
2. Ubuntu / Debian
bash
# 更新源
apt update
# 卸载旧版
apt remove docker docker-engine docker.io containerd runc
# 安装依赖
apt install ca-certificates curl gnupg lsb-release
# 添加docker密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装
apt update
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动
systemctl start docker
systemctl enable docker
docker -v
3. Windows / Mac(桌面版,开发用)
- 下载 Docker Desktop:https://www.docker.com/products/docker-desktop/
- Windows 需要开启 WSL2 / Hyper-V;Mac 直接安装
- 安装完成打开终端执行
docker -v验证
4. 配置国内镜像加速(必配,否则拉镜像极慢)
Linux 配置
bash
# 创建配置文件
vim /etc/docker/daemon.json
写入内容:
json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
重启生效:
bash
systemctl daemon-reload
systemctl restart docker
Windows/Mac
Docker Desktop 设置 → Docker Engine,粘贴上面 json,点击 Apply & Restart
第二部分:Docker 基础核心命令
1. 镜像操作
bash
# 1. 搜索镜像
docker search mysql
# 2. 拉取镜像 格式 docker pull 镜像名:版本,不写版本默认latest最新
docker pull mysql:8.0
# 3. 查看本地所有镜像
docker images
# 4. 删除镜像(镜像ID/镜像名)
docker rmi mysql:8.0
# 强制删除
docker rmi -f 镜像ID
# 5. 导出镜像(备份)
docker save -o mysql8.tar mysql:8.0
# 导入镜像
docker load -i mysql8.tar
2. 容器操作(最常用)
bash
# 1. 运行容器(核心命令)
# 示例:启动mysql8
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/mysql:/var/lib/mysql \
mysql:8.0
参数解释:
-d 后台守护进程运行
--name 给容器起名,方便管理
-p 宿主机端口:容器内部端口 端口映射
-e 环境变量(数据库密码、账号等)
-v 宿主机目录:容器目录 数据持久化挂载(容器删除数据不丢失)
--restart=always 开机自动重启容器
# 2. 查看运行中容器
docker ps
# 查看所有容器(包含已停止)
docker ps -a
# 3. 停止/启动/重启容器
docker stop mysql8
docker start mysql8
docker restart mysql8
# 4. 删除容器(必须先停止,-f强制删)
docker rm mysql8
docker rm -f 容器ID
# 5. 进入容器内部终端
docker exec -it mysql8 /bin/bash
# 退出容器:exit
# 6. 查看容器日志(排查报错)
docker logs mysql8
# 实时滚动日志
docker logs -f mysql8
# 7. 拷贝文件 容器 <-> 宿主机
# 宿主机文件传到容器
docker cp /test.txt mysql8:/tmp
# 容器文件拷到宿主机
docker cp mysql8:/tmp/test.txt /opt
# 8. 查看容器资源占用
docker stats
3. 数据卷 Volume(持久化)
- 方式 1:绑定挂载
-v 宿主机绝对路径:容器路径(自定义目录) - 方式 2:管理卷(docker 自动管理)
bash
# 创建卷
docker volume create mysql-data
# 使用卷启动容器
docker run -v mysql-data:/var/lib/mysql ...
# 查看所有卷
docker volume ls
# 删除无用卷
docker volume prune
第三部分:自定义镜像 Dockerfile(打包 Java / 前端项目)
示例 1:打包 SpringBoot Jar 后端项目
1. 准备文件
新建文件夹,放入:
- app.jar(编译好的 springboot 包)
- Dockerfile(无后缀)
2. Dockerfile 内容
dockerfile
# 基础镜像 jdk17
FROM openjdk:17-jdk-slim
# 作者信息
MAINTAINER test
# 设置容器内工作目录
WORKDIR /app
# 将宿主机jar复制到容器内
COPY app.jar app.jar
# 暴露端口(仅声明,不自动映射)
EXPOSE 8080
# 容器启动执行命令
ENTRYPOINT ["java","-jar","app.jar"]
3. 构建镜像
bash
# . 代表当前目录读取Dockerfile,-t 镜像名:版本
docker build -t demo-back:1.0 .
4. 运行自定义镜像
bash
docker run -d --name demo-back -p 8080:8080 demo-back:1.0
示例 2:打包 Vue 前端(Nginx)
Dockerfile
dockerfile
# 阶段1:打包vue代码
FROM node:18 as build
WORKDIR /web
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 阶段2:nginx运行静态资源(多阶段构建减小镜像体积)
FROM nginx:alpine
# 复制打包产物到nginx目录
COPY --from=build /web/dist /usr/share/nginx/html
# 复制自定义nginx配置
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
第四部分:Docker Compose 多服务一键部署(企业主流)
适合项目:后端 + MySQL + Redis + Nginx,不用逐个 run 容器
1. 安装
新版 docker 自带,直接执行 docker compose version 验证
2. 项目目录结构
plaintext
demo-project/
├── docker-compose.yml # 编排配置
├── back/
│ ├── app.jar
│ └── Dockerfile
├── web/
│ ├── dist
│ ├── Dockerfile
│ └── nginx.conf
├── mysql/ # 数据库挂载目录
└── redis/ # redis挂载目录
3. docker-compose.yml 完整示例
yaml
# 版本规范
version: "3.8"
# 所有服务
services:
# MySQL服务
mysql:
image: mysql:8.0
container_name: demo-mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: demo_db
volumes:
- ./mysql:/var/lib/mysql
restart: always
networks:
demo-net:
# Redis
redis:
image: redis:6-alpine
container_name: demo-redis
ports:
- "6379:6379"
volumes:
- ./redis:/data
restart: always
networks:
demo-net:
# 后端服务(本地Dockerfile构建)
backend:
build: ./back
container_name: demo-back
ports:
- "8080:8080"
# 依赖mysql、redis,启动顺序控制
depends_on:
- mysql
- redis
volumes:
- ./logs:/app/logs
restart: always
networks:
demo-net:
# Nginx前端
web:
build: ./web
container_name: demo-web
ports:
- "80:80"
depends_on:
- backend
restart: always
networks:
demo-net:
# 自定义网络,所有容器互通
networks:
demo-net:
4. Compose 常用命令
bash
# 前台启动(看输出日志)
docker compose up
# 后台守护启动
docker compose up -d
# 查看运行服务
docker compose ps
# 实时日志
docker compose logs -f
# 停止服务,不删除容器
docker compose stop
# 停止并删除容器、网络(数据卷不会删)
docker compose down
# 删除所有+数据卷(清空数据库)
docker compose down -v
# 重新构建镜像并启动
docker compose up -d --build
第五部分:完整线上部署流程(SpringBoot+MySQL 实战)
步骤 1:服务器安装 Docker(前面 CentOS/Ubuntu 安装脚本)
步骤 2:上传项目 jar 包、Dockerfile 到服务器同一目录
步骤 3:构建后端镜像
bash
docker build -t demo-back:1.0 .
步骤 4:启动 mysql 容器持久化数据
bash
mkdir -p /data/mysql
docker run -d \
--name demo-mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/mysql:/var/lib/mysql \
--restart always \
mysql:8.0
步骤 5:启动后端项目
bash
docker run -d \
--name demo-back \
-p 8080:8080 \
--restart always \
demo-back:1.0
步骤 6:放行服务器防火墙端口
CentOS
bash
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
Ubuntu
bash
ufw allow 8080
ufw allow 3306
步骤 7:访问测试
服务器IP:8080/接口地址
第六部分:常见排错 & 最佳实践
1. 容器启动失败
bash
# 查看详细日志定位报错
docker logs 容器名
2. 端口被占用
- 修改
-p 宿主机端口:容器端口宿主机端口换一个 - 停止占用端口程序
netstat -lntp
3. 数据丢失
一定要挂载 -v 持久化目录,不要把数据存在容器内部
4. 镜像过大优化
- 使用 alpine 轻量基础镜像
- 多阶段构建(前端 / 后端分开打包)
- 清理安装缓存
5. 安全规范
- 容器不要用 root 运行(添加普通用户)
- 数据库密码不要硬编码 Dockerfile,使用环境变量 / 配置文件挂载
- 容器禁止映射高危端口外网直接暴露(数据库尽量内网互通,不对外开放 3306)
6. 日常清理命令
bash
# 清理停止的容器、无用镜像、网络
docker system prune -a
# 清理所有无用卷(谨慎,会删持久化数据)
docker volume prune