docker读书笔记001

1、docker一个核心哲学通常被称为“含电池,但可拆卸”。

2、OCI是一个旨在对容器基础架构中的基础组件(如镜像格式与容器运行时,如果对这些概念不熟悉的话,不要担心,本书后续会介绍到它们)进行标准化的管理委员会。

3、ubuntu18.04上安装
1、更新apt
apt-get update
2、删除老版本的docker
apt-get remove docker docker-engine docker-ce docker.io -y
3、安装新版本Docker
wget -qO- https://get.docker.com/ | sh

4、每个Docker容器都有一个本地存储空间,用于保存层叠的镜像层(Image Layer)以及挂载的容器文件系统。默认情况下,容器的所有读写操作都发生在其镜像层上或挂载的文件系统中,在Linux上,Docker的存储驱动建议为Overlay2。存储驱动的选择是节点级别的。这意味着每个Docker主机只能选择一种存储驱动,而不能为每个容器选择不同的存储驱动。在Linux上,读者可以通过修改/etc/docker/daemon.json
 文件来修改存储引擎配置,修改完成之后需要重启Docker才能够生效。修改了正在运行Docker主机的存储引擎类型,则现有的镜像和容器在重启之后将不可用,需要重新下载镜像,配置并启动。
 
5、docker system info 命令可以查询下docker容器的存储引擎类型。

6、docker从运维角度看,分为Docker客户端和Docker daemon,daemon实现了Docker引擎的API,使用Linux默认安装时,客户端与daemon之间的通信是通过本地IPC/UNIX Socket完成的(/var/run/docker.sock
 ),使用docker version命令来检测客户端和服务端是否都已经成功运行,并且可以互相通信。
 
7、Docker镜像可以理解为一个包含了OS文件系统和应用的对象,虚拟机模板本质上是处于关机状态的虚拟机。在Docker主机上运行docker image ls命令可以进行镜像查询。在Docker主机上获取镜像的操作被称为拉取(pulling),Docker的每个镜像都有自己的唯一ID。用户可以通过引用镜像的ID
 或名称来使用镜像。如果用户选择使用镜像ID,通常只需要输入ID开头的几个字符即可——因为ID是唯一的,Docker知道用户想引用的具体镜像是哪个。

8、使用docker container run 命令从镜像来启动容器。例如:docker container run -it ubuntu:latest /bin/bash,-it
 参数告诉Docker开启容器的交互模式并将读者当前的Shell连接到容器终端。接下来,命令告诉Docker,用户想基于ubuntu:latest
 镜像启动容器。最后,命令告诉Docker,用户想要在容器内部运行哪个进程。对于Linux示例来说是运行Bash Shell。

9、按Ctrl-PQ组合键,可以在退出容器的同时还保持容器运行。这样Shell就会返回到Docker主机终端。可以通过查看Shell提示符来确认。

10、通过docker container ls命令查看系统内全部处于运行状态的容器。

11、执行docker container exec命令,可以将Shell连接到一个运行中的容器终端。示例:docker container exec -it 容器名称或者ID(十六进制ID) bash,将本地Shell连接到容器是通过-it
 参数实现的。

12、通过docker container stop和docker container rm命令来停止并杀死容器。通过运行docker container ls命令,并指定-a参数来确认容器已经被成功删除。添加-a的作用是让Docker列出所有容器,甚至包括那些处于停止状态的。

13、使用docker image build命令,根据Dockerfile中的指令来创建新的镜像。

14、Docker引擎由两个核心组件构成:LXC和Docker daemon。Docker daemon是单一的二进制文件,包含诸如Docker客户端、Docker API、容器运行时、镜像构建等。
LXC提供了对诸如命名空间(Namespace)和控制组(CGroup)等基础工具的操作能力,它们是基于Linux内核的容器虚拟化技术。

15、$ docker container run --name ctr1 -it alpine:latest sh
当使用Docker命令行工具执行如上命令时,Docker客户端会将其转换为合适的API格式,并发送到正确的API端点。
API是在daemon中实现的。这套功能丰富、基于版本的REST API已经成为Docker的标志,并且被行业接受成为事实上的容器API。
一旦daemon接收到创建新容器的命令,它就会向containerd发出调用。daemon已经不再包含任何创建容器的代码了!
daemon使用一种CRUD风格的API,通过gRPC与containerd进行通信。
虽然名叫containerd,但是它并不负责创建容器,而是指挥runc去做。containerd将Docker镜像转换为OCI bundle,并让runc基于此创建一个新的容器。
然后,runc与操作系统内核接口进行通信,基于所有必要的工具(Namespace、CGroup等)来创建容器。容器进程作为runc的子进程启动,启动完毕后,runc将会退出。
将所有的用于启动、管理容器的逻辑和代码从daemon中移除,意味着容器运行时与Docker daemon是解耦的,有时称之为“无守护进程的容器(daemonless container)”,如此,对Docker daemon的维护和升级工作不会影响到运行中的容器。


16、常见的镜像仓库服务是Docker Hub,但是也存在其他镜像仓库服务。拉取操作会将镜像下载到本地Docker主机,读者可以使用该镜像启动一个或者多个容器。
镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。

17、通常使用docker container run
 和docker service create
 命令从某个镜像启动一个或多个容器。一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。

18、Linux Docker主机本地镜像仓库通常位于/var/lib/docker/<storage-driver>,可以使用docker image ls命令检查Docker主机的本地仓库中是否包含镜像,执行命令docker image pull alpine:latest拉取最新的镜像

19、Docker镜像存储在镜像仓库服务(Image Registry)当中。Docker客户端的镜像仓库服务是可配置的,默认使用Docker Hub。

20、只需要给出镜像的名字和标签,就能在官方仓库中定位一个镜像(采用“:”分隔),从官方仓库拉取镜像时,docker image pull
 命令的格式如下。docker image pull <repository>:<tag>

21、Docker提供--filter参数来过滤docker image ls命令返回的镜像列表内容,docker image ls --filter dangling=true,执行该命令只会返回悬虚(dangling)镜像,过滤参数:
dangling
 :可以指定true
 或者false
 ,仅返回悬虚镜像(true),或者非悬虚镜像(false)。
before
 :需要镜像名称或者ID作为参数,返回在之前被创建的全部镜像。
since
 :与before
 类似,不过返回的是指定镜像之后创建的全部镜像。
label
 :根据标注(label)的名称或者值,对镜像进行过滤。docker image ls
 命令输出中不显示标注内容。
其他的过滤方式可以使用reference
可以使用--format参数来通过Go模板对输出内容进行格式化。

22、docker search命令允许通过CLI的方式搜索Docker Hub,以使用--filter "is-official=true",使命令返回内容只显示官方镜像。默认情况下,Docker只返回25行结果。但是,读者可以指定--limit
 参数来增加返回内容行数,最多为100行。

23、docker镜像由一些松耦合的只读镜像层组成,Docker负责堆叠这些镜像层,并且将它们表示为单个统一的对象。通过docker image pull ubuntu:latest命令打印的输出可以看到docker的镜像层,执行docker image inspect命令也可以查询到:docker image inspect ubuntu:latest

24、docker history
 命令显示了镜像的构建历史记录,但其并不是严格意义上的镜像分层。例如,有些Dockerfile中的指令并不会创建新的镜像层。比如ENV、EXPOSE、CMD以及ENTRY- POINT。不过,这些命令会在镜像中添加元数据。
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。

25、docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。Docker在Linux上支持很多存储引擎(Snapshotter)。每个存储引擎都有自己的镜像分层、镜像层共享以及写时复制(CoW)技术的具体实现。但是,其最终效果和用户体验是完全一致的。

26、docker image ls命令之后添加--digests参数即可在本地查看镜像摘要。可以根据每个镜像有一个基于其内容的密码散列值来精准的拉取镜像:docker image pull alpine@sha256:c0537...7c0a7726c88e2bb7584dc96

27、镜像本身就是一个配置对象,其中包含了镜像层的列表以及一些元数据信息。
镜像层才是实际数据存储的地方(比如文件等,镜像层之间是完全独立的,并没有从属于某个镜像集合的概念)。
镜像的唯一标识是一个加密ID,即配置对象本身的散列值。每个镜像层也由一个加密ID区分,其值为镜像层本身内容的散列值。
这意味着修改镜像的内容或其中任意的镜像层,都会导致加密散列值的变化。所以,镜像和其镜像层都是不可变的,任何改动都能很轻松地被辨别。

28、镜像仓库服务API支持两种重要的结构:Manifest列表(新)和Manifest。
Manifest列表是指某个镜像标签支持的架构列表。

29、通过docker image rm
 命令从Docker主机删除该镜像。其中,rm
 是remove的缩写。
删除操作会在当前主机上删除该镜像以及相关的镜像层。这意味着无法通过docker image ls
 命令看到删除后的镜像,并且对应的包含镜像层数据的目录会被删除。但是,如果某个镜像层被多个镜像共享,那只有当全部依赖该镜像层的镜像都被删除后,该镜像层才会被删除。

30、删除某Docker主机上全部镜像的快捷方式是在docker image rm命令中传入当前系统的全部镜像ID,可以通过docker image ls
 获取全部镜像ID(使用-q参数)
 
31、命令回顾:
docker image pull
 是下载镜像的命令。镜像从远程镜像仓库服务的仓库中下载。默认情况下,镜像会从Docker Hub的仓库中拉取。docker image pull alpine:latest
 命令会从Docker Hub的alpine
 仓库中拉取标签为latest
 的镜像。
docker image ls
 列出了本地Docker主机上存储的镜像。可以通过--digests
 参数来查看镜像的SHA256签名。
docker image inspect
 命令非常有用!该命令完美展示了镜像的细节,包括镜像层数据和元数据。
docker image rm
 用于删除镜像。docker image rm alpine:latest
 命令的含义是删除alpine:latest
 镜像。当镜像存在关联的容器,并且容器处于运行(Up)或者停止(Exited)状态时,不允许删除该镜像。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值