本文基于Docker实战文档整理,构建结构化知识体系,涵盖Docker核心概念、基础操作、数据卷、自定义镜像、网络配置及项目部署全流程,同时附上完整的Docker安装指南。内容兼顾入门友好性与实战实用性,适用于个人学习笔记及教学场景。

一、Docker概述与核心优势

1.1 传统部署的痛点

在传统Linux环境部署项目时,普遍面临以下问题:

  • 命令繁多且难记忆,学习成本高;

  • 软件安装包名称复杂,获取渠道不统一;

  • 安装部署步骤繁琐,容易因环境差异出错;

  • 多服务器部署时,环境一致性难以保证,脚本复用性低。

1.2 Docker的核心价值

Docker是一款开源的容器化技术,核心优势在于解耦应用与运行环境,实现“一次构建,到处运行”,具体体现在:

  • 简化部署流程:无需手动处理依赖、配置环境,一条命令即可完成软件部署;

  • 跨平台兼容:相同的Docker命令可在CentOS、Ubuntu、macOS、Windows(WSL)等系统运行;

  • 环境一致性:容器包含应用运行所需的完整环境,避免“开发环境正常,生产环境报错”;

  • 高效运维:支持批量容器管理,大幅降低多服务器部署的工作量。

1.3 学习目标

  • 能利用Docker部署常见软件(如MySQL、Nginx);

  • 能利用Docker打包并部署Java应用;

  • 理解Docker数据卷的基本作用及使用方式;

  • 能看懂并编写Docker Compose文件,实现多容器协同部署。

二、Docker快速入门

本教程统一使用预置Docker环境的CentOS虚拟机(无需额外安装);若需在其他机器安装Docker,可参考本文附录。

2.1 快速部署MySQL(对比传统部署)

2.1.1 传统部署MySQL步骤

  1. 搜索并下载对应系统的MySQL安装包;

  2. 上传安装包至Linux环境;

  3. 解压文件并配置环境变量;

  4. 执行安装命令并解决依赖问题;

  5. 初始化数据库并配置权限。

2.1.2 Docker部署MySQL(一步完成)

在命令行输入以下命令,直接创建并运行MySQL容器:

1
2
3
4
5
6
7

docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql:8

2.1.3 运行效果与说明

命令执行后,终端会输出容器ID(如6097d43dc087…),表示MySQL容器创建成功,可直接通过客户端工具连接(主机:虚拟机IP,端口:3307,密码:123)。

Docker自动完成的操作:

  • 从镜像仓库搜索并下载mysql:8镜像(本地已存在则直接使用);

  • 基于镜像创建容器,并配置端口映射、时区、初始密码等参数;

  • 自动启动容器内的MySQL服务,无需手动干预。

2.2 核心概念:镜像与容器

  • 镜像(Image):可理解为“软件安装包+运行环境”的只读模板,包含程序运行所需的系统函数库、依赖、配置等。例如mysql:8就是MySQL 8版本的镜像。

  • 容器(Container):镜像的运行实例,是独立的隔离环境。容器可启动、停止、删除,每个容器之间相互隔离,不影响主机环境。

2.3 镜像仓库(Docker Registry)

Docker镜像的存储与管理平台,用于存放各类软件的镜像,分为三类:

  • 官方仓库:Docker Hub(https://hub.docker.com),包含官方基础镜像及各大厂商提供的软件镜像(国内访问较慢);

  • 第三方仓库:阿里云、华为云等提供的镜像仓库,支持镜像加速,提升下载速度;

  • 私有仓库:企业内部搭建的仓库,用于存储机密项目的自定义镜像。

镜像来源:① 直接从镜像仓库下载;② 基于基础镜像自定义构建。

2.4 快速入门总结

Docker部署应用的核心流程:通过Docker命令告知Docker守护进程 → 守护进程从镜像仓库拉取对应镜像 → 基于镜像创建并启动容器 → 应用部署完成。

三、Docker基础操作

3.1 核心命令汇总

以下是Docker日常使用的核心命令,涵盖镜像管理、容器管理等场景:

命令 说明 示例
docker pull 从镜像仓库拉取镜像 docker pull nginx:1.20.2
docker push 推送镜像到镜像仓库 docker push myapp:1.0
docker images 查看本地所有镜像 docker images
docker rmi 删除本地镜像(需先删除依赖容器) docker rmi nginx:1.20.2
docker run 创建并运行容器(不可重复创建同名容器) docker run -d --name nginx -p 80:80 nginx
docker stop 停止指定容器 docker stop nginx
docker start 启动已停止的容器 docker start nginx
docker restart 重启容器 docker restart nginx
docker rm 删除容器(运行中容器需加 -f 强制删除) docker rm -f nginx
docker ps 查看容器(默认显示运行中,-a 显示所有) docker ps -a
docker logs 查看容器运行日志(-f 实时监控) docker logs -f mysql
docker exec 进入运行中的容器 docker exec -it nginx bash
docker save 将镜像保存为本地压缩文件 docker save -o nginx.tar nginx:1.20.2
docker load 加载本地压缩文件为镜像 docker load -i nginx.tar
docker inspect 查看容器/镜像详细信息 docker inspect mysql

3.1.1 开机自启配置

默认情况下,虚拟机重启后Docker及容器需手动启动,可通过以下命令设置开机自启:

1
2
3
4
5
6

# Docker服务开机自启
systemctl enable docker

# 单个容器开机自启(替换为容器名/容器ID)
docker update --restart=always mysql

3.1.2 命令演示(以Nginx为例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 1. 拉取Nginx 1.20.2版本镜像
docker pull nginx:1.20.2

# 2. 查看本地镜像
docker images

# 3. 创建并运行Nginx容器
docker run -d --name nginx -p 80:80 nginx:1.20.2

# 4. 查看运行中容器
docker ps -a

# 5. 访问测试:浏览器输入 http://虚拟机IP(如192.168.200.128)

# 6. 停止Nginx容器
docker stop nginx

# 7. 查看所有容器(包括已停止)
docker ps -a

# 8. 重新启动Nginx容器
docker start nginx

# 9. 进入Nginx容器内部
docker exec -it nginx bash

# 10. 强制删除Nginx容器
docker rm -f nginx

3.2 数据卷(Volume)

3.2.1 核心问题:容器与数据解耦

容器是隔离环境,内部文件默认存储在容器内部:① 容器销毁后,数据会丢失(如MySQL数据);② 直接操作容器内文件不方便(如修改Nginx配置)。因此需要通过数据卷实现“容器内目录”与“宿主机目录”的映射。

3.2.2 数据卷定义与优势

数据卷是Docker管理的虚拟目录,作为容器内目录与宿主机目录的桥梁,优势:

  • 数据持久化:容器销毁后,数据存储在宿主机,不会丢失;

  • 解耦环境:容器仅关注运行,数据存储由宿主机管理;

  • 灵活映射:可通过数据卷间接映射,避免容器与宿主机目录强耦合。

默认数据卷存储路径:/var/lib/docker/volumes/[数据卷名]/_data

3.2.3 数据卷核心命令

命令 说明 示例
docker volume create 创建数据卷 docker volume create nginx-html
docker volume ls 查看所有数据卷 docker volume ls
docker volume rm 删除指定数据卷 docker volume rm nginx-html
docker volume inspect 查看数据卷详情(含宿主机路径) docker volume inspect nginx-html
docker volume prune 删除未使用的数据卷(清理空间) docker volume prune

3.2.4 数据卷挂载演示(Nginx)

通过-v 数据卷名:容器内目录实现挂载(创建容器时配置,不可事后修改):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 1. 创建Nginx容器并挂载数据卷(数据卷自动创建)
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx:1.20.2

# 2. 查看数据卷列表
docker volume ls

# 3. 查看html数据卷详情(获取宿主机映射路径)
docker volume inspect html

# 4. 进入宿主机映射目录,修改index.html
cd /var/lib/docker/volumes/html/_data
vi index.html

# 5. 浏览器访问虚拟机IP,查看修改效果
# 6. 进入容器内部验证:容器内文件同步更新
docker exec -it nginx bash
cat /usr/share/nginx/html/index.html

3.2.5 匿名数据卷

创建容器时未指定数据卷名,仅指定容器内目录,Docker会自动创建“匿名数据卷”(名称为随机哈希值)。例如MySQL容器默认会匿名挂载/var/lib/mysql目录,确保数据持久化。

1
2
3
4
5

# 查看MySQL容器的挂载信息
docker inspect mysql

# 关键信息:.Config.Volumes(声明需挂载目录)、.Mounts(实际挂载信息,含匿名数据卷名)

3.2.6 本地目录/文件直接挂载

数据卷默认路径较深,可直接将容器目录挂载到宿主机指定目录(更直观),语法:-v 宿主机目录:容器内目录(宿主机目录需以/或./开头,否则识别为数据卷)。

示例:MySQL本地目录挂载(提前在宿主机创建/root/mysql/data、conf、init目录)

1
2
3
4
5
6
7
8
9
10

docker run -d \
--name mysql \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123 \
-e TZ=Asia/Shanghai \
-v /root/mysql/data:/var/lib/mysql \ # 数据目录挂载
-v /root/mysql/init:/docker-entrypoint-initdb.d \ # 初始化SQL目录
-v /root/mysql/conf:/etc/mysql/conf.d \ # 配置文件目录
mysql:8

3.3 自定义镜像(Dockerfile)

3.3.1 自定义镜像场景

官方镜像无法满足需求时(如部署自定义Java项目),需基于基础镜像构建自定义镜像。镜像本质是“分层文件集合”,每层对应构建过程的一个操作步骤。

3.3.2 Dockerfile核心语法

Dockerfile是记录镜像构建步骤的文本文件,常用指令:

指令 说明 示例
FROM 指定基础镜像(必须放在首行) FROM centos:7
ENV 设置环境变量(后续指令可复用) ENV JAVA_HOME=/usr/local/jdk-17.0.10
COPY 拷贝宿主机文件到镜像内 COPY app.jar /app/app.jar
RUN 执行Linux shell命令(构建时运行) RUN tar -xzf jdk17.tar.gz -C /usr/local/
EXPOSE 声明容器运行时监听的端口(仅说明,不映射) EXPOSE 8080
WORKDIR 设置容器运行时的工作目录 WORKDIR /app
ENTRYPOINT 指定容器启动时执行的命令(不可被覆盖) ENTRYPOINT [“java”,“-jar”,“app.jar”]

3.3.3 自定义Java应用镜像示例

需求:基于CentOS 7构建包含JDK 17和Java项目(app.jar)的镜像。

步骤1:准备文件

在宿主机创建myapp目录,放入三个文件:① Dockerfile;② jdk17.tar.gz(JDK压缩包);③ app.jar(项目打包文件)。

步骤2:编写Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 基础镜像
FROM centos:7

# 拷贝并解压JDK
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ && rm /usr/local/jdk17.tar.gz

# 配置JDK环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH

# 创建应用目录并设置工作目录
RUN mkdir -p /app
WORKDIR /app

# 拷贝项目JAR包
COPY app.jar app.jar

# 声明端口
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/app.jar"]

步骤3:构建镜像

1
2
3
4
5
6
7
8
9

# 进入myapp目录
cd /root/myapp

# 构建镜像(-t 指定镜像名:版本,. 表示Dockerfile在当前目录)
docker build -t myapp:1.0 .

# 查看构建后的镜像
docker images

3.4 Docker网络

3.4.1 容器互联问题

容器默认使用Docker桥接网络,可通过IP互联,但容器IP是虚拟IP,重启后可能变化,直接写死IP会导致连接失败。解决方案:自定义网络,通过容器名互联。

3.4.2 网络核心命令

命令 说明 示例
docker network create 创建自定义网络 docker network create itheima
docker network ls 查看所有网络 docker network ls
docker network connect 将容器加入指定网络 docker network connect itheima mysql
docker network disconnect 将容器移出网络 docker network disconnect itheima mysql
docker network rm 删除指定网络 docker network rm itheima
docker network inspect 查看网络详细信息 docker network inspect itheima

3.4.3 自定义网络演示(容器名互联)

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 1. 创建自定义网络 itheima
docker network create itheima

# 2. 查看网络列表(包含默认bridge、host、none网络)
docker network ls

# 3. 将mysql和myapp容器加入itheima网络
docker network connect itheima mysql
docker network connect itheima myapp

# 4. 进入myapp容器,通过容器名ping mysql(无需记IP)
docker exec -it myapp bash
ping mysql # 成功互联,输出类似:64 bytes from mysql.itheima (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms

四、项目部署实战(tlias项目)

本实战基于tlias-web-management项目,实现“后端Java服务+前端Nginx+MySQL”的完整部署,分为手动部署和Docker Compose批量部署两种方式。

4.1 手动部署(分步实现)

4.1.1 部署服务端(Java项目)

步骤1:项目准备与打包

  • 修改项目配置文件application.yml,将MySQL地址改为容器名(加入同一网络后可通过容器名访问):
1
2
3
4
5
6
7

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/tlias # mysql为容器名
username: root
password: 123
  • 通过Maven执行package命令(跳过测试),将打包后的JAR包命名为tlias.jar

步骤2:编写Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 基础镜像
FROM centos:7

# 拷贝并解压JDK
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ && rm /usr/local/jdk17.tar.gz

# 配置JDK环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATH

# 配置阿里云OSS环境变量(项目依赖时添加)
ENV OSS_ACCESS_KEY_ID=LTAI5tP6dc4cvccdvvySE39X
ENV OSS_ACCESS_KEY_SECRET=ZSyIT31qhxIkS0dH1H9WzHqPiyM3Ot

# 统一编码
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8

# 创建应用目录并设置工作目录
RUN mkdir -p /tlias
WORKDIR /tlias

# 拷贝项目JAR包
COPY tlias.jar tlias.jar

# 声明端口
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java","-jar","/tlias/tlias.jar"]

步骤3:构建镜像并启动容器

1
2
3
4
5
6
7
8
9
10
11
12
13

# 1. 宿主机创建/root/tlias目录,上传Dockerfile、tlias.jar、jdk17.tar.gz
mkdir -p /root/tlias
cd /root/tlias

# 2. 构建镜像
docker build -t tlias:1.0 .

# 3. 启动容器(加入itheima网络,与MySQL互联)
docker run -d --name tlias-server --network itheima -p 8080:8080 tlias:1.0

# 4. 查看运行日志(验证启动成功)
docker logs -f tlias-server

4.1.2 部署前端(Nginx)

步骤1:准备前端资源

  • 宿主机创建/usr/local/tlias-web目录,包含html(前端静态资源)和conf(Nginx配置文件)子目录;

  • 将前端打包后的静态资源(assets、index.html等)上传到/usr/local/tlias-web/html

  • 将配置好的nginx.conf上传到/usr/local/tlias-web/conf(配置反向代理到后端服务)。

步骤2:启动Nginx容器

1
2
3
4
5
6
7
8

docker run -d \
--name nginx-tlias \
-v /usr/local/tlias-web/html:/usr/share/nginx/html \ # 静态资源挂载
-v /usr/local/tlias-web/conf/nginx.conf:/etc/nginx/nginx.conf \ # 配置文件挂载
--network itheima \ # 加入同一网络
-p 80:80 \
nginx:1.20.2

步骤3:访问测试

浏览器输入http://虚拟机IP,能正常显示前端页面并调用后端接口,说明部署成功。

4.2 Docker Compose批量部署

4.2.1 Docker Compose优势

多容器项目(如前端、后端、MySQL)手动部署步骤繁琐,Docker Compose可通过一个docker-compose.yml文件定义所有容器的配置,一键完成创建、启动、网络配置等操作。

4.2.2 核心语法(与docker run参数对应)

docker run 参数 docker-compose.yml 指令 说明
–name container_name 容器名称
-p ports 端口映射
-e environment 环境变量
-v volumes 数据卷/目录挂载
–network networks 加入的网络
镜像名 image 使用的镜像
-f(Dockerfile) build.context/dockerfile 构建自定义镜像的配置

4.2.3 docker-compose.yml编写(tlias项目)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

services:
# MySQL服务
mysql:
image: mysql:8
container_name: mysql
ports:
- "3307:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "/usr/local/app/mysql/conf:/etc/mysql/conf.d"
- "/usr/local/app/mysql/data:/var/lib/mysql"
- "/usr/local/app/mysql/init:/docker-entrypoint-initdb.d"
networks:
- tlias-net

# 后端Java服务
tlias:
build:
context: . # Dockerfile所在目录(当前目录)
dockerfile: Dockerfile # Dockerfile文件名
container_name: tlias-server
ports:
- "8080:8080"
networks:
- tlias-net
depends_on: # 依赖mysql服务,启动顺序:先启动mysql再启动tlias
- mysql

# 前端Nginx服务
nginx:
image: nginx:1.20.2
container_name: nginx-tlias
ports:
- "80:80"
volumes:
- "/usr/local/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "/usr/local/app/nginx/html:/usr/share/nginx/html"
networks:
- tlias-net
depends_on: # 依赖tlias服务
- tlias

# 自定义网络(所有服务加入此网络,实现容器名互联)
networks:
tlias-net:
name: itheima # 网络名称为itheima

4.2.4 Docker Compose核心命令

命令 说明 示例
docker compose up -d 后台启动所有服务(创建容器、网络等) docker compose up -d
docker compose down 停止并删除所有容器、网络(数据卷保留) docker compose down
docker compose ps 查看当前服务的容器状态 docker compose ps
docker compose logs 服务名 查看指定服务的运行日志 docker compose logs tlias
docker compose stop/start/restart 停止/启动/重启所有服务 docker compose restart
docker compose exec 服务名 命令 进入指定服务的容器执行命令 docker compose exec mysql bash

4.2.5 部署演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 1. 宿主机创建/usr/local/app目录,上传以下文件/目录:
# - docker-compose.yml
# - Dockerfile、tlias.jar、jdk17.tar.gz(后端构建依赖)
# - mysql/conf、mysql/data、mysql/init(MySQL配置/数据/初始化SQL)
# - nginx/conf、nginx/html(Nginx配置/前端资源)

# 2. 进入/usr/local/app目录
cd /usr/local/app

# 3. 一键部署所有服务(后台运行)
docker compose up -d

# 4. 查看容器状态
docker compose ps

# 5. 访问测试:浏览器输入http://虚拟机IP

五、附录:Docker安装与配置(CentOS)

5.1 卸载旧版Docker(可选)

若系统已安装旧版Docker,先执行卸载命令:

1
2
3
4
5
6
7
8
9
10

yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux

5.2 配置Docker的YUM源

1
2
3
4
5
6
7
8
9
10

# 1. 安装yum工具依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 2. 配置阿里云Docker YUM源(国内加速)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# 3. 更新yum缓存
sudo yum makecache fast

5.3 安装Docker

1
2

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

5.4 启动与校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 启动Docker服务
systemctl start docker

# 停止Docker服务
systemctl stop docker

# 重启Docker服务
systemctl restart docker

# 设置Docker开机自启
systemctl enable docker

# 校验安装成功(无报错即正常)
docker ps

5.5 配置镜像加速(国内必备)

配置国内镜像源,提升镜像下载速度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 1. 删除旧配置文件(若存在)
rm -f /etc/docker/daemon.json

# 2. 写入镜像加速配置(多个源备选)
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF

# 3. 重新加载配置
systemctl daemon-reload

# 4. 重启Docker使配置生效
systemctl restart docker

(注:文档部分内容可能由 AI 生成)