深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
22715 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

08 | 白话容器基础(四):重新认识Docker容器

张磊 2018-09-10
你好,我是张磊。今天我和你分享的主题是:白话容器基础之重新认识 Docker 容器。
在前面的三次分享中,我分别从 Linux Namespace 的隔离能力、Linux Cgroups 的限制能力,以及基于 rootfs 的文件系统三个角度,为你剖析了一个 Linux 容器的核心实现原理。
备注:之所以要强调 Linux 容器,是因为比如 Docker on Mac,以及 Windows Docker(Hyper-V 实现),实际上是基于虚拟化技术实现的,跟我们这个专栏着重介绍的 Linux 容器完全不同。
而在今天的分享中,我会通过一个实际案例,对“白话容器基础”系列的所有内容做一次深入的总结和扩展。希望通过这次的讲解,能够让你更透彻地理解 Docker 容器的本质。
在开始实践之前,你需要准备一台 Linux 机器,并安装 Docker。这个流程我就不再赘述了。
这一次,我要用 Docker 部署一个用 Python 编写的 Web 应用。这个应用的代码部分(app.py)非常简单:
from flask import Flask
import socket
import os
app = Flask(__name__)
@app.route('/')
def hello():
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
在这段代码中,我使用 Flask 框架启动了一个 Web 服务器,而它唯一的功能是:如果当前环境中有“NAME”这个环境变量,就把它打印在“Hello”后,否则就打印“Hello world”,最后再打印出当前环境的 hostname。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(108)

  • 一步
    这样把原理刨根究底的讲解出来,很好,理解的很透彻
    2018-09-10
    76
  • 兽医
    讲得非常不错,曾经翻遍了几乎所有Docker官方文档,都没教程中来得深刻,谢谢。。
    2018-09-13
    1
    34
  • 多肉
    一切从问题出发,根据问题理解答案,总结问题如下:
    一、docker镜像如何制作的两种方式是什么?
    二、容器既然是一个封闭的进程,那么外接程序是如何进入容器这个进程的呢?
    三、docker commit对挂载点volume内容修改的影响是什么?
    四、容器与宿主机如何进行文件读写?或volume是为了解决什么题?
    五、Docker的copyData功能是什么?解决了什么问题?
    六、bind mount机制是什么?
    七、cgroup Namespace的作用是什么?
    2018-09-17
    23
  • 黄文刚 
    收货很大,感谢张磊!请教一个问题,请问在容器内部如何获取宿主机的IP? 谢谢。

    作者回复: 单靠容器,在隔离开的情况下是拿不到的。但是有了kubernetes之后这些系统信息都可以从环境变量里拿到。这个功能叫downwardapi

    2018-09-10
    1
    19
  • 与路同飞
    有预感专栏会破2万
    2018-09-10
    1
    16
  • 蔡鹏飞
    docker run 时指定-v挂载宿主机目录到容器目录,即使容器原有目录内有数据,也会被我宿主机目录数据替代的呀。难道是和我使用的storage-driver有关?我用的是overlay存储。

    作者回复: 这个行为其实是可配置的

    2018-09-12
    8
  • Liam
    这节干货满满啊
    2018-09-10
    6
  • manatee
    非常感谢老师的讲解,咱们这个有群可以互相交流吗?
    2018-09-10
    5
  • 陶希阳
    想知道云服务器等技术是不是也是通过namespace + cgroup实习的?

    作者回复: 当然不是,那可是正儿八经的虚拟化技术

    2018-09-10
    5
  • robin
    只会最后这个。
    docker run -p 8000:80 --cpuset-cpus="1" -m 500M helloworld 限制只能在cpu1上运行,内存限制为500M
    2018-09-21
    4
  • long904
    图中不太明白为什么'CMD'属于只读层,那如果 dockfile 里面 yum install 并且 commit 的话,这些 CMD 执行的 yum 命令修改的内容还属于只读层?

    作者回复: 任何镜像里的内容,都属于只读层。commit之后的东西当然也属于只读层。

    2018-09-13
    4
  • 假装乐
    听来清晰易懂,省去不少学习时间
    2018-09-10
    4
  • Han
    有两个问题不是很清楚:
    1)推荐一个docker运行一个进程,多出来的进程会变成“野”进程。那么如何理解这个野?是说不再受docker设置的namespace以及Cgroup约束了么?
    2)docker exec是在相同的namespace下创建的新进程。那么这个进程是不是也是“野”的?相比与docker attach来讲。attach是不是没有新建进程,只是attach到docker中的主进程去?
    2019-05-06
    3
  • Leon📷
    cgroupns作用
    (1)可以限制容器的cgroup filesytem视图,使得在容器中也可以安全的使用cgroup;
    (2)此外,会使容器迁移更加容易;在迁移时,/proc/self/cgroup需要复制到目标机器,这要求容器的cgroup路径是唯一的,否则可能会与目标机器冲突。有了cgroupns,每个容器都有自己的cgroup filesystem视图,不用担心这种冲突。
    2019-01-06
    3
  • 大卫
    张老师,当Dockerfile中使用sh脚本启动,而不是exec启动java应用时,若通过docker stop不能优雅的停掉Java进程。查资料说可用trap接受信号处理,这个有什么其他好的解决办法没?

    作者回复: trap sig term kill很标准的做法

    2019-01-04
    3
  • jssfy
    请问docker挂载有何限制没,是否随便一个目录都可以挂载?在容器里应该是root用户,岂不是可以对目录无节制地操作,哪怕原本主机目录中有些文件并不允许当前用户访问?是否可以相应限制

    作者回复: 无限制。至于用户权限,是有user namespace可以做一定的限制。

    2018-09-11
    3
  • Casper
    对于linux大部分容器做不到在运行容器中动态添加宿主机目录,那在什么特定场合下可以做到呢?给个大致思路即可,谢谢。

    作者回复: 如果你用的是katacontainers这种基于虚拟化的容器,才可以实现。但原生其实也不提供这个功能。

    2018-09-10
    3
  • silver
    所以说 docker exec 每次都会创建一个和容器共享namespace的新进程?

    作者回复: 可以这么理解,i.e. spawn a new process in existing namespace

    2018-09-10
    3
  • Goteswille
    磊哥好,有个小疑问 容器启动初始化容器进程与容器启动够英勇进程之间关系?谢谢
    2018-11-03
    2
  • maomaostyle
    Docker build 时指明-t后是否在push阶段不用再打标签了?如果打了会覆盖原有的吗?
    2018-10-25
    2
收起评论
99+
返回
顶部