SpringCloud_黑马商城(02-Docker)
https://qcnk990tpinb.feishu.cn/wiki/LgMgw8H2DiASIBkvZKncFOnlnAb?from=from_copylink
一、Docker 核心概念
1. 镜像(Image)与容器(Container)
-
镜像:一个只读模板,包含应用程序、运行环境、配置和依赖库(类似软件安装包),静态不可运行。
-
容器:基于镜像创建的隔离运行环境(镜像的运行实例),动态可读写,容器之间相互独立、互不影响。
-
关系:一个镜像可以创建多个容器;容器启动后会在镜像上层新增可写层,容器所有数据修改都存在可写层,镜像本身永久不变。
2. 镜像仓库
-
存储和管理镜像的平台,官方公共仓库为 Docker Hub,国内常用阿里云、网易云镜像仓库加速拉取。
二、Docker 客户端与服务端架构
- Client(客户端):用户执行
docker命令,发起各类操作请求。 - Docker Server(服务端):内含
docker daemon守护进程,负责后台管理镜像、容器、网络、存储。 - 工作流程:客户端发送命令 → 服务端守护进程处理 → 从镜像仓库拉取镜像 → 创建并启动容器。
- 补充:采用 C/S 架构,支持远程调用,客户端和守护进程可部署在不同服务器。
三、Docker快速入门-命令解读
以 MySQL 容器启动命令为例:

docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /host/mysql/data:/var/lib/mysql \
--restart always \
mysql:5.7
|
参数 |
作用 |
|---|---|
|
-d |
后台运行容器(守护进程模式) |
|
--name mysql |
给容器起唯一名称,便于后续管理 |
|
-p 3306:3306 |
端口映射:格式为「宿主机端口:容器端口」,外部可通过宿主机端口访问容器服务 |
|
-e TZ=Asia/Shanghai |
设置容器时区为上海时区,避免容器内时间与本地时间不一致 |
|
-e MYSQL_ROOT_PASSWORD=123 |
设置环境变量,配置 MySQL 的 root 用户初始登录密码 |
|
-v 宿主机目录:容器目录 |
数据卷挂载,实现数据持久化,容器删除后数据不丢失 |
|
--restart always |
容器开机自启、意外退出后自动重启 |
|
mysql:5.7 |
指定要使用的镜像名称和版本号,格式为「镜像名:版本标签」 |
四、镜像命名规范
-
公共仓库格式:[repository]:[tag]
-
repository:镜像名称(如 mysql、nginx)
-
tag:镜像版本号(如 5.7、8.0)
-
-
私有仓库格式:[仓库地址]/[镜像名]:[版本]
-
示例:registry.aliyuncs.com/xxx/mysql:5.7
-
-
不指定 tag 时,默认使用 latest(最新稳定版),例如 mysql:latest 默认为 MySQL 8.0。
-
注意:生产环境不建议直接使用 latest 标签,建议指定固定版本号 5.7 / 8.0
五、Docker常见命令

一、镜像仓库与本地镜像交互命

|
命令 |
作用 |
场景示例 |
|
|
从镜像仓库(如 Docker Hub)拉取镜像到本地 |
|
|
|
将本地构建的镜像推送到镜像仓库 |
|
二、本地镜像构建与管理命令

1. 镜像构建
|
命令 |
作用 |
场景示例 |
|
|
基于当前目录的 |
|
2. 镜像导入导出
|
命令 |
作用 |
场景示例 |
|
|
将本地镜像导出为压缩包(离线传输用) |
|
|
|
从压缩包导入镜像到本地 |
|
3. 本地镜像管理
|
命令 |
作用 |
场景示例 |
|
|
查看本地所有镜像列表 |
快速确认镜像是否拉取/构建成功 |
|
|
删除本地镜像(需确保无容器依赖该镜像) |
|
三、容器生命周期与管理命令

1. 容器启停与创建
|
命令 |
作用 |
场景示例 |
|
|
基于镜像创建并启动容器(核心命令) |
|
|
|
停止运行中的容器 |
|
|
|
启动已停止的容器 |
|
2. 容器状态查看与删除
|
命令 |
作用 |
场景示例 |
|
|
查看当前运行中的容器 |
快速确认容器是否正常启动 |
|
|
查看所有容器(运行中+已停止) |
排查已停止的容器问题 |
|
|
删除已停止的容器 |
|
|
|
强制删除运行中的容器 |
|
3. 容器日志与内部操作
|
命令 |
作用 |
场景示例 |
|
|
查看容器运行日志(排查启动失败/报错) |
|
|
|
进入容器内部执行命令(如 bash) |
|
四、命令流程总结
-
镜像准备:通过
pull/build获取本地镜像,用images查看、rmi删除,或save/load离线传输。 -
容器运行:用
run创建容器,start/stop控制启停,ps查看状态。 -
容器管理:用
logs排查问题,exec进入容器操作,rm清理容器。 -
仓库交互:构建好的镜像可通过
push推送到仓库,供其他机器拉取使用。
六、数据卷

一、什么是数据卷?
数据卷(Volume)是 Docker 提供的文件持久化、容器与宿主机文件双向同步机制;本质是宿主机虚拟目录,作为容器目录和宿主机目录的映射桥梁。
解决两大痛点:
- 容器删除数据丢失:容器可写层随容器销毁,数据卷独立于容器,删容器不删数据。
- 容器内操作不便:官方镜像精简无
vi/vim,直接在宿主机修改文件即可同步到容器。
二、如何挂载数据卷?
1.挂载语法
在 docker run 创建容器时,使用 -v 参数:
-v 数据卷名/宿主机路径:容器内目录
2.关键规则
-
容器创建时,如果挂载的数据卷不存在,Docker 会自动创建该数据卷
-
首次挂载会覆盖容器内原有目录文件。
3.两种常见挂载方式
-
方式 1:命名数据卷挂载(推荐)
# 语法:-v 数据卷名:容器内目录 docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx -
特点:Docker 自动管理路径,无需手动建目录,适合通用持久化。
-
方式 2:绑定宿主机目录挂载
# 语法:-v 宿主机绝对路径:容器内目录 docker run -d --name nginx -p 80:80 -v /root/nginx/html:/usr/share/nginx/html nginx特点:自定义宿主机路径,需手动创建目录,适合自己管理文件位置。
- 命名数据卷:Docker 自动管理路径,无需手动建目录
- 绑定宿主机目录:自定义宿主机路径,目录需手动创建
三、数据卷的底层原理(结合图)

-
路径映射关系
-
容器内路径:图中 Nginx 容器的静态资源目录
/usr/share/nginx/html -
数据卷路径:
-
启动容器时通过
-v html:/usr/share/nginx/html指定了名为html的数据卷 -
Docker 自动在宿主机
/var/lib/docker/volumes/html/_data下创建对应目录(docker volume inspect html(宿主机真实路径:/var/lib/docker/volumes/html/_data) -
可通过
docker volume inspect html查看Mountpoint字段确认路径
-
-
双向同步:容器内读写
/usr/share/nginx/html时,实际操作的是宿主机上的/var/lib/docker/volumes/html/_data目录;在宿主机修改该目录下的文件,容器内也会同步生效。
-
数据卷的生命周期
- 数据卷独立容器存在,删容器不会自动删数据卷,需手动
docker volume rm删除。 - 适合存放:数据库数据、配置文件、静态资源、日志等需要持久化的数据。
四、数据卷核心命令
|
命令 |
作用 |
常用示例 |
|
|
创建数据卷 |
|
|
|
查看所有数据卷 |
|
|
|
查看数据卷详情 |
|
|
|
删除指定数据卷 |
|
|
|
清理所有未被使用的数据卷 |
|
七、案例
案例一:Nginx 容器数据卷部署静态资源(命名数据卷挂载)
一、案例目标
-
创建 Nginx 容器,修改容器内
/usr/share/nginx/html/index.html静态文件内容 -
将本地静态资源部署到 Nginx 容器,实现文件同步与数据持久化
二、核心知识点回顾
-
数据卷挂载规则
-
挂载语法:
docker run -v 数据卷名:容器内目录 -
自动创建:容器启动时,若挂载的数据卷不存在,Docker 会自动创建该数据卷
-
双向同步:宿主机修改数据卷文件,容器内会实时生效
-
Nginx 容器静态资源路径
-
容器内静态文件默认路径:
/usr/share/nginx/html -
修改该目录下的文件,即可改变 Nginx 对外提供的网页内容
三、完整操作步骤
1.准备工作:清理旧容器
# 强制删除已有的 nginx 容器(避免端口/名称冲突)
docker rm -f nginx
2.启动 Nginx 容器并挂载数据卷
# 启动容器:后台运行、端口映射、挂载数据卷
docker run -d \
--name nginx \
-p 80:80 \
-v html:/usr/share/nginx/html \
nginx
-
-d:后台守护进程模式运行 -
--name nginx:自定义容器名称 -
-p 80:80:宿主机 80 端口映射容器 80 端口 -
-v html:/usr/share/nginx/html:挂载名为html的数据卷到容器静态资源目录
3.验证容器与数据卷
# 查看容器运行状态
docker ps
# 查看所有数据卷,确认 html 卷已创建
docker volume ls
# 查看 html 数据卷的宿主机实际路径
docker volume inspect html
-
输出中的
Mountpoint字段即为数据卷在宿主机的路径,例如:/var/lib/docker/volumes/html/_data
4.修改静态文件(宿主机直接操作)
# 进入数据卷在宿主机的目录
cd /var/lib/docker/volumes/html/_data
# 修改 index.html 文件(可直接用编辑器打开修改)
vi index.html
修改示例:
<h1>Welcome to HeiMa!</h1>
<p>静态资源已通过数据卷挂载成功!</p>
5.验证效果访问
服务器IP:80 查看页面,修改宿主机文件刷新即可同步。
四、关键验证命令说明
|
命令 |
作用 |
对应截图中的验证点 |
|
docker ps |
查看容器运行状态 |
确认 Nginx 容器正常启动、端口映射生效 |
|
docker volume ls |
查看所有数据卷 |
验证 html 数据卷已自动创建 |
|
docker volume inspect html |
查看数据卷详情 |
获取数据卷在宿主机的实际路径 Mountpoint |
五、避坑与优化说明
-
容器内无编辑器问题:官方 Nginx 镜像为精简版,默认不包含
vi/vim,无需进入容器修改,直接在宿主机数据卷目录操作即可。 -
文件覆盖问题:首次挂载数据卷时,容器内
/usr/share/nginx/html的默认文件会被数据卷内容覆盖,需在宿主机数据卷目录中维护文件。 -
数据持久化:删除 Nginx 容器不会删除
html数据卷,数据会永久保留,后续可直接挂载到新容器使用。
案例2 - MySQL 容器数据挂载
一、案例需求
-
查看 MySQL 容器,判断是否有数据卷挂载
-
基于宿主机目录实现 MySQL 数据目录、配置文件、初始化脚本的挂载(参考官方镜像文档)
二、挂载规则说明
在 docker run 命令中,使用 -v 参数完成挂载:
-
绑定宿主机目录:
-v 本地目录:容器内目录 -
区分规则:
-
以
/或./开头 → 被识别为宿主机目录(绑定挂载) -
直接以名称开头 → 被识别为数据卷(命名卷)
-
-
示例:
-
-v mysql:/var/lib/mysql→ 挂载名为mysql的数据卷 -
-v ./mysql:/var/lib/mysql→ 挂载当前目录下的mysql目录
-
三、挂载目录规划
|
宿主机目录 |
容器内目录 |
作用 |
|
|
|
挂载 MySQL 数据目录,实现数据持久化 |
|
|
|
挂载 SQL 初始化脚本,容器启动时自动执行 |
|
|
|
挂载 MySQL 配置文件(如 my.cnf) |
四、完整操作步骤
1. 宿主机创建挂载目录
# 创建目录结构
mkdir -p /root/mysql/{data,init,conf}
2. 启动 MySQL 容器并挂载目录
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql
3. 验证容器挂载情况
# 查看容器信息,确认挂载配置
docker inspect mysql
-
查看
Mounts字段:Source 宿主机路径、Destination 容器路径、RW 读写权限。
五、关键命令说明
|
命令 |
作用 |
|
|
查看 MySQL 容器运行状态 |
|
|
查看容器挂载详情,判断是否有数据卷/目录挂载 |
|
|
查看数据卷列表,确认无自动创建的匿名卷 |
六、避坑说明
- 目录权限不足导致 MySQL 启动失败,可临时授权:
chmod -R 777 /root/mysql - 初始化 SQL 仅在数据目录为空时执行一次。
- 挂载配置文件优先级更高,修改后需重启容器生效。
八、Docker 自定义镜像(Dockerfile)知识点
一、什么是自定义镜像?
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程,本质就是把上述文件分层打包的过程。
二、Java 应用部署 vs 镜像构建对比

三、镜像分层结构

-
基础镜像(BaseImage):提供系统环境、函数库、配置文件(如 Ubuntu 系统)
-
层(Layer):每一条 Dockerfile 指令都会生成新的一层(如安装 JRE、拷贝 Jar 包、配置脚本)
-
入口(Entrypoint):镜像运行的入口,一般是程序启动命令(如
java -jar xx.jar)
四、Dockerfile 核心指令

五、Dockerfile 示例(两种写法)

1. 精简版(基于 JDK 基础镜像)
# 基础镜像(已包含 JRE)
FROM openjdk:11.0-jre-buster
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝 Jar 包到镜像内
COPY docker-demo.jar /app.jar
# 容器启动入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
2. 完整版(基于 Ubuntu 基础镜像)
# 基础镜像
FROM ubuntu:16.04
# 配置环境变量
ENV JAVA_DIR=/usr/local
# 拷贝 JDK 和 Jar 包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装 JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 容器启动入口
ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]
六、构建镜像命令
docker build -t myImage:1.0 .
-
-t:给镜像打标签,格式镜像名:版本号,不指定 tag 默认为latest -
.:指定 Dockerfile 所在目录(当前目录用.)
七、核心问题解答
-
镜像的结构是怎样的?
镜像包含应用运行所需的环境、函数库、配置和应用本身,文件以分层的方式打包存储。
-
Dockerfile 是做什么的?
用固定指令描述镜像的结构和构建过程,让 Docker 可以按步骤自动构建镜像。
-
构建镜像的命令是什么?
docker build -t 镜像名 Dockerfile目录
九、Docker 网络知识点
一、Docker 默认网络(Bridge 模式)

默认情况下,所有容器都通过 bridge 模式连接到 Docker 的虚拟网桥 docker0:
-
docker0网桥默认网段:172.17.0.1/16 -
每个容器会分配一个独立的虚拟 IP(如
172.17.0.2、172.17.0.3) -
容器内的
eth0网卡通过vethX虚拟设备连接到docker0网桥 -
同一网桥下的容器可通过 IP 互相访问,但无法直接通过容器名访问
二、自定义网络的优势
只有加入自定义网络的容器,才能通过容器名互相访问(内置 DNS 解析),更适合微服务场景。
三、Docker 网络核心命令

四、常用操作示例
1. 创建自定义网络
docker network create my-network
2. 容器加入自定义网络
# 启动容器时直接加入网络
docker run -d --name nginx --network my-network nginx
# 已运行的容器加入网络
docker network connect my-network mysql
3. 查看网络详情
docker network inspect my-network
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)