Docker 完整保姆级教程

一、Docker 核心概念

  1. 镜像 (image):只读模板,打包好的运行环境(如 mysql:8.0、java:17),相当于系统安装盘
  2. 容器 (container):镜像运行实例,独立隔离环境,可启停删除,一个镜像可跑多个容器
  3. Dockerfile:文本脚本,自定义构建镜像
  4. Docker Compose:多容器编排工具,一键启动多个关联服务(前端 + 后端 + mysql+redis)
  5. 仓库 (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(桌面版,开发用)

  1. 下载 Docker Desktop:https://www.docker.com/products/docker-desktop/
  2. Windows 需要开启 WSL2 / Hyper-V;Mac 直接安装
  3. 安装完成打开终端执行 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. 镜像过大优化

  1. 使用 alpine 轻量基础镜像
  2. 多阶段构建(前端 / 后端分开打包)
  3. 清理安装缓存

5. 安全规范

  1. 容器不要用 root 运行(添加普通用户)
  2. 数据库密码不要硬编码 Dockerfile,使用环境变量 / 配置文件挂载
  3. 容器禁止映射高危端口外网直接暴露(数据库尽量内网互通,不对外开放 3306)

6. 日常清理命令

bash

复制代码
# 清理停止的容器、无用镜像、网络
docker system prune -a
# 清理所有无用卷(谨慎,会删持久化数据)
docker volume prune