一、linux 命令常用
| 参数 | 核心含义 | 常见用法示例 |
|---|---|---|
| -p | 层级 / 端口 | mkdir -p (递归创建), docker run -p (映射端口) |
| -f | 强制 / 跟踪 | rm -f (强制删除), tail -f / docker logs -f (持续看日志) |
| -r / -R | 递归 | rm -r (删文件夹), chmod -R (改目录下所有权限) |
| -v | 挂载 / 详细 | docker run -v (挂数据卷), rm -v (显示删除过程) |
| -it | 交互 | docker exec -it (进入容器操作) |
| -a | 全部 | ls -a (看隐藏文件), docker ps -a (看所有容器) |
| -d | 后台 | docker run -d (容器后台运行) |
| -h | 易读 | du -sh (显示文件夹占了多少 MB/GB) |
二、start(初始)
| 命令 | 说明 |
|---|---|
| docker -v | 验证安装 / 查看版本 |
| docker info | 查看详细配置(重点看镜像加速器是否生效) |
| systemctl start docker | 启动 Docker 服务 |
| systemctl stop docker | 停止 Docker 服务 |
| systemctl restart docker | 重启 Docker 服务(修改配置后必须执行) |
| systemctl enable docker | 设置 Docker 开机自启 |
| systemctl status docker | 查看服务运行状态(报错时排查原因) |
| vi /etc/docker/daemon.json | 修改核心配置文件(如镜像加速器地址) |
| systemctl daemon-reload | 重载系统守护进程配置 |
三、镜像操作 (Image):
| 命令 | 说明 |
|---|---|
| docker images | 查看本地已下载的所有镜像 |
| docker pull [name] | 从远程仓库拉取镜像到本地 |
| docker build -t [name] . | 根据 Dockerfile 构建自己的镜像 |
| docker rmi [imageID] | 删除指定的本地镜像 |
| docker tag [old] [new] | 给镜像打标签或重命名 |
| docker search [name] | 在 Docker Hub 上搜索镜像 |
四、容器操作 (Container):
| 命令 | 说明 |
|---|---|
| docker ps | 查看正在运行的容器 |
| docker ps -a | 查看所有容器(包括已停止的) |
| docker top [ID] | 查看容器内部正在运行的进程 |
| docker run -it [ID] /bin/bash | 创建并交互式进入新容器 |
| exit | 退出并停止当前容器 |
| Ctrl + P + Q | 退出容器保持后台运行 (脱离) |
| docker start [ID] | 启动已停止的容器 |
| docker stop [ID] | 停止运行中的容器 |
| docker restart [ID] | 重启容器 |
| docker kill [ID] | 强制杀死容器进程(类似拔电源) |
| docker rm [ID] | 删除已停止的容器 |
| docker rm -f $(docker ps -aq) | 强制删除所有容器(慎用) |
| docker inspect [ID] | 查看容器详细信息(查 IP、挂载等) |
| docker exec -it [ID] /bin/bash | 进入运行中的容器(开启新窗口,推荐) |
| docker logs -f [ID] | 实时查看容器日志(排错最常用) |
| docker cp [src] [dest] | 在容器和宿主机之间互传文件 |
| docker stats | 查看容器对 CPU、内存等资源的占用情况 |
为什么虚拟机是分钟级启动而docker是秒级启动
底层逻辑:
| 步骤 | 虚拟机 | docker |
|---|---|---|
| 硬件初始化 | 需要模拟 CPU、内存、网卡等,并运行 BIOS/UEFI 进行自检。 | 跳过:直接使用宿主机的物理硬件。 |
| 引导程序 | 寻找并加载 Guest OS 的内核 | 跳过:内核已经加载在宿主机中 |
| 内核启动 | Guest OS 内核解压、初始化各种驱动程序 | 跳过:直接调用宿主机内核中的系统调用 |
| 系统初始 | 启动几十个甚至上百个系统服务(网络、日志、计划任务等) | 跳过:不启动无关的系统服务 |
| 应用运行 | 启动你的应用程序 | 直接启动你的应用程序 |
虚拟机:每个虚拟机都带有一个完整的独立内核。启动时,内核要从零开始初始化内存管理、进程调度、文件系统驱动等。这就像你想喝一杯咖啡,却要先种一棵咖啡树并盖一个咖啡工厂。
Docker:所有容器共享宿主机的内核。启动容器时,宿主机内核只是利用 Linux 的 Namespace(命名空间)和 Cgroups(控制组)给进程画个“圈”,告诉它:“你只能看到这部分资源”。这个过程本质上是创建一个新进程,在 Linux 中这只需要毫秒。
为什么Dokcer镜像比虚拟机包更小?
基于底层逻辑的原因,只需要宿主机的内核。
联合文件系统Unionfiles:
类似于react中的状态管理,减少回流重绘的操作,修枝不修干,修改旧文件实际上是添加了部分叶子。
分层结构(Layered Structure):
实际上镜像是由多层文件来“包装”出来的,镜像变成容器的过程是在最外层再次包装一层,将镜像变成运行状态,为了实现镜像可以多次利用,镜像文件是只读,用户操作容器更改底层的配置时,其实没有修改底层文件,而是实现 了逻辑覆盖。
- 容器在运行的时候,用户无法删除镜像文件,因为容器是依靠底层的镜像文件来运行。
- 镜像文件会更加安全,黑客修改容器无法影响到镜像文件。
- 快速重置,删除容器重新开启一个容器,容器依旧是之前干净的容器。
- 数据无法保留,但是有数据卷来解决这个问题。
数据卷技术: 开发体验上类似于react的双向绑定,但是两个技术其实是完全不同的。
react: 需要通过onChange来实现这个过程,UI展示不存储数据,将数据保存在State,再由State来修改UI。
实际上是单向的数据流,是一个发布订阅的响应式过程。
volumes/bind Mounts: 数据不存储在容器中,而是存储在外部的宿主机的文件目录下,容器内的数据是一份映射的数据(类似一个快捷链接),因此容器和宿主的文件是同一份的物理硬盘空间,容器和宿主默认情况下对这份数据的权限是相等的。