1. Docker 核心概念(必懂)
1.1 镜像 Image
-
只读模板:包含程序、环境、依赖、配置
-
分为:官方镜像(mysql/redis/nginx)、自定义镜像(自己前后端)
-
镜像不包含运行时数据(日志、数据库数据都不在镜像里)
1.2 容器 Container
-
镜像 运行起来就是容器
-
容器是临时的、可销毁的
-
容器删除后,容器内部读写层数据全部丢失
-
Docker 最佳实践:一个容器只跑一个服务
1.3 数据卷 Volume(持久化核心)
-
解决问题:容器删了数据就丢
-
数据卷是 Docker 托管的独立存储空间,生命周期独立于容器
-
容器删除,数据卷数据保留
-
专门用于:MySQL、Redis 持久化存储
2. 两种挂载方式(必考区别)
2.1 Volume 数据卷挂载(生产、数据库首选)
-
格式:
-v 卷名:/容器路径 -
由 Docker 自动管理,用户不用管宿主机路径
-
适合:mysql、redis 持久化
2.2 Bind Mount 目录挂载(开发首选)
-
格式:
-v 宿主机绝对路径:/容器路径 -
直接映射本地文件夹到容器
-
适合:挂载代码、配置文件、热更新
2.3 挂载核心重点(你之前最迷惑的点)
-
挂载会覆盖/遮挡容器内原有目录
-
不是删除镜像文件,是运行时遮挡
-
取消挂载,原来镜像文件恢复
-
挂载最小粒度:整个目录 或 单个文件,不能过滤部分文件
3. 自定义镜像原理(前后端核心)
3.1 两种制作镜像方式
方式1:docker commit(不推荐)
-
运行容器后手动修改,打包快照
-
黑盒、不可追溯、体积大、不规范
-
不会打包数据卷数据
方式2:Dockerfile + build(企业标准)
-
源码 + Dockerfile = 构建自定义镜像
-
每一步可追溯、可版本控制、可提交 Git
-
镜像只包含:环境、依赖、代码,不包含业务数据
4. Docker Compose(你现在项目用的)
4.1 是什么
-
docker run:单容器命令 -
docker compose:一键编排多容器项目 -
本地开发 99% 项目全部使用 Compose
4.2 yml 两个核心写法区别(超级重要)
image:使用现成镜像
-
mysql、redis 使用官方镜像
-
直接拉取,无需源码
build: 路径:本地构建镜像
-
前后端自定义服务使用
-
必须要有本地源码 + Dockerfile
-
同事拉取 Git 代码后,本地自动 build 出镜像
4.3 container_name 作用
-
给容器手动命名,方便
docker exec进入 -
每个 service 就是一个独立容器
-
mysql、ebuy后端、前端都是独立容器,互不影响
4.4 Compose 自动网络
-
所有服务默认同一局域网
-
容器之间通信:直接使用服务名作为域名
-
例:后端连接 mysql 地址:
jdbc:mysql://mysql:3306/xxx
5. 多服务能不能放一个容器?
-
技术可以,生产绝对禁止
-
Docker 设计理念:一个容器一个主进程
-
缺点:一个服务崩,整个容器挂;无法单独扩容、排错、隔离资源
6. Docker MySQL 建表三种方式
方式1:docker exec 手动进库执行 SQL
适合临时测试,不适合团队协作
方式2:挂载 init 自动初始化 SQL(开发首选)
挂载 ./init:/docker-entrypoint-initdb.d
仅第一次空数据卷启动时执行
方式3:后端项目自动建表(MyBatis/JPA)
开发方便,生产环境关闭自动建表,防止误删数据
7. 开发环境完整运行流程(你的项目)
-
项目包含:
docker-compose.yml+ 前后端源码 + Dockerfile -
执行
docker compose up -d -
mysql、redis 拉官方镜像启动,挂载数据卷持久化
-
前后端根据本地 Dockerfile 自动 build 镜像启动
-
容器之间通过 compose 网络互相通信
-
数据存在数据卷,重启/删除容器不丢数据
8. 面试终极精华总结(背诵版)
-
镜像:只读环境模板,不含运行时数据
-
容器:镜像运行实例,临时可销毁
-
数据卷:实现数据持久化,容器删除数据保留
-
挂载:分为数据卷挂载(数据库)、目录挂载(开发代码),运行时遮挡原目录
-
自定义镜像:Dockerfile 构建,规范可复用;不使用 commit
-
Compose:本地多容器编排,一键启停,自动网络通信
-
最佳实践:一容器一服务、数据与程序分离、开发用build、线上用image