为了学习python爬虫框架,学习了docker。
内容全部来自官网,可以查看索引跳转。之所以写这篇文章,
一是感觉官网写的有点绕,在介绍service的时候使用swarm,stack;介绍swarm,stack又用了service。自己写可以完全按照自己的理解来。
个人觉得在介绍概念的时候,穿插是很难受的。比如介绍A的时候用B,介绍B的时候用A。有点自我介绍时ABB说,姓是ABB的A,B是ABB的B的感觉。
二是的确需要总结下概念帮助理解记忆。
自己的记忆力真的很差。这种平时基本用不到的东西,需要各种笔记。经过多次实践,还是在学习的时候记录。复习的时候翻笔记
会根据自己的实际理解,尽最大可能记录所有要点。因为目的性,对《Get Started, Part 6: Deploy your app》一节没有记录。
当然很多地方会因为知识局限,导致理解偏差,还请指出。
https://docs.docker.com/
linux 代理可能出现的问题: https://docs.docker.com/get-started/part2/#run-the-app
Docker Trusted Registry(DTR): https://docs.docker.com/datacenter/dtr/2.4/guides/
docker-machine: https://docs.docker.com/machine/get-started/#create-a-machine
Docker hub,即发布后的地址: https://hub.docker.com/
通过docker hub可以存image,那么image或者service的配置文件呢?请看docker云:
https://docs.docker.com/docker-cloud/
compose(配置): https://docs.docker.com/compose/overview/
https://docs.docker.com/get-started/
对于官网的
对于VM我们应该会比较熟悉,就是用虚拟化技术访问物理主机资源,建立一个完整的虚拟操作系统,用hypervisor来进行管理。
而Docker无需hypervisor,且对于很多硬件设备的模拟都不再需要,直接在主机操作系统(Host OS)上进行独立进程的隔离,只配以最精简的资源。
Docker用go实现并拥有linux 内核的部分优势功能。
Docker is licensed under the open source Apache 2.0 license.
Docker是一个使用者(开发或者系统管理)通过container操作(开发、部署、运行)application(应用)的平台
Linux container部署应用的功能叫做containerization(这里限定Linux container是文档没及时更新吧?)
container的概念不是新的,但是用于快捷部署应用是第一次。
这里对于应用的理解,更像是一个项目。
containerization不断受欢迎的原因:
containerization 让CI/CD无缝化:应用不依赖系统,更新可以随时推送到已发布的应用,资源密度被优化
dockerfile定义了docker所需环境,包括访问资源时需要的网络接口(因为是独立了,所以端口需要定义)和磁盘驱动,以及需要拷贝进去的文件。
因为共享目录的存在,启动应用后可以运行dockerfile上的命令。
Docker的整个系统基于Docker engine(dockere),dockere 是一个client-server(C/S)应用,它包含:
即CLI 以脚本的方式 通过REST API与dockerd交互,基于Unix sockets或者网络端口(C端和S端可以物理分离)
dockere依赖于cgroups技术。用来控制 资源是独立还是共享,资源使用量等。
dockere的具体资源独立是通过命名空间实现,而命名空间的类型有:
文件系统层面,dockere支持多种UnionFS变体,包括AUFS, btrfs, vfs, and DeviceMapper。
dockerd可以管理对象如 images, containers, networks, volumes …等,而对于service之类的是通过多个dockerd交互共同管理。
dockerd绑定unix socket ,而不是TCP端口。默认情况下unix socket需要root,否则需要使用sudo访问。
所以dockerd永远以root 用户的形式运行。
通过docker store: https://store.docker.com/ 可以售卖获取image
image是一个只读的包涵了运行应用所需事物(代码、运行环境、库、配置文件)的可运行的包,是用来创建contaitner的模板。
image一般是基于另一个image进行自定义
一个仓库的集合叫做registry,而一个仓库是image的集合。
docker从registry获取image, registry默认配置为docker hub,一个账户对应一个registry 。
docker命令行默认使用公开的registry,但是你可以自己装一个DTR
Docker Datacenter(DDC) 包含了DTR
运行image的时候,dockerfile的配置会被设置为一个layer,当配置修改并重建时,只是修改了这层layer
Docker提供了打包和运行应用的能力,但是需要一个前提,就是在一个叫做container的松散独立环境中。
container是image运行的实例,包涵了image状态、用户进程等,你可以对它执行start,stop,remove,create,delete,也可以将container连接到一个或多个网络,接续存储。也可以从container当前状态创建一个image
它运行在Linux本地且和其他container共享宿主机器的内核,但运行在独立(discrete)进程
container是发布和测试app的最小单元。Container足够轻量,无需额外的消耗,直接在kernel中运行。
container的独立空间 即通过命名空间来实现,也算一个layer
运行container时,docker会分派一个读写系统给container,做为最后的layer
dockere 将命名空间(namespaces),cgroups,unionFS合并入一个wrapper,这个wrapper被叫做container format。
默认为libcontainer,未来可能会支持BSD Jails or Solaris Zones。
在分布式应用中,不同的功能片被叫做services。
同理,docker中的service就是一个应用中的具有同一功能的containers(如数据库、web)。
一个service只运行一个image,可以配置包括端口、副本数量、进程资源等等,而配置这些只需要一个 docker-compose.yml文件
运行在service中的单独的container被叫做task。taks会被赋予一个自增的数字id,这个数字id取决于配置文件中的replicas
stack是一组内部关联的service。这些service互相共享依赖,可以通过stack进行统一处理和调整。
一个stack足够部署一个应用,只是很多复杂应用需要多个stack
没有很多说辞,但是纵观之后,我觉得stack就是service、container的依赖形式。
一共有三句类似的定义:
其实理解起来,我觉得swarm就是docker的管理模式。
多机器在整体的结构上,可以是实体也可以是虚拟的,被称为swarm node(node)。
在管理模式上,需要一个管理者,叫做swarm manager(manager)。 牢记manager是swarm中唯一可以执行命令的机器 。而其余node就是叫做worker
既然是管理,就可以设定策略。如emptiest node – 最小单元化; global – 完全实例化,当然也可以在配置文件中定义。
默认情况下,service在worker node上是负载均衡的。而对于使用者(consumer)而言,service是一个整体
过去,python的配置非常讲究,环境和依赖包让人很困扰。而现在,可以通过配置一个image来实现环境的一键搭建
Q1:
docker-compose.yml只被说明用来定义service,为什么container、swarm、stack都可以用。
A1:
在产品中,container其实是以service的方式运行。
service定义了container在产品中的行为,而stack则定义所有service的交互形式,swarm则是对运行service的machine进行策略管理。
所以实际上,docker-compose.yml只是在配置container,而service,swarm, stack都只是container的上层形式。
Q2:
使用负载均衡的案例之后,chrome无法访问localhost:4000,但是firefox可以
PA2
初步查询得到如下:https://bugs.chromium.org/p/chromium/issues/detail?id=489973
Q3:
win10 运行官网demo。
在拉取镜像时如果出现 no matching manifest for unknown in the manifest list entries
使用ubuntu跑示例非常顺畅。
A3:
鼠标点击docker图标,进入设置(settings)=> Daemon ,开启advance,把json 里面的experimental设置为true,保存重启docker即可。