元数据

[!abstract] 每天5分钟玩转Docker容器技术

  •  每天5分钟玩转Docker容器技术|200
  • 书名: 每天5分钟玩转Docker容器技术
  • 作者: CloudMan
  • 简介: Docker和容器技术是当下最火的IT技术,无论是互联网还是传统企业都在研究和实践如何用容器构建自己的 IT 基础设施。学习本书能够让读者少走弯路,系统地学习、掌握和实践 Docker 和容器技术。 本书共分为三部分。第一部分介绍容器技术生态环境。第二部分是容器核心知识,包括架构、镜像、容器、网络和存储。第三部分是容器进阶知识,包括多主机管理、跨主机网络方案、监控、日志管理和数据管理。读者在学习的过程中,可以跟着教程进行操作,在实践中掌握 Docker 容器技术的核心技能。在之后的工作中,可以将本教程作为参考书,按需查找相关知识点。 本书主要面向微服务软件开发人员,以及 IT 实施和运维工程师等相关人员,也适合高等院校和培训学校相关专业的师生教学参考。
  • 出版时间 2017-09-01 00:00:00
  • ISBN: 9787302479703
  • 分类: 计算机-计算机综合
  • 出版社: 清华大学出版社

高亮划线

第1章 鸟瞰容器生态系统

  • 📌 Docker、CoreOS、Google在内的若干公司共同成立了一个叫Open Container Initiative(OCI)的组织,其目的是制定开放的容器规范。 ^26943492-5-1556-1639

    • ⏱ 2023-06-12 12:45:22
  • 📌 OCI发布了两个规范:runtime spec和image format spec。 ^26943492-5-1670-1712

    • ⏱ 2023-06-12 12:45:40
  • 📌 容器是通过image创建的,需要有一个仓库来统一存放image,这个仓库就叫做Registry。 ^26943492-5-4150-4198

    • ⏱ 2023-06-12 12:48:35
  • 📌 基于容器的应用一般会采用微服务架构。在这种架构下,应用被划分为不同的组件,并以服务的形式运行在各自的容器中,通过API对外提供服务。为了保证应用的高可用,每个组件都可能会运行多个相同的容器。这些容器会组成集群,集群中的容器会根据业务需要被动态地创建、迁移和销毁。 ^26943492-5-5811-5942

    • ⏱ 2023-06-12 23:10:21
  • 📌 所谓编排(orchestration),通常包括容器管理、调度、集群定义和服务发现等。 ^26943492-5-6093-6136

    • ⏱ 2023-06-12 23:11:25
  • 📌 服务发现会保存容器集群中所有微服务最新的信息,比如IP和端口,并对外提供API,提供服务查询功能。 ^26943492-5-8701-8750

    • ⏱ 2023-06-12 23:20:22

1.3 准备实验环境

  • 📌 runc。Docker的默认runtime。 ^26943492-7-741-763
    • ⏱ 2023-06-12 23:23:52

2.1 What——什么是容器

  • 📌 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。 ^26943492-12-465-512

    • ⏱ 2023-06-12 23:26:14
  • 📌 所有的容器共享同一个Host OS,这使得容器在体积上要比虚拟机小很多。 ^26943492-12-1217-1253

    • ⏱ 2023-06-12 23:27:58

2.2 Why——为什么需要容器

  • 📌 Docker将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。 ^26943492-13-3237-3279

    • ⏱ 2023-06-12 23:31:26
  • 📌 Docker可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。 ^26943492-13-3279-3316

    • ⏱ 2023-06-12 23:31:33
  • 📌 “集装箱”和“容器”对应的英文单词都是“Container” ^26943492-13-3609-3639

    • ⏱ 2023-06-12 23:31:58
  • 📌 容器消除了开发、测试、生产环境的不一致性 ^26943492-13-4818-4838

    • ⏱ 2023-06-12 23:33:36

2.3 How——容器是如何工作的

  • 📌 Docker采用的是Client/Server架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个Host上,客户端也可以通过socket或REST API与远程的服务器通信。 ^26943492-14-1216-1324

    • ⏱ 2023-06-12 23:34:17
  • 📌 Docker daemon运行在Docker host上,负责创建、运行、监控容器,构建、存储镜像。 ^26943492-14-2199-2249

    • ⏱ 2023-06-12 23:34:45
  • 📌 默认配置下,Docker daemon只能响应来自本地Host的客户端请求。 ^26943492-14-2278-2316

    • ⏱ 2023-06-12 23:34:54
  • 📌 Docker容器就是Docker镜像的运行实例。 ^26943492-14-3954-3978

    • ⏱ 2023-06-12 23:36:34
  • 📌 镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。 ^26943492-14-4057-4088

    • ⏱ 2023-06-12 23:37:03
  • 📌 Registry是存放Docker镜像的仓库,Registry分私有和公有两种。 ^26943492-14-4161-4201

    • ⏱ 2023-06-12 23:37:13

2.4 小结

  • 📌 标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计哲学中,唯一不同的是:集装箱运输货物,而Docker运输软件。 ^26943492-15-472-537
    • ⏱ 2023-06-12 23:38:38

第3章 Docker镜像

  • 📌 镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器。 ^26943492-16-429-466
    • ⏱ 2023-06-12 23:41:05

3.1 镜像的内部结构

  • 📌 base镜像有两层含义:(1)不依赖其他镜像,从scratch构建;(2)其他镜像可以以之为基础进行扩展。 ^26943492-17-2819-2872

    • ⏱ 2023-06-12 23:42:58
  • 📌 能称作base镜像的通常都是各种Linux发行版的Docker镜像,比如Ubuntu、Debian、CentOS等。 ^26943492-17-2904-2962

    • ⏱ 2023-06-12 23:43:11
  • 📌 内核空间 ^26943492-17-4029-4033

    • ⏱ 2023-06-12 23:45:15
  • 📌 bootfs ^26943492-17-4054-4060

    • ⏱ 2023-06-12 23:45:28
  • 📌 用户空间 ^26943492-17-4108-4112

    • ⏱ 2023-06-12 23:45:20
  • 📌 rootfs ^26943492-17-4118-4124

    • ⏱ 2023-06-12 23:45:31
  • 📌 base镜像只是在用户空间与发行版一致,kernel版本与发行版是不同的。 ^26943492-17-5649-5686

    • ⏱ 2023-06-12 23:48:24
  • 📌 容器只能使用Host的kernel,并且不能修改。 ^26943492-17-6281-6306

    • ⏱ 2023-06-12 23:48:33
  • 📌 Docker支持通过扩展现有镜像,创建新的镜像。 ^26943492-17-6534-6558

    • ⏱ 2023-06-12 23:50:12
  • 📌 Copy-on-Write ^26943492-17-7921-7934

    • ⏱ 2023-06-12 23:51:59
  • 📌 当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”,如图3-12所示。图3-12所有对容器的改动,无论添加、删除,还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。 ^26943492-17-8005-8422

    • ⏱ 2023-06-12 23:53:04
  • 📌 当需要修改时才复制一份数据,这种特性被称作Copy-on-Write。 ^26943492-17-8979-9014

    • ⏱ 2023-06-12 23:55:26
  • 📌 容器层保存的是镜像变化的部分 ^26943492-17-9017-9031

    • ⏱ 2023-06-12 23:55:41
  • 📌 容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。 ^26943492-17-9091-9136

    • ⏱ 2023-06-12 23:56:16

3.2 构建镜像

  • 📌 Dockerfile(推荐方法)构建镜像,底层也是docker commit一层一层构建新镜像的。 ^26943492-18-4073-4122

    • ⏱ 2023-06-12 23:59:31
  • 📌 Dockerfile是一个文本文件,记录了镜像构建的所有步骤。 ^26943492-18-4269-4300

    • ⏱ 2023-06-13 00:00:33
  • 📌 Docker默认会从build context中查找Dockerfile文件 ^26943492-18-5535-5573

    • ⏱ 2023-06-13 00:01:22
  • 📌 Dockerfile中的ADD、COPY等命令可以将build context中的文件添加到镜像。 ^26943492-18-5753-5802

    • ⏱ 2023-06-13 00:01:44
  • 📌 build context为当前目录 /root,该目录下的所有文件和子目录都会被发送给Docker daemon。 ^26943492-18-5806-5864

    • ⏱ 2023-06-13 00:02:26
  • 📌 不要将多余文件放到build context,特别不要把 /、/usr作为build context,否则构建过程会相当缓慢甚至失败。 ^26943492-18-5917-5984

    • ⏱ 2023-06-13 00:02:32
  • 📌 missing表示无法获取IMAGE ID,通常从Docker Hub下载的镜像会有这个问题。 ^26943492-18-7887-7934

    • ⏱ 2023-06-13 00:07:35
  • 📌 Docker会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无须重新创建。 ^26943492-18-8054-8103

    • ⏱ 2023-06-13 00:08:00
  • 📌 Dockerfile中每一个指令都会创建一个镜像层,上层是依赖于下层的。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。 ^26943492-18-9700-9767

    • ⏱ 2023-06-13 00:09:01
  • 📌 改变Dockerfile指令的执行顺序,或者修改或添加指令,都会使缓存失效。 ^26943492-18-9805-9843

    • ⏱ 2023-06-13 00:12:28
  • 📌 Dockerfile构建镜像的过程:(1)从base镜像运行一个容器。(2)执行一条指令,对容器做修改。(3)执行类似docker commit的操作,生成一个新的镜像层。(4)Docker再基于刚刚提交的镜像运行一个新容器。(5)重复2~4步,直到Dockerfile中的所有指令执行完毕。 ^26943492-18-11555-11846

    • ⏱ 2023-06-13 00:21:30
  • 📌 Dockerfile中可以有多个CMD指令,但只有最后一个生效。CMD可以被docker run之后的参数替换。 ^26943492-18-14484-14540

    • ⏱ 2023-06-13 00:23:18
  • 📌 Dockerfile中可以有多个ENTRYPOINT指令,但只有最后一个生效。CMD或docker run之后的参数会被当作参数传递给ENTRYPOINT。 ^26943492-18-14657-14735

    • ⏱ 2023-06-13 00:23:24

3.3 RUN vs CMD vs ENTRYPOINT

  • 📌 RUN:执行命令并创建新的镜像层 ^26943492-19-612-628

    • ⏱ 2023-06-13 00:25:46
  • 📌 CMD:设置容器启动后默认执行的命令及其参数, ^26943492-19-674-697

    • ⏱ 2023-06-13 00:26:00
  • 📌 ENTRYPOINT:配置容器启动时运行的命令。 ^26943492-19-758-782

    • ⏱ 2023-06-13 00:24:20
  • 📌 用两种方式指定RUN、CMD和ENTRYPOINT要运行的命令:Shell格式和Exec格式 ^26943492-19-931-977

    • ⏱ 2023-06-13 00:24:47
  • 📌 RUN在当前镜像的顶部执行命令,并创建新的镜像层。 ^26943492-19-3007-3032

    • ⏱ 2023-06-13 00:27:15

3.4 分发镜像

  • 📌 镜像的名字由两部分组成:repository和tag ^26943492-20-1541-1567

    • ⏱ 2023-06-13 00:28:54
  • 📌 每个repository可以有多个tag,而多个tag可能对应的是同一个镜像。 ^26943492-20-2969-3008

    • ⏱ 2023-06-13 00:30:54
  • 📌 Docker会上传镜像的每一层 ^26943492-20-6862-6877

    • ⏱ 2023-06-13 00:31:48

3.5 小结

  • 📌 镜像的常用操作子命令:● images:显示镜像列表。● history:显示镜像构建历史。● commit:从容器创建新镜像。● build:从Dockerfile构建镜像。● tag:给镜像打tag。● pull:从registry下载镜像。● push:将镜像上传到registry。● rmi:删除Docker host中的镜像。● search:搜索Docker Hub中的镜像。 ^26943492-21-563-1064
    • ⏱ 2023-06-13 00:33:38

4.1 运行容器

  • 📌 两种方法进入容器:attach和exec ^26943492-23-4740-4760

    • ⏱ 2023-06-14 00:54:19
  • 📌 docker attach ^26943492-23-4797-4810

    • ⏱ 2023-06-14 01:05:08
  • 📌 attach与exec主要区别如下:(1)attach直接进入容器启动命令的终端,不会启动新的进程。(2)exec则是在容器中打开新的终端,并且可以启动新的进程。(3)如果想直接在终端中查看启动命令的输出,用attach;其他情况使用exec。 ^26943492-23-6144-6382

    • ⏱ 2023-06-14 00:57:16
  • 📌 如果只是为了查看启动命令的输出,可以使用docker logs命令 ^26943492-23-6385-6418

    • ⏱ 2023-06-14 00:57:25
  • 📌 按用途容器大致可分为两类:服务类容器和工具类的容器。 ^26943492-23-6823-6849

    • ⏱ 2023-06-14 00:57:45
  • 📌 服务类容器以daemon的形式运行,对外提供服务 ^26943492-23-6878-6902

    • ⏱ 2023-06-14 00:58:12
  • 📌 工具类容器通常能给我们提供一个临时的工作环境 ^26943492-23-6998-7020

    • ⏱ 2023-06-14 00:58:04

4.2 stop/start/restart容器

  • 📌 容器在docker host中实际上是一个进程,docker stop命令本质上是向该进程发送一个SIGTERM信号。 ^26943492-24-777-836

    • ⏱ 2023-06-14 01:00:58
  • 📌 快速停止容器,可使用docker kill命令,其作用是向容器进程发送SIGKILL信号 ^26943492-24-839-883

    • ⏱ 2023-06-14 01:01:50

4.3 pause / unpause容器

  • 📌 处于暂停状态的容器不会占用CPU资源,直到通过docker unpause恢复运行 ^26943492-25-827-868
    • ⏱ 2023-06-14 01:03:05

4.5 State Machine

  • 📌 State Machine ^26943492-27-429-442

    • ⏱ 2023-06-14 01:06:43
  • 📌 [插图] ^26943492-27-735-736

    • ⏱ 2023-06-14 01:05:36

4.6 资源限制

  • 📌 -m或 –memory:设置内存的使用限额,例如100MB,2GB。 ^26943492-28-792-827

    • ⏱ 2023-06-14 01:07:19
  • 📌 –memory-swap:设置内存+swap的使用限额 ^26943492-28-859-887

    • ⏱ 2023-06-14 01:07:37
  • 📌 启动容器时只指定 -m而不指定 –memory-swap,那么 –memory-swap默认为 -m的两倍 ^26943492-28-2428-2483

    • ⏱ 2023-06-14 01:08:56
  • 📌 -c或 –cpu-shares设置容器使用CPU的权重。如果不指定,默认值为1024。 ^26943492-28-2812-2856

    • ⏱ 2023-06-14 01:09:27
  • 📌 容器最终能分配到的CPU资源取决于它的cpu share占所有容器cpu share总和的比例。 ^26943492-28-2937-2985

    • ⏱ 2023-06-14 01:10:12
  • 📌 containerA的cpu share 1024,是containerB的两倍。当两个容器都需要CPU资源时,containerA可以得到的CPU是containerB的两倍。 ^26943492-28-3277-3366

    • ⏱ 2023-06-14 01:10:55
  • 📌 按权重分配CPU只会发生在CPU资源紧张的情况下。如果containerA处于空闲状态,这时,为了充分利用CPU资源,containerB也可以分配到全部可用的CPU。 ^26943492-28-3406-3490

    • ⏱ 2023-06-14 01:11:19
  • 📌 可通过设置权重、限制bps和iops的方式控制容器读写磁盘的带宽 ^26943492-28-5402-5434

    • ⏱ 2023-06-14 01:11:55
  • 📌 bps是byte per second,每秒读写的数据量。 ^26943492-28-6018-6047

    • ⏱ 2023-06-14 01:12:39
  • 📌 iops是io per second,每秒IO的次数。 ^26943492-28-6076-6103

    • ⏱ 2023-06-14 01:12:46
  • 📌 oflag=direct ^26943492-28-6993-7005

    • ⏱ 2023-06-14 01:14:36

4.7 实现容器的底层技术

  • 📌 cgroup实现资源限额,namespace实现资源隔离。 ^26943492-29-554-583

    • ⏱ 2023-06-14 01:15:21
  • 📌 cgroup全称Control Group。Linux操作系统通过cgroup可以设置进程使用CPU、内存和IO资源的限额。 ^26943492-29-686-748

    • ⏱ 2023-06-14 01:15:39
  • 📌 Linux使用了6种namespace,分别对应6种资源:Mount、UTS、IPC、PID、Network和User ^26943492-29-2360-2419

    • ⏱ 2023-06-14 01:18:49

第5章 Docker网络

  • 📌 Docker安装时会自动在host上创建三个网络 ^26943492-31-673-697
    • ⏱ 2023-06-14 01:20:20

5.1 none网络

  • 📌 none网络就是什么都没有的网络。挂在这个网络下的容器除了lo,没有其他任何网卡。 ^26943492-32-470-511

    • ⏱ 2023-06-14 01:21:04
  • 📌 对安全性要求高并且不需要联网的应用可以使用none网络 ^26943492-32-891-918

    • ⏱ 2023-06-14 01:20:52

5.2 host网络

  • 📌 host网络的容器共享Docker host的网络栈,容器的网络配置与host完全一样。 ^26943492-33-468-512

    • ⏱ 2023-06-14 01:22:18
  • 📌 使用Docker host的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择host网络。 ^26943492-33-900-955

    • ⏱ 2023-06-14 01:22:45
  • 📌 Docker host的另一个用途是让容器可以直接配置host网路 ^26943492-33-1038-1071

    • ⏱ 2023-06-14 01:23:13

5.3 bridge网络

  • 📌 不指定–network,创建的容器默认都会挂到docker0 ^26943492-34-507-538

    • ⏱ 2023-06-15 00:08:17
  • 📌 创建一个容器 ^26943492-34-836-842

    • ⏱ 2023-06-15 00:10:37
  • 📌 一个新的网络接口veth28c57df被挂到了docker0上,veth28c57df就是新创建容器的虚拟网卡。 ^26943492-34-1123-1179

    • ⏱ 2023-06-15 00:09:39
  • 📌 容器有一个网卡eth0@if34 ^26943492-34-1494-1510

    • ⏱ 2023-06-15 00:09:54
  • 📌 eth0@if34和veth28c57df是一对veth pair ^26943492-34-1569-1602

    • ⏱ 2023-06-15 00:10:06
  • 📌 veth pair是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if34)在容器中,另一头(veth28c57df)挂在网桥docker0上,其效果就是将eth0@if34也挂在了docker0上。 ^26943492-34-1603-1759

    • ⏱ 2023-06-14 01:24:13
  • 📌 eth0@if34已经配置了IP 172.17.0.2 ^26943492-34-1764-1791

    • ⏱ 2023-06-15 00:13:39
  • 📌 docker network inspect bridge ^26943492-34-1807-1836

    • ⏱ 2023-06-15 00:14:00
  • 📌 bridge网络配置的subnet就是172.17.0.0/16,并且网关是172.17.0.1。这个网关在哪儿呢?大概你已经猜出来了,就是docker0 ^26943492-34-2128-2205

    • ⏱ 2023-06-15 00:14:10
  • 📌 [插图] ^26943492-34-2688-2689

    • ⏱ 2023-06-15 00:15:02

5.4 user-defined网络

  • 📌 除了none、host、bridge这三个自动创建的网络,用户也可以根据业务需要创建user-defined网络。 ^26943492-35-473-559

    • ⏱ 2023-06-15 00:15:33
  • 📌 Docker提供三种user-defined网络驱动:bridge、overlay和macvlan。overlay和macvlan用于创建跨主机的网络 ^26943492-35-559-634

    • ⏱ 2023-06-15 00:15:54
  • 📌 [插图] ^26943492-35-3795-3796

    • ⏱ 2023-06-15 00:18:34
  • 📌 两个busybox容器都挂在my_net2上,应该能够互通 ^26943492-35-3868-3897

    • ⏱ 2023-06-15 00:18:42
  • 📌 同一网络中的容器、网关之间都是可以通信的。 ^26943492-35-4182-4203

    • ⏱ 2023-06-15 00:19:14
  • 📌 不同的网络如果加上路由应该就可以通信了吧? ^26943492-35-4666-4687

    • ⏱ 2023-06-15 00:23:20
  • 📌 ip r查看host上的路由表 ^26943492-35-4908-4923

    • ⏱ 2023-06-15 00:20:46
  • 📌 docker network connect ^26943492-35-5984-6006

    • ⏱ 2023-06-15 00:22:23
  • 📌 [插图] ^26943492-35-7170-7171

    • ⏱ 2023-06-15 00:24:08

5.5 容器间通信

  • 📌 两个容器要能通信,必须要有属于同一个网络的网卡。满足这个条件后,容器就可以通过IP交互了。 ^26943492-36-625-670

    • ⏱ 2023-06-15 00:24:39
  • 📌 Docker 1.10版本开始,docker daemon实现了一个内嵌的DNS server,使容器可以直接通过“容器名”通信。 ^26943492-36-1005-1070

    • ⏱ 2023-06-15 00:25:07
  • 📌 docker DNS有个限制:只能在user-defined网络中使用。也就是说,默认的bridge网络是无法使用DNS的。 ^26943492-36-1650-1712

    • ⏱ 2023-06-15 00:25:37
  • 📌 joined容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined容器之间可以通过127.0.0.1直接通信。 ^26943492-36-2359-2429

    • ⏱ 2023-06-15 00:27:20
  • 📌 joined容器非常适合以下场景:(1)不同容器中的程序希望通过loopback高效快速地通信,比如Web Server与App Server。(2)希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。 ^26943492-36-3610-3775

    • ⏱ 2023-06-15 00:29:05

5.6 将容器与外部世界连接

  • 📌 -A POSTROUTING -s 172.17.0.0/16 ! -o docker0-j MASQUERADE​​ ^26943492-37-1992-2051

    • ⏱ 2023-06-15 00:34:03
  • 📌 如果网桥docker0收到来自172.17.0.0/16网段的外出包,把它交给MASQUERADE处理。而MASQUERADE的处理方式是将包的源地址替换成host的地址发送出去,即做了一次网络地址转换(NAT)。 ^26943492-37-2097-2204

    • ⏱ 2023-06-15 00:33:56
  • 📌 通过NAT, docker实现了容器对外网的访问。 ^26943492-37-4100-4125

    • ⏱ 2023-06-15 00:33:28
  • 📌 docker可将容器对外提供服务的端口映射到host的某个端口,外网通过该端口访问容器。 ^26943492-37-4320-4364

    • ⏱ 2023-06-15 00:37:50
  • 📌 每一个映射的端口,host都会启动一个docker-proxy进程来处理访问容器的流量 ^26943492-37-5387-5430

    • ⏱ 2023-06-15 00:38:02
  • 📌 以0.0.0.0:32773->80/tcp为例分析整个过程,如图5-41所示。图5-41(1)docker-proxy监听host的32773端口。(2)当curl访问10.0.2.15:32773时,docker-proxy转发给容器172.17.0.2:80。(3)httpd容器响应请求并返回结果。 ^26943492-37-5706-6181

    • ⏱ 2023-06-15 00:40:29

第6章 Docker存储

  • 📌 Docker为容器提供了两种存放数据的资源:(1)由storage driver管理的镜像层和容器层。(2)Data Volume。 ^26943492-39-471-595
    • ⏱ 2023-06-15 00:44:46

6.1 storage driver

  • 📌 容器由最上面一个可写的容器层,以及若干只读的镜像层组成,容器的数据就存放在这些层中。 ^26943492-40-779-821

    • ⏱ 2023-06-15 00:45:25
  • 📌 Copy-on-Write:(1)新数据会直接存放在最上面的容器层。(2)修改现有数据会先从镜像层将数据复制到容器层,修改后的数据直接保存在容器层中,镜像层保持不变。(3)如果多个层中有命名相同的文件,用户只能看到最上面那层中的文件。 ^26943492-40-834-1038

    • ⏱ 2023-06-15 00:45:51
  • 📌 Docker安装时会根据当前系统的配置选择默认的driver ^26943492-40-1545-1575

    • ⏱ 2023-06-15 00:50:01

6.2 Data Volume

  • 📌 Data Volume本质上是Docker Host文件系统中的目录或文件,能够直接被mount到容器的文件系统中。 ^26943492-41-470-528

    • ⏱ 2023-06-15 00:52:12
  • 📌 Data Volume有以下特点:(1)Data Volume是目录或文件,而非没有格式化的磁盘(块设备)。(2)容器可以读写volume中的数据。(3)volume数据可以被永久地保存,即使使用它的容器已经销毁。 ^26943492-41-528-722

    • ⏱ 2023-06-15 00:52:26
  • 📌 volume实际上是docker host文件系统的一部分,所以volume的容量取决于文件系统当前未使用的空间,目前还没有方法设置volume的容量。 ^26943492-41-1293-1369

    • ⏱ 2023-06-15 00:53:48
  • 📌 bind mount是将host上已存在的目录或文件mount到容器。 ^26943492-41-1566-1630

    • ⏱ 2023-06-15 00:54:18
  • 📌 bind mount时还可以指定数据的读写权限,默认是可读可写 ^26943492-41-3506-3537

    • ⏱ 2023-06-15 00:54:51
  • 📌 每当容器申请mount docker manged volume时,docker都会在 /var/lib/docker/volumes下生成一个目录 ^26943492-41-5974-6048

    • ⏱ 2023-06-15 00:56:39
  • 📌 如果mount point指向的是已有目录,原有数据会被复制到volume中。 ^26943492-41-6581-6620

    • ⏱ 2023-06-15 00:57:02
  • 📌 表6-1 bind mount和docker managed volume的不同点 ^26943492-41-8015-8215

    • ⏱ 2023-06-15 00:58:43

6.4 volume container

  • 📌 volume container是专门为其他容器提供volume的容器。 ^26943492-43-475-511

    • ⏱ 2023-06-15 00:59:54
  • 📌 volume container的作用只是提供数据,它本身不需要处于运行状态。 ^26943492-43-924-963

    • ⏱ 2023-06-15 01:01:04
  • 📌 –volumes-from ^26943492-43-1767-1781

    • ⏱ 2023-06-15 18:58:48

6.5 data-packed volume container

  • 📌 data-packed volume container ^26943492-44-612-640
    • ⏱ 2023-06-15 18:57:26

6.6 Data Volume生命周期管理

  • 📌 执行docker rm删除容器时可以带上 -v参数,docker会将容器使用到的volume一并删除,但前提是没有其他容器mount该volume ^26943492-45-1929-2002
    • ⏱ 2023-06-15 19:00:38

6.7 小结

  • 📌 Docker为容器提供了两种存储资源:数据层和Data Volume。 ^26943492-46-506-541

    • ⏱ 2023-06-15 19:01:35
  • 📌 数据层包括镜像层和容器层,由storage driver管理。 ^26943492-46-573-604

    • ⏱ 2023-06-15 19:01:43
  • 📌 Data Volume有两种类型:bind mount和docker managed volume。 ^26943492-46-636-686

    • ⏱ 2023-06-15 19:01:55

7.4 管理Machine

  • 📌 多主机环境下Docker Machine可以大大提高效率,而且操作也很简单 ^26943492-52-3236-3273
    • ⏱ 2023-06-15 19:09:20

第8章 容器网络

  • 📌 跨主机网络方案包括:(1)docker原生的overlay和macvlan;(2)第三方方案:常用的包括flannel、weave和calico。 ^26943492-53-789-862
    • ⏱ 2023-06-15 20:46:35

8.1 libnetwork & CNM

  • 📌 libnetwork是docker容器网络库,最核心的内容是其定义的Container Network Model(CNM) ^26943492-54-475-537

    • ⏱ 2023-06-15 20:47:12
  • 📌 Sandbox是容器的网络栈,包含容器的interface、路由表和DNS设置。 ^26943492-54-635-675

    • ⏱ 2023-06-15 20:49:16
  • 📌 Linux Network Namespace是Sandbox的标准实现 ^26943492-54-675-711

    • ⏱ 2023-06-15 20:50:06
  • 📌 Sandbox可以包含来自不同Network的Endpoint ^26943492-54-712-743

    • ⏱ 2023-06-15 20:50:09
  • 📌 Endpoint的作用是将Sandbox接入Network ^26943492-54-817-846

    • ⏱ 2023-06-15 20:50:42
  • 📌 Endpoint的典型实现是veth pair ^26943492-54-847-870

    • ⏱ 2023-06-15 20:50:50
  • 📌 一个Endpoint只能属于一个网络,也只能属于一个Sandbox。 ^26943492-54-879-946

    • ⏱ 2023-06-15 20:50:59
  • 📌 Network包含一组Endpoint,同一Network的Endpoint可以直接通信。 ^26943492-54-985-1030

    • ⏱ 2023-06-15 20:54:57
  • 📌 Network的实现可以是Linux Bridge、VLAN等 ^26943492-54-1030-1061

    • ⏱ 2023-06-15 20:55:05
  • 📌 CNM的示例,如图8-2所示。图8-2 ^26943492-54-1094-1335

    • ⏱ 2023-06-15 20:55:31
  • 📌 容器环境:(1)两个Network:默认网络bridge和自定义网络my_net2。实现方式是Linux Bridge:docker0和br-5d863e9f78b6。(2)三个Endpoint,由veth pair实现,一端(vethxxx)挂在Linux Bridge上,另一端(eth0)挂在容器内。(3)三个Sandbox,由Network Namespace实现,每个容器有自己的Sanbox。 ^26943492-54-2257-2546

    • ⏱ 2023-06-15 21:01:05

8.3 macvlan

  • 📌 除了overlay, docker还开发了另一个支持跨主机容器网络的driver:macvlan。 ^26943492-56-462-540

    • ⏱ 2023-06-16 00:15:57
  • 📌 macvlan本身是linxu kernel模块,其功能是允许同一个物理网卡配置多个MAC地址,即多个interface,每个interface可以配置自己的IP。 ^26943492-56-540-622

    • ⏱ 2023-06-16 00:16:16
  • 📌 macvlan本质上是一种网卡虚拟化技术 ^26943492-56-622-642

    • ⏱ 2023-06-16 00:16:19
  • 📌 macvlan的最大优点是性能极好 ^26943492-56-698-715

    • ⏱ 2023-06-16 00:16:38
  • 📌 docker没有为macvlan提供DNS服务,这点与overlay网络是不同的。 ^26943492-56-4067-4108

    • ⏱ 2023-06-16 00:17:43

读书笔记

第1章 鸟瞰容器生态系统

划线评论

  • 📌 PaaS ^288358866-7IVeL72fj
    • 💭 PaaS是Platform-as-a-Service的缩写,意思是平台即服务。 把服务器平台作为一种服务提供的商业模式。通过网络进行程序提供的服务称之为SaaS(Software as a Service),而云计算时代相应的服务器平台或者开发环境作为服务进行提供就成为了PaaS(Platform as a Service)。
    • ⏱ 2023-06-12 23:15:17

划线评论

  • 📌 stats ^288358866-7IVfdqSmY
    • 💭 统计数据、统计学
    • ⏱ 2023-06-12 23:22:15

3.2 构建镜像

划线评论

  • 📌 执行类似docker commit的操作,生成一个新的镜像层。 ^288358866-7IViOGgdO
    • 💭 据前文所述底层使用的 commit,到这里怎么变成类似 commit 的操作了?😂
    • ⏱ 2023-06-13 00:17:14

4.7 实现容器的底层技术

划线评论

  • 📌 namespace ^288358866-7IWT92dLW
    • 💭 namespace管理着host中全局唯一的资源,其他命名空间下的资源对当前命名空间下的程序(容器)不可见。
    • ⏱ 2023-06-14 01:18:36

6.1 storage driver

划线评论

  • 📌 Mapper ^288358866-7IYnunTMW
    • 💭 映射器;映像器;映射程序;变换器;映射对象
    • ⏱ 2023-06-15 00:48:36

7.3 创建Machine

划线评论

  • 📌 daemon ^288358866-7IZxmzxny
    • 💭 后台驻留程序、守护程序
    • ⏱ 2023-06-15 19:06:02

本书评论

Licensed under CC BY-NC-SA 4.0