• Docker学习-Docker底层原理和常用命令


    前言 😃

    友情提示
    本文学习需要了解一些Linux简单命令
    个人博客:https://linzyblog.netlify.app/

    一、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是用Go编程语言编写的,并利用了Linux内核的几个特性来实现其功能。Docker使用一种名为 namespaces 的技术来提供名为容器的隔离工作空间。当你运行一个容器时,Docker会为该容器创建一组命名空间。

    这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,其访问仅限于该名称空间。

    学习一下大佬的文章:https://blog.csdn.net/Tencent_TEG/article/details/109505143?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166122025416782391822038%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166122025416782391822038&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~pc_rank_34-4-109505143-null-null.142v42pc_rank_34,185v2control&utm_term=docker%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187

    二、Docker常用命令

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

    1、基础命令

    1) docker 命令 --help

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

    在这里插入图片描述

    2)docker version

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

    在这里插入图片描述

    3)docker info

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

    在这里插入图片描述

    2、镜像命令

    1)docker images

    • 作用:显示所有镜像、它们的存储库和标签以及它们的大小。
    • 格式:
    docker images [OPTIONS] [REPOSITORY[:TAG]]
    
    • 1
    • 可选项:
    名称,简写默认解释
    –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镜像的大小

    2)docker search

    • 作用:在Docker Hub上搜索镜像
    • 格式:
    docker search [OPTIONS] 镜像名
    
    • 1
    • 可选项:
    名称,简写默认解释
    –filter,-f根据提供的条件过滤输出
    –format使用 Go 模板格式化打印搜索
    –limit25最大搜索结果数
    • 例子:

    在这里插入图片描述

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

    在这里插入图片描述

    3)docker pull

    • 作用:从Docker Hub上拉取镜像, 如果没有提供标签,Docker 引擎将使用该:latest标签作为默认值。此命令提取debian:latest镜像。
    • 格式:
    docker pull [OPTIONS] 镜像名[:tag|@DIGEST]
    
    • 1
    • 可选项:
    名称,简写默认解释
    –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

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

    在这里插入图片描述
    在这里插入图片描述
    删除所有镜像:

    docker rmi -f $(docker images -aq)
    
    • 1

    3、容器命令

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

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

    docker pull centos
    
    • 1

    1)docker run

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

    • Docker的流程图:
      在这里插入图片描述

    • 格式:

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

    启动并进入容器

    docker run -it centos bin/bash
    
    • 1

    在这里插入图片描述

    注意:
    如果出现这个错误,请用管理员权限执行即可。
    在这里插入图片描述

    2)docker ps

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

    在这里插入图片描述

    3)exit | Ctrl + P + Q

    • 作用:退出容器
    • 格式:
    1. exit 直接停止容器并退出
      在这里插入图片描述
    2. Ctrl + P + Q 容器不停止退出
      在这里插入图片描述

    4)docker rm

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

    在这里插入图片描述

    删除所有容器:

    docker rm -f $(docker ps -aq)
    docker ps -a -q|xargs docker rm
    
    • 1
    • 2

    强制删除容器:

    docker rm -f 容器id
    
    • 1

    在这里插入图片描述

    5)docker start | restart | stop | kill

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

    4、常用的其他命令

    1) docker run -d

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

    在这里插入图片描述

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

    2)docker logs

    • 作用:获取容器的日志
    • 格式:
    docker logs [OPTIONS] CONTAINER
    
    • 1
    • 可选项:
    名称,简写默认解释
    –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脚本,以便容器可以有进程运行,不会自动停止:

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

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

    在这里插入图片描述

    3)docker top

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

    在这里插入图片描述

    4)docker inspect

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

    在这里插入图片描述
    在这里插入图片描述

    5)docker exec -it

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

    在这里插入图片描述

    6)docker attach

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

    在这里插入图片描述

    三、小结

    在这里插入图片描述

    命令作用
    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截取容器停止时的退出状态值
  • 相关阅读:
    IDEA中添加servlet模板
    ES 查询时提示:all shards failed [type=search_phase_execution_exception]
    Day28|Leetcode 93. 复原 IP 地址 Leetcode 78. 子集 Leetcode 90. 子集 II
    防错与自働化的结合|优思学院・精益管理学会|CLMP
    目标检测 YOLOv5 - Rockchip rknn模型的测试 包括精度,召回率,mAP等详细信息
    我的创作纪念日
    unique()函数
    NPDP在国内的含金量
    HTML元素大全(2)-表单
    游戏中交通工具的设计
  • 原文地址:https://blog.csdn.net/weixin_46618592/article/details/126473595