docker学习笔记(基于b站多个视频学习)【未完结】

以下内容是基于个人理解+视频材料+视频内容整理得来

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.04
WORKDIR 设置工作目录 WORKDIR /app
COPY 从宿主机复制文件到镜像 COPY . /app
RUN 在镜像构建时执行命令(如安装软件) RUN apt-get update && apt-get install -y python3
ENV 设置环境变量 ENV NODE_ENV=production
EXPOSE 声明容器运行时监听的端口 EXPOSE 8080
CMD 指定容器启动时默认执行的命令 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.工作原理(简化)

  1. 创建快照时,虚拟机监视器(如 VMware、VirtualBox、KVM)会暂停对原始虚拟磁盘的写入。

  2. 之后所有的写入操作都记录到一个新文件(差异磁盘 / 快照文件)中,而原始磁盘文件变成只读。

  3. 内存状态则被写入另一个文件(如 VMEM 文件)。

  4. 恢复快照时,丢弃差异磁盘和内存文件,将虚拟磁盘指回原始磁盘,并把内存状态加载回虚拟机,从而回到拍摄瞬间的状态。

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上提供了很多高质量的操作系统镜像

https://hub.docker.com/_/python

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就完成了。

理解:

一、RUN vs CMD 的区别

特性 RUN CMD
执行阶段 构建镜像时docker build 过程) 容器启动时docker run 或启动已有容器)
作用 用于安装软件、修改配置、创建目录等固化到镜像中的操作 指定容器启动后默认运行的命令(可被覆盖)
镜像层 每一条 RUN 都会产生一个新的镜像层 不产生镜像层,只记录在镜像元数据中
数量 可以有任意多个 一个 Dockerfile 中只能有一个 CMD(最后一个生效)
能否被覆盖 无法被覆盖(已固化到镜像) 可以被 docker run 后面跟的命令覆盖,或被 ENTRYPOINT 影响
举例说明
bash 复制代码
FROM 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 成新镜像)。

验证"容器不等于镜像"
  1. 启动一个容器:docker run -it ubuntu bash

  2. 在里面创建一个文件:touch /tmp/test.txt

  3. 退出容器(exit),此时容器停止但还存在(docker ps -a 能看到)

  4. 再启动这个容器:docker start -ai <容器id>,会发现 /tmp/test.txt 还在 ------ 因为容器有自己的可写层

  5. 但如果从同一个镜像(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 :定时任务的调度信息。 - atat命令的单次任务队列。
/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.通过文档安装

怎么安装?需要准备哪些环境

docker官网

配置阿里云镜像加速

1.登录阿里云找到容器服务

Run的流程和Docker原理

镜像的基本命令:

容器的基本命令:

日志、元数据、进程的查看

进入容器的命令和拷贝命令

常用命令小结

作业一:部署Nginx

作业二:部署Tomcat

作业三:部署ES+Kibana

Portainer可视化面板安装

镜像原理之联合文件系统

镜像原理之分层理解

Commit镜像

相关推荐
辰海Coding1 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
RainCity2 小时前
Java Swing 自定义组件库分享(七)
java·笔记·后端
闫记康2 小时前
Linux学习day5
linux·chrome·学习
一楼的猫3 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作
東隅已逝,桑榆非晚3 小时前
字符函数和字符串函数
c语言·笔记
他们叫我阿冠3 小时前
实习前自我培训-Day1学习
学习
Upsy-Daisy3 小时前
AI Agent 项目学习笔记(七):RAG 高级扩展——过滤检索、PgVector 与云知识库
人工智能·笔记·学习
柿柿快乐4 小时前
Redis 入门第一课:全局命令、内部编码与单线程模型
redis·学习·缓存·基础教学
智者知已应修善业5 小时前
【51单片机LED闪烁10次数码管显示0-9】2023-12-14
c++·经验分享·笔记·算法·51单片机