docker 命令笔记

10 阅读5分钟

一、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 Docs

命令说明
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: 数据不存储在容器中,而是存储在外部的宿主机的文件目录下,容器内的数据是一份映射的数据(类似一个快捷链接),因此容器和宿主的文件是同一份的物理硬盘空间,容器和宿主默认情况下对这份数据的权限是相等的。