以下内容是基于个人理解+视频材料+视频内容整理得来
1.Ross-Ning:Docker 10分钟快速入门
docker解决的问题
1.一模一样的本地开发环境,每个容器类似一个镜像,不会出现这台电脑可以跑,服务器的电脑或者其他人的不可以跑:环境和开发包是一起的,且不会与其他容器相互影响,然后所有容器基于宿主机,虚拟机是每个系统虚拟出一个宿主机;
2.同时容量使用是需要多少用多少,可以压缩使用存储:因为不会像虚拟机那样需要模拟出硬件环境;
3.启动快,因为包小
启动需要
| 步骤 | 虚拟机 | Docker 容器 |
|---|---|---|
| 硬件模拟 | ✅ 需要(如虚拟CPU、BIOS) | ❌ 不需要 |
| 启动 Guest OS 内核 | ✅ 需要 | ❌ 直接使用宿主机内核 |
| 初始化系统服务(systemd/init) | ✅ 需要 | ❌ 不需要(直接运行应用) |
| 运行应用 | ✅ 最后一步 | ✅ 唯一任务 |
主要概念
Dockerfile
Dockerfile 是"用代码定义环境 "的方式,执行它就能一键构建 出包含应用及其完整运行环境的镜像 ,像用脚本安装 一台极简机器
1. 核心作用
Dockerfile 是一个纯文本文件,里面写了一系列指令 (每条指令对应一个操作步骤),用来描述如何从一个基础镜像开始,一步步安装软件、复制代码、设置环境变量、开放端口等,最终生成一个可复用的自定义镜像。
2. 工作流程
你编写 Dockerfile
执行
docker build -t 镜像名 .命令Docker 会逐行执行 Dockerfile 中的指令,每条指令可能产生一个新的镜像层(layer)
构建完成后得到一个镜像,可以
docker run启动容器3. 常用指令(举几个例子)
指令 作用 示例 FROM指定基础镜像(起点) FROM ubuntu:22.04WORKDIR设置工作目录 WORKDIR /appCOPY从宿主机复制文件到镜像 COPY . /appRUN在镜像构建时执行命令(如安装软件) RUN apt-get update && apt-get install -y python3ENV设置环境变量 ENV NODE_ENV=productionEXPOSE声明容器运行时监听的端口 EXPOSE 8080CMD指定容器启动时默认执行的命令 CMD ["python3", "app.py"]ENTRYPOINT配置容器启动的主程序,不易被覆盖 ENTRYPOINT ["nginx", "-g", "daemon off;"]4. 类比帮助理解
菜谱 :
FROM= 买面粉,RUN= 揉面,COPY= 加馅料,CMD= 最后说"开饭时上锅蒸"。Maven/Gradle 构建脚本:定义依赖、编译、打包过程,最终产出 jar 包(镜像)。
Git 仓库 + 自动构建 :把代码、配置、环境依赖全都写进一个文件,执行
docker build就得到可运行的"环境快照"。5. 为什么重要?
可重现性 :任何人拿到 Dockerfile,都能构建出完全相同的镜像。
自动化 :避免手动在容器里装软件再
commit的笨拙方式。版本控制:Dockerfile 可以像代码一样保存在 Git 里,方便协作和回滚。
轻量级:利用层缓存,修改 Dockerfile 中靠后的步骤时,前面的层可以复用,构建很快。
6. 一个小例子
bash# 使用官方 Python 基础镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制依赖文件和代码 COPY requirements.txt . RUN pip install -r requirements.txt COPY . . # 声明端口 EXPOSE 5000 # 启动应用 CMD ["python", "app.py"]
视频:
自动化安装脚本,主要用来创建镜像,类似在虚拟机中安装操作系统和软件一样
Image/镜像
可以这么理解快照:
虚拟机快照 ≈ Git 中执行
git commit后,又把仓库设置成"所有后续修改自动写入一个临时区域",且只能通过git reset --hard回到那个 commit。"暂存区"这个中间层在虚拟机快照里并不存在,修改是直接产生的
1.快照(Snapshot) 是在某个特定时间点对系统状态(包括数据、内存、配置等)的完整"拍照"保存。它允许你在将来某个时候回退到这个状态,就像时光倒流一样。
2.虚拟机的快照 是指对一台正在运行(或关闭)的虚拟机的全部状态进行保存,包括:
虚拟磁盘的当前数据(所有文件、操作系统、应用)
虚拟机内存内容(RAM 中的实时数据)
虚拟硬件的状态(CPU 寄存器、网卡配置、BIOS 设置等)
保存后,你可以随时将虚拟机恢复到拍摄快照的那个时刻,无论虚拟机后来发生了什么变化(安装软件、中毒、误删文件等)。
即:
虚拟机的快照 = 一份能让你穿越回某个时刻的"虚拟机时光机",它保存了完整的磁盘数据、内存内容和硬件状态。
3.工作原理(简化):
创建快照时,虚拟机监视器(如 VMware、VirtualBox、KVM)会暂停对原始虚拟磁盘的写入。
之后所有的写入操作都记录到一个新文件(差异磁盘 / 快照文件)中,而原始磁盘文件变成只读。
内存状态则被写入另一个文件(如 VMEM 文件)。
恢复快照时,丢弃差异磁盘和内存文件,将虚拟磁盘指回原始磁盘,并把内存状态加载回虚拟机,从而回到拍摄瞬间的状态。
4.注意事项:
快照不是备份。如果原始磁盘文件损坏,所有依赖它的快照可能都无法使用。
长时间、多层级的快照会显著降低虚拟机性能(因为磁盘 I/O 需要链式查找)。
生产环境中一般不长时间保留快照,多数会在创建新快照前合并(commit)旧快照。
视频的:
image就是类似一个虚拟机的快照,
包含你要部署的应用程序以及它所关联的所有库,通过镜像,我们可以创建许多个不同的Container容器

Container/容器
这里的容器就是一台台运行的虚拟机,独立运行着各个应用程序,互不影响
使用docker
视频下的:
官网安装,且在 Windows 10 上你可以使用 WSL2(也就是 Windows 下的 Linux子系统)来运行 Dock,按照官网即可
然后使用vscode可以安装相关插件可以提供Dockerfile语法检测,代码高亮...

应用的部署
首先在自己项目根目录下


1.创建一个Dockerflle的文件,然后
from
2.第一行用from命令指定一个基础镜像,可以节省好多软件的安装
这里 python是官方镜像名字,冒号后面一串是版本号【标签】
WORKDIR命令
3.后面的WORKDIR命令 指定了之后所有Docker 命令的工作路径(working directory),如果路径不存在,会自动创建,这样可以避免使用绝对路径或者手动cd切换路径,增加程序可读
这里dockerhub上提供了很多高质量的操作系统镜像
COPY
4.之后,我们可以调用COPY 命令将所有的程序拷贝到Docker镜像中

第一个参数代表本地文件,".":代表程序根目录下的所有文件;
第二个参数代表Docker镜像中的路径,这里的.代表当前的工作路径【即之前指定的app目录】
RUN
5.随后的RUN允许我们在创建镜像时运行任意的shell命令
如果是Linux 镜像,
echo、pwd、cp、rm都合法
比如这里用到pip install来安装 Python 程序的所有关联

总结


通过以上命令就可以完成一个Docker镜像的创建,在 Dockerfile 的最后,我们会用到CMD来指定当Docker容器运行起来以后要执行的命令
注意
容器≠镜像,CMD它和之前讲到的RUN不一样,RUN 是创建镜像 的时候使用的,CMD是运行容器时候使用的,到这里,我们的自动化脚本 Dockerfile就完成了。
理解:
一、
RUNvsCMD的区别
特性 RUNCMD执行阶段 构建镜像时 ( docker build过程)容器启动时 ( docker run或启动已有容器)作用 用于安装软件、修改配置、创建目录等固化到镜像中的操作 指定容器启动后默认运行的命令(可被覆盖) 镜像层 每一条 RUN都会产生一个新的镜像层不产生镜像层,只记录在镜像元数据中 数量 可以有任意多个 一个 Dockerfile 中只能有一个 CMD(最后一个生效)能否被覆盖 无法被覆盖(已固化到镜像) 可以被 docker run后面跟的命令覆盖,或被ENTRYPOINT影响举例说明
bashFROM ubuntu:22.04 # RUN -- 构建时执行,结果永久保存在镜像里 RUN apt-get update && apt-get install -y nginx RUN mkdir -p /app # CMD -- 运行时执行 CMD ["nginx", "-g", "daemon off;"] docker build 时,会运行 apt-get 和 mkdir,这些改动成为镜像的一部分。 docker run my-image 时,会自动执行 nginx -g "daemon off;"。 如果执行 docker run my-image echo hello,则 echo hello 覆盖了 CMD,nginx 不会被启动。常见用法
RUN:安装依赖、编译代码、设置权限、创建用户等。
CMD:提供默认的启动命令(可以是应用主进程、脚本、帮助信息等)。二、"容器不等于镜像"是什么意思?
这句话的核心是:镜像是静态的"模板",容器是动态的"运行实例"。
维度 镜像(Image) 容器(Container) 性质 只读文件(可包含多层) 可写的运行环境 存在形式 存储在磁盘上(如 /var/lib/docker/overlay2)运行在内存 + 磁盘上(有进程) 生命周期 永久存在(除非手动删除) 可能短暂(停止后可保留或删除) 是否可修改 不可直接修改(必须构建新镜像) 可修改(文件写入、安装软件等) 类比 类 / 光盘 ISO / 虚拟机模板 对象 / 光盘放入光驱运行 / 虚拟机实例 生动类比
镜像 = 一个装有操作系统的光盘(只读)
可以把它放进光驱运行,但光盘上的内容你改不了。
容器 = 光盘插入光驱后正在运行的系统
你在里面做的任何修改(如新建文件)都写在临时区域(容器层),关掉光驱(停止容器)后这些修改可能丢失(除非
commit成新镜像)。验证"容器不等于镜像"
启动一个容器:
docker run -it ubuntu bash在里面创建一个文件:
touch /tmp/test.txt退出容器(
exit),此时容器停止但还存在(docker ps -a能看到)再启动这个容器:
docker start -ai <容器id>,会发现/tmp/test.txt还在 ------ 因为容器有自己的可写层。但如果从同一个镜像(
ubuntu)新建 一个容器,就不会有那个文件 ------ 因为新容器基于只读镜像重新创建可写层。为什么强调这个区别?
理解数据持久化 :默认情况下容器删除后,可写层内容也会消失,所以重要数据要用
-v挂载卷。理解镜像构建 :
docker commit可以把一个容器的可写层"拍成"新镜像。理解"不可变基础设施":通常我们不修改容器内部,而是通过新镜像重新部署。
总结一句话
RUN用于打造镜像(构建时),CMD用于启动容器(运行时)。
镜像是只读的"图纸",容器是图纸造出来的"动态房子"。
接下来
操作
终端
1.docker build
bash
docker build -t my-finance.


接下来我们可以使用 docker build 来创建一个镜像
这里的-t指定了我们镜像的名字;
最后面的.告诉docker 应该在当前目录下寻找这个Dockerfile
2.docker run -p
有了镜像后启动容器:
bash
docker run -p 80:5000 -d my-finance

第一个参数
-p: 会将容器上的一个端口映射到本地主机,这样你才可以访问容器中的 web 应用
前面 80是我们本地主机 上的端口,后面 是容器上的端口,千万不要搞反
第二个参数
-d(--detached):让容器在后台运行,这样容器的输出不会直接显示在控制台,
这样就可以在浏览器访问这个web应用
然后我们通过 Docker Desktop这个图形界面,可以查看应用在后台的所有输出,对于调试非常方便

同时我们可以看到当前容器的各种信息

3.这里的Containers中显示了我们创建的所有容器

也可以shell远程调试
以下是对应的命令行指令

注意:删除相关

https://docs.docker.com/storage/volumes/
当我们删除一个容器的时候,之前所作的修改,新添加的数据会全部丢失,这就好比是我们删除一个虚拟机.里面的数据会一同消毁一样。

但如果希望保留容器中的数据,我们可以使用 Docker 提供的 volume 数据卷,你可以把它当作是一个在本地主机和不同容器中共享的文件夹。
你在某个容器中修改了某一个volume的数据,会同时反映在其他的容器上;
4. docker volume create
bash
docker volume create my-finance-data
我们可以通过 docker volume create来创建一个数据卷
随后启动的时候,我们可以通过-v参数指定,
bash
docker run -dp 80:5000 -v my-finance-data:/etc/finance my-finance
将这个数据卷挂载(mount)到容器中的哪一个路径上
向这个路径写入的任何数据都会被永久保存在这个数据卷中
多容器


实际使用时,我们的应用程序可能会用到多个容器共同协作,比如我们可以使用一个容器来运行Web应用,另一个容器来运行数据库系统,这样可以做到数据和应用逻辑的有效分离;
比如当Web程序宕机了,数据库依然在有效运转,这时我们只需要修复Web容器即可;
而docker compose刚好可以帮我们做到这一点
docker compose
用于定义和运行多个 Docker 容器

可以先创建docker-compose.yml文件,在这个文件下,我们通过 services来定义多个container
eg:


服务一:
version: "3"
- 版本声明 :指定 Compose 文件格式的版本。
"3"是较新且常用的版本,支持 swarm 模式等功能,但注意与version: "2"在某些语法上有差异。
services:
- 服务根节点:下方定义所有需要运行的容器(每个容器对应一个服务)。
web:
build: .
- 构建方式 :
web服务不会从现成镜像拉取,而是在当前目录(.)下查找 Dockerfile ,根据该 Dockerfile 构建一个新镜像。一般Dockerfile里会写如何安装依赖、复制代码、启动后端程序
ports:
- "80:5000"
-
端口映射 :将宿主机的 80 端口 映射到容器的 5000 端口。
-
格式:
"宿主机端口:容器端口" -
作用:外部访问服务器的
http://你的IP就会访问到容器内监听 5000 端口的应用。 -
注意:如果宿主机 80 端口已经被占用(比如已有 Nginx),会映射失败。
-
服务二
db:
image: "mysql"
- 使用镜像 :直接拉取官方
mysql镜像(默认latest标签,推荐写具体版本如mysql:8.0)
environment:
MYSQL_DATABASE: finance-db
MYSQL_ROOT_PASSWORD: secret
-
环境变量:向 MySQL 容器传入配置。
-
MYSQL_DATABASE:容器启动时自动创建名为finance-db的数据库。 -
MYSQL_ROOT_PASSWORD:设置 root 用户的密码为secret(生产环境绝对不要用这种弱密码,应使用 secrets 或外部文件)。
-
⚠️ 潜在问题 :如果配置缺少
volumes,意味着数据库容器删除后所有数据都会丢失。生产环境应该挂载卷来持久化数据,例如:yaml
volumes: - db_data:/var/lib/mysql # 挂载命名卷
volumes: db_data: # 声明卷(可以额外指定驱动、外部卷等)作用:
将 MySQL 容器内的数据目录
/var/lib/mysql(存放所有数据库文件)持久化到宿主机上一个名为my-finance-data的 Docker 命名卷中。即使容器被删除(
docker-compose down),数据仍然保留在这个卷里。下次重新up时,MySQL 会重新挂载同一个卷,从而恢复之前的数据
这里我们定义一个web容器,它里面运行了我们的web应用;
然后再定义一个db容器,里面运行了mysql数据库系统,这里我们可以通过这两个环境变量指定数据库的名字 和连接密码
同时在db容器中,我们还可以通过volumes指定一个数据卷用来永久存放数据
定义完毕后,我们永久保存数据;使用docker compose up来运行所有的容器
这里的-d(detach)同样代表在后台运行所有的容器
detach隔离的
| 你的操作 | 数据是否持久化 |
|---|---|
docker compose up(前台) + 有 volumes |
✅ 数据保存到卷,删除容器后数据还在 |
docker compose up -d(后台) + 有 volumes |
✅ 同样数据保存到卷 |
docker compose up -d(后台) + 没有 volumes |
❌ 容器删除后数据丢失 |
docker compose只是一个编排工具,负责启动、停止、管理多个容器。数据能不能持久保存,只取决于你在
docker-compose.yml里有没有正确配置volumes(命名卷或绑定挂载)。无论你用的是
docker compose up(前台)还是docker compose up -d(后台),只要配置了volumes,数据就会持久化;没配置,容器删除数据就丢。总结:数据持久化看 volumes,不看 compose 命令
相反命令:docker compose down
我们可以使用 docker compose down来停止并删除所有的容器
不过新创建的数据卷需要我们手动删除,除非我们在后面加入--volumes参数
bash
docker compose down --volumes
然后前面的这些操作都可以在图形界面完成
扩展linux:文件功能相关
/var 的全称是 "variable",它是 Linux 系统中一个非常重要的目录,专门用来存放会随着系统运行而不断变化的动态数据 。它的核心目的是将动态数据与静态的系统文件和程序文件(如 /etc, /usr)分离开,让系统管理变得更加清晰和高效。
可以把/var理解为系统的"文件处理中心",专门处理那些动态生成的数据。下面是一些常见子目录的具体内容:
| 子目录 | 核心作用与示例 |
|---|---|
/var/log |
系统日志中心 。存放系统和各种应用程序的日志文件,是排查故障、监控系统状态的首要位置 。 - syslog/messages:记录系统全局的一般性消息。 - auth.log/secure:记录用户登录、认证信息。 - boot.log:记录系统启动过程的信息。 - btmp:记录失败的登录尝试。 |
/var/cache |
应用程序缓存区。存储应用程序运行中产生的缓存数据,用来加速访问,比如 Linux 包管理器(apt/yum)下载的软件包就会暂存于此。 |
/var/lib |
应用状态仓库 。存放各种应用程序运行时需要持久保存的状态信息和数据文件。 - MySQL/PostgreSQL :数据库文件。 - Docker :容器镜像和容器数据。 - dpkg/rpm:包管理器的数据库。 |
/var/spool |
任务等待队列 。"spool"意为"排队",这里存放着等待被处理的任务。 - cups :待打印的文档队列。 - mail/postfix :待发送或接收的邮件队列。 - cron :定时任务的调度信息。 - at :at命令的单次任务队列。 |
/var/tmp |
持久化临时文件 。与系统重启后就被清空的 /tmp 不同,这个目录里的临时文件在系统重启后会被保留 。适合存放那些需要跨越重启的临时数据。 |
/var/mail |
用户邮件存储 。通常是一个指向 /var/spool/mail/ 的链接,用于存放系统用户的邮件。 |
/var/run |
运行时数据 。从启动到关闭期间的系统信息,如当前登录的用户、系统服务守护进程的 PID(进程 ID)文件等。现在通常是指向 /run 目录的符号链接。 |
/var/lock |
资源锁文件。包含一些锁文件,用于防止多个进程同时访问同一个硬件设备或文件,造成冲突。 |
⚠️ 重点关注:/var/log 和 /var/tmp
在 /var 的众多子目录中,有两个需要特别关注,一个关乎系统故障诊断,另一个关乎磁盘空间管理。
1. log 目录:故障诊断的第一站
当系统出现问题,比如某个软件无法启动、系统响应缓慢时,查看 /var/log/ 目录下的日志文件是排查故障最直接有效的方法。
-
核心文件 :除了上表提到的,
/var/log/messages(或/var/log/syslog)记录了最全面的系统和应用日志,是排查问题的起点。 -
用户登录记录 :
/var/log/wtmp记录所有用户成功登录和注销的历史。注意,这是二进制文件,需要用last命令查看。 -
日志管理 :为避免日志文件过大占满磁盘,系统自带
logrotate工具,它会自动对日志文件进行轮转、压缩和删除。
2. tmp 目录:与 /tmp 的核心差异
/var/tmp 和 /tmp 都用于存放临时文件,但最关键的差异在于是否持久化。
-
生命周期 :
/tmp中的文件通常在系统重启后就会被彻底清除 ;而/var/tmp中的文件在重启后会被保留。 -
存储方式 :
/tmp通常被挂载为内存文件系统tmpfs,读写速度快但占用内存;/var/tmp则位于硬盘上,空间更大但速度相对较慢
Docker和Kubernetes的区别与联系

Kubernetes所做的就是将你的各个容器分发到一个集群(cluster)上运行,并进行全自动化的管理,包括应用的部署和升级
当我们想使用一个集群的申脑来提供服务,并做到负载均衡故障转移等等,k8s就可以大显身手。

关于dockerfile和compose的细节还是要到官网看
2.【狂神说Java】Docker最新超详细版教程通俗易懂
学习大纲
docker出现原因


docker历史

docker和dockerhub(远程仓库)

能做什么
与虚拟机的不同

Docker中的名词概念
类比
概念
安装Docker
1.环境准备及查看

2.通过文档安装
怎么安装?需要准备哪些环境




配置阿里云镜像加速
1.登录阿里云找到容器服务




