Docker(二)入门:Docker底层原理和常用命令

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 该docker images命令采用一个可选[REPOSITORY[:TAG]]参数,将列表限制为与参数匹配的镜像。如果您指定 REPOSITORY但 no TAG,该docker images命令会列出给定存储库中的所有镜像。

前言 😃


友情提示

本文学习需要了解一些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 进程看不到。


731eb2f8c12941be91bd5b13a7259e8a.png


2、Docker为什么比VM快?


1.Docker有着比虚拟机更少的抽象层。

1)虚拟机是硬件层抽象,虚拟硬件和操作系统。

2)Docker是应用层抽象,只虚拟化操作系统 。


2.Docker是基于宿主机的内核,VM是基于虚拟机虚拟化后的内核。

1)当新建一个容器时,docker不需要像虚拟机需要加载一个操作系统内核。然而避免引寻、加载操作系统内核是比较费时费资源的过程。

2)当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返回一个新建过程至少是分钟级别的。

3)docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。


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


8fcef399dd6c40ee9e1c8e09aa478292.png


特性 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


  • 例子:


d673ddc7adfb46c2a6dfb442e55c5895.png


2)docker version


  • 作用:显示Docker的版本信息。
  • 格式:


docker version [OPTIONS]


  • 可选项:


名称,简写 默认 解释
–format,-f 使用给定的 Go 模板格式化输出


  • 例子:


0a760eea7d9e4f26a7cc2ba960a764f1.png


3)docker info


  • 作用:显示docker的系统信息,显示的信息包括内核版本、容器数量和映像。
  • 格式:


docker info [OPTIONS]


  • 可选项:


名称,简写 默认 解释
–format,-f 使用给定的 Go 模板格式化输出


  • 例子:


427bf88c347c44ab8fd9479d1c7cedaa.png


2、镜像命令


1)docker images


  • 作用:显示所有镜像、它们的存储库和标签以及它们的大小。
  • 格式:


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命令会列出给定存储库中的所有镜像。


7cd6cf027e1d469989faad033c129a67.png


  • 例子:


2994549f04f64e528a210f5a9a898145.png

名词 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小


2)docker search


  • 作用:在Docker Hub上搜索镜像
  • 格式:


docker search [OPTIONS] 镜像名


  • 可选项:


名称,简写 默认 解释
–filter,-f 根据提供的条件过滤输出
–format 使用 Go 模板格式化打印搜索
–limit 25 最大搜索结果数


  • 例子:


e8ccb886f9614707abd88b8df4c38d37.png


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


5ad1eeae477e48769a062c34fdeb59da.png


3)docker pull


  • 作用:从Docker Hub上拉取镜像, 如果没有提供标签,Docker 引擎将使用该:latest标签作为默认值。此命令提取debian:latest镜像。


  • 格式:


docker pull [OPTIONS] 镜像名[:tag|@DIGEST]


  • 可选项:


名称,简写 默认 解释
–all-tags,-a 下载存储库中的所有标记镜像
–disable-content-trust true 跳过镜像验证
–platform 如果服务器支持多平台,则设置平台
–quiet,-q 抑制详细输出


  • 例子:


887968eb694947faacb3b712d65b6b34.png

e0bb95fc63884c71abb776330228a5ff.png


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


27cb3d416b8d4eef87754ef5c21317de.png


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


4)docker rmi


  • 作用:删除一个或多个镜像
  • 格式:


docker rmi [OPTIONS] 镜像id [镜像id...]


  • 可选项:


名称,简写 默认 解释
–force,-f 强制删除镜像


  • 例子:


171417e0254f42a882998b29c5cd07b7.png

996f5a4c214e40dc8d2656b0c589cf90.png


删除所有镜像:


docker rmi -f $(docker images -aq)


3、容器命令


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


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


docker pull centos


1)docker run


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


  • Docker的流程图:


7a4b846b387e4f41b3da2bcdc2a4abd0.png


  • 格式:


docker run [OPTIONS] 镜像id [COMMAND] [ARG...]


  • 可选项


名称,简写 默认 参数说明
–name 为容器分配名称,用来区分容器
–detach,-d 在后台运行容器并打印容器 ID
-it 使用交互式运行,进入容器查看内容
-p -p xxxx:yyyy:宿主机上xxxx端口对应容器中yyyy端口,在外部访问时用的是宿主机上的端口
-P(大写) 随机指定端口


  • 例子:


启动并进入容器


docker run -it centos bin/bash

a89b6015156741a2a474188387619bb0.png


注意:


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


c05f6f912c784feb90c59164ea12f7b5.png


2)docker ps


  • 作用:查看所有的容器
  • 格式:


docker ps [OPTIONS]


  • 可选项:


名称,简写 默认 参数说明
–all,-a 显示所有容器(默认显示刚刚运行)
–last,-n -1 显示 n 个最后创建的容器(包括所有状态)
–quiet,-q 仅显示容器 ID


  • 例子:


e77a99f993c74d46b34371da1249fdf4.png


3)exit | Ctrl + P + Q


  • 作用:退出容器
  • 格式:


1.exit 直接停止容器并退出


9658b347689b4c28928facbfdcb1f93a.png


2.Ctrl + P + Q 容器不停止退出


536ce9ca403541a4a4b37792ce27d555.png


4)docker rm


  • 作用:删除一个或多个容器,不能删除正在运行的容器,除非用-f强制删除
  • 格式:


docker rm [OPTIONS] 容器id [容器id...] 


  • 可选项:


名称,简写 默认 参数说明
–force,-f 强制删除正在运行的容器(使用 SIGKILL)
–link,-l 删除指定链接
–volumes,-v 删除与容器关联的匿名卷


  • 例子:


0c21253c76fb4d60bfea66c15869a366.png


删除所有容器:


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


强制删除容器:

docker rm -f 容器id

d28f79f45dbe45eb8ab04918fea34b07.png


5)docker start | restart | stop | kill


  • 作用:启动 | 重启 | 停止 | 杀死 容器的操作
  • 格式:


1.docker start 启动容器


docker start 容器id


2.docker restart 重启容器


docker restart 容器id


3.docker stop 停止容器


docker stop 容器id


4.docker kill 杀死容器


docker kill 容器id


4、常用的其他命令


1) docker run -d


  • 作用:后台启动容器
  • 格式:


docker run -d 镜像名


  • 例子:


71f3d980797048c6a5446e1e9f04a020.png


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


2)docker logs


  • 作用:获取容器的日志
  • 格式:


docker logs [OPTIONS] CONTAINER


  • 可选项:


名称,简写 默认 解释
–details 显示提供给日志的额外详细信息
–follow,-f 关注日志输出
–since 显示自时间戳(例如 2013-01-02T13:23:37Z)或相对时间(例如 42m 42 分钟)以来的日志
–tail,-n all 从日志末尾显示的行数
–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"


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


988b952df806497395f33bd41add29a6.png


3)docker top


  • 作用:显示容器的运行进程,查看容器中的进程信息。
  • 格式:


docker top 容器id


  • 例子:


38703eccb76045d4b8726e2128aace45.png


4)docker inspect


  • 作用:查看镜像或容器的元数据
  • 格式:


docker inspect [OPTIONS] 镜像id|镜像名 [镜像id|镜像名...]


  • 可选项:


名称,简写 默认 解释
–format,-f 使用给定的 Go 模板格式化输出
–size,-s 如果类型是容器,则显示总文件大小
–type 返回指定类型的 JSON


  • 例子:


d1c1882815564319ad627b7895788dc7.png

b5911f26c0214ebfa84aff21161ea71b.png


5)docker exec -it


  • 作用:进入正在运行的容器中,打开新的终端并运行新的命令
  • 格式:


docker exec -it 容器id baseShell


  • 例子:


103f296b89184351965ad51b10791211.png


6)docker attach


  • 作用: 进入正在运行的容器中
  • 格式:


docker attach 容器id


  • 例子:


50488bf216ae4519ac8c3211f908f8a7.png


三、小结


867dae8fdd7546e3b996140b2ea767c1.png


命令 作用
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 截取容器停止时的退出状态值
目录
相关文章
|
16天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
56 2
|
2月前
|
安全 Docker 容器
|
2月前
|
网络安全 数据安全/隐私保护 Docker
|
10天前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
存储 监控 安全
|
18天前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
23天前
|
运维 持续交付 虚拟化
docker入门详解!!!
本文介绍了容器技术的发展历程,从物理机到虚拟化再到容器化,重点讲解了Docker的诞生及其优势。Docker通过轻量级的容器技术,实现了资源的高效利用、快速启动、环境一致性、持续交付和部署等优点。文章还详细解析了Docker的架构和工作原理,包括Docker Daemon、REST接口、Docker Client等组件,以及容器与虚拟机的差异。
59 2
|
1月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
44 3
|
2月前
|
存储 关系型数据库 MySQL
|
2月前
|
Ubuntu Shell 开发者
Docker入门:轻松开始容器化之旅
【10月更文挑战第17天】Docker 是一种开源的应用容器引擎,它让开发者能够“一次构建、到处运行”。Docker 通过容器化技术将应用程序及其依赖打包在一起,从而确保应用在任何环境中都能一致地运行。本文将为新手用户提供一个全面的Docker入门指南,包括基本概念、优势、安装配置以及如何创建和管理容器。
49 2