Skip to content

Docker底层原理和常用命令

前言 :)

友情提示 本文学习需要了解一些Linux简单命令

一、Docker底层原理

1、Docker是怎么工作的?

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker的守护进程运行在宿主机上,通过Socket从客户端访问!DockerServer 接收到 Docker-Client 的指令,就会执行这个命令。

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

容器的实质是进程,与宿主机上的其他进程是共用一个内核,但与直接在宿主机执行的进程不同,容器进程运行在属于自己的独立的命名空间。命名空间隔离了进程间的资源,使得 a,b 进程可以看到 S 资源,而 c 进程看不到。

2、Docker为什么比VM快?

  1. Docker有着比虚拟机更少的抽象层。 1)虚拟机是硬件层抽象,虚拟硬件和操作系统。 2)Docker是应用层抽象,只虚拟化操作系统 。

  2. Docker是基于宿主机的内核,VM是基于虚拟机虚拟化后的内核。 1)当新建一个容器时,docker不需要像虚拟机需要加载一个操作系统内核。然而避免引寻、加载操作系统内核是比较费时费资源的过程。 2)当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返回一个新建过程至少是分钟级别的。 3)docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。

  3. Docker相比虚拟机更加轻量级和便携。

特性Docker容器虚拟机(VM)
操作系统与宿主机共享OS宿主机OS上运行虚拟机OS
存储大小镜像小,便于存储和传输镜像庞大(vmdk\vdi)等
运行性能几乎无额外性能损失操作系统额外的CPU、内存消耗
移植性轻便、灵活,适应于Linux笨重,与虚拟化技术耦合度高
硬件亲和性面向软件开发者面向硬件运维者
部署速度快速,秒级较慢,10s以上

3、Docker 所使用的底层技术

学习一下大佬的文章:docker底层原理解析

二、Docker常用命令

帮助文档地址:https://docs.docker.com/reference/

1、基础命令

1) docker 命令 —help

  • 作用:查看命令的帮助文档
  • 格式:
Terminal window
docker 命令 --help
  • 例子:

2)docker version

  • 作用:显示Docker的版本信息。
  • 格式:
Terminal window
docker version [OPTIONS]
  • 可选项:
名称,简写默认解释
—format,-f使用给定的 Go 模板格式化输出
  • 例子:

3)docker info

  • 作用:显示docker的系统信息,显示的信息包括内核版本、容器数量和映像。
  • 格式:
Terminal window
docker info [OPTIONS]
  • 可选项:
名称,简写默认解释
—format,-f使用给定的 Go 模板格式化输出
  • 例子:

2、镜像命令

1)docker images

  • 作用:显示所有镜像、它们的存储库和标签以及它们的大小。
  • 格式:
Terminal window
docker images [OPTIONS] [REPOSITORY[:TAG]]
  • 可选项:
名称,简写默认解释
—all,-a显示所有镜像(默认隐藏中间镜像)
—filter,-f根据提供的条件过滤输出
—format使用 Go 模板格式化打印镜像
—quiet,-q仅显示图像 ID
  • [REPOSITORY[:TAG]]参数

该docker images命令采用一个可选[REPOSITORY[:TAG]]参数,将列表限制为与参数匹配的镜像。如果您指定 REPOSITORY但 no TAG,该docker images命令会列出给定存储库中的所有镜像。

  • 例子:

名词解释
REPOSITORY镜像的仓库源
TAG镜像的标签
IMAGE ID镜像的id
CREATED镜像的创建时间
SIZE镜像的大小
  • 作用:在Docker Hub上搜索镜像
  • 格式:
Terminal window
docker search [OPTIONS] 镜像名
  • 可选项:
名称,简写默认解释
—filter,-f根据提供的条件过滤输出
—format使用 Go 模板格式化打印搜索
—limit25最大搜索结果数
  • 例子:

—filter filter 通过搜索来过滤,例如—filter=STARS=300表示搜索出来的镜像STARS大于300的

3)docker pull

  • 作用:从Docker Hub上拉取镜像, 如果没有提供标签,Docker 引擎将使用该:latest标签作为默认值。此命令提取debian:latest镜像。
  • 格式:
Terminal window
docker pull [OPTIONS] 镜像名[:tag|@DIGEST]
  • 可选项:
名称,简写默认解释
—all-tags,-a下载存储库中的所有标记镜像
—disable-content-trusttrue跳过镜像验证
—platform如果服务器支持多平台,则设置平台
—quiet,-q抑制详细输出
  • 例子:

注意:Docker 镜像可以由多个层组成。图层可以被镜像重用,例如,debian:jessie图像与debian:latest.拉取debian:jessie镜像只会拉取其元数据,而不是其层,因为所有层都已在本地存在。

Docker 使用内容可寻址的镜像存储,镜像 ID 是涵盖镜像配置和层的 SHA256 摘要。在上面的示例中, debian:jessie并且debian:latest具有相同的图像 ID,因为它们实际上是用不同名称标记的相同图像。因为它们是同一个镜像,所以它们的层只存储一次,不会消耗额外的磁盘空间。

4)docker rmi

  • 作用:删除一个或多个镜像
  • 格式:
Terminal window
docker rmi [OPTIONS] 镜像id [镜像id...]
  • 可选项:
名称,简写默认解释
—force,-f强制删除镜像
  • 例子:

删除所有镜像:

Terminal window
docker rmi -f $(docker images -aq)

3、容器命令

注意:必须存在镜像才能运行容器

我们这里使用centos作为例子来理解容器命令,需要先拉取centos的镜像

Terminal window
docker pull centos

1)docker run

  • 作用:创建一个新的容器并运行一个镜像

  • Docker的流程图:

  • 格式:

Terminal window
docker run [OPTIONS] 镜像id [COMMAND] [ARG...]
  • 可选项
名称,简写默认参数说明
—name为容器分配名称,用来区分容器
—detach,-d在后台运行容器并打印容器 ID
-it使用交互式运行,进入容器查看内容
-p-p xxxx:yyyy:宿主机上xxxx端口对应容器中yyyy端口,在外部访问时用的是宿主机上的端口
-P(大写)随机指定端口
  • 例子:

启动并进入容器

Terminal window
docker run -it centos bin/bash

注意: 如果出现这个错误,请用管理员权限执行即可。

2)docker ps

  • 作用:查看所有的容器
  • 格式:
Terminal window
docker ps [OPTIONS]
  • 可选项:
名称,简写默认参数说明
—all,-a显示所有容器(默认显示刚刚运行)
—last,-n-1显示 n 个最后创建的容器(包括所有状态)
—quiet,-q仅显示容器 ID
  • 例子:

3)exit | Ctrl + P + Q

  • 作用:退出容器
  • 格式:
  1. exit 直接停止容器并退出
  2. Ctrl + P + Q 容器不停止退出

4)docker rm

  • 作用:删除一个或多个容器,不能删除正在运行的容器,除非用-f强制删除
  • 格式:
Terminal window
docker rm [OPTIONS] 容器id [容器id...]
  • 可选项:
名称,简写默认参数说明
—force,-f强制删除正在运行的容器(使用 SIGKILL)
—link,-l删除指定链接
—volumes,-v删除与容器关联的匿名卷
  • 例子:

删除所有容器:

Terminal window
docker rm -f $(docker ps -aq)
docker ps -a -q|xargs docker rm

强制删除容器:

Terminal window
docker rm -f 容器id

5)docker start | restart | stop | kill

  • 作用:启动 | 重启 | 停止 | 杀死 容器的操作
  • 格式:
  1. docker start 启动容器
Terminal window
docker start 容器id
  1. docker restart 重启容器
Terminal window
docker restart 容器id
  1. docker stop 停止容器
Terminal window
docker stop 容器id
  1. docker kill 杀死容器
Terminal window
docker kill 容器id

4、常用的其他命令

1) docker run -d

  • 作用:后台启动容器
  • 格式:
Terminal window
docker run -d 镜像名
  • 例子:

注意:docker 容器后台运行的时候,必须要有一个前台进程运行,如果docker发现没有应用,就会自动停止容器。

2)docker logs

  • 作用:获取容器的日志
  • 格式:
Terminal window
docker logs [OPTIONS] CONTAINER
  • 可选项:
名称,简写默认解释
—details显示提供给日志的额外详细信息
—follow,-f关注日志输出
—since显示自时间戳(例如 2013-01-02T13:23:37Z)或相对时间(例如 42m 42 分钟)以来的日志
—tail,-nall从日志末尾显示的行数
—timestamps,-t显示时间戳
—until在时间戳(例如 2022-08-24T17:57:37Z)或相对时间(e.g. 42m for 42 minutes)之前显示日志
  • 例子:

自己先编写一段shell脚本,以便容器可以有进程运行,不会自动停止:

Terminal window
docker run -d centos /bin/bash -c "while true;do echo linzy;sleep 1;done"

shell脚本:一直循环,每秒输出一条日志信息linzy

3)docker top

  • 作用:显示容器的运行进程,查看容器中的进程信息。
  • 格式:
Terminal window
docker top 容器id
  • 例子:

4)docker inspect

  • 作用:查看镜像或容器的元数据
  • 格式:
Terminal window
docker inspect [OPTIONS] 镜像id|镜像名 [镜像id|镜像名...]
  • 可选项:
名称,简写默认解释
—format,-f使用给定的 Go 模板格式化输出
—size,-s如果类型是容器,则显示总文件大小
—type返回指定类型的 JSON
  • 例子:

5)docker exec -it

  • 作用:进入正在运行的容器中,打开新的终端并运行新的命令
  • 格式:
Terminal window
docker exec -it 容器id baseShell
  • 例子:

6)docker attach

  • 作用: 进入正在运行的容器中
  • 格式:
Terminal window
docker attach 容器id
  • 例子:

三、小结

命令作用
attach当前 shell 下 attach 连接指定运行镜像
build通过 Dockerfile 定制镜像
commit提交当前容器为新的镜像
cp从容器中拷贝指定文件或者目录到宿主机中
create创建一个新的容器,同 run 但不启动容器
diff查看 docker 容器变化
events从 docker 服务获取容器实时事件
exec在已存在的容器上运行命令
export导出容器的内容流作为一个 tar 归档文件[对应 import]
history展示一个镜像形成历史
images列出系统当前的镜像
import从 tar 包中的内容创建一个新的文件系统映像[对应 export]
info显示系统相关信息
inspect查看容器或镜像的详细信息
kill杀死指定 docker 容器
load从一个 tar 包中加载一个镜像[对应 save]
login注册或登录一个docker hub
logout从当前 docker history 退出
logs输出当前容器日志信息
port查看映射端口对应的容器内部源端口
pause暂停容器
ps列出容器列表
pull从docker hub拉取镜像
push推送指定镜像或库镜像到docker hub
restart重启运行容器
rm移除一个或多个容器
rmi移除一个或多个镜像[无容器使用该镜像才能删除,否则要删除相关容器或者 -f 强制删除]
run创建一个新的容器并运行一个命令
save保存一个镜像为 tar 包[对应 load]
search在docker hub 中搜索镜像
start启动容器
stop停止容器
tag给源中镜像打标签
top查看容器中运行的进程信息
unpause取消暂停容器
version查看容器版本号
wait截取容器停止时的退出状态值