Docker - 初次理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013867301/article/details/83900306

前言

为了学习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/

与Virtual Machine(VM)模型对比

对于官网的
container解释 VM解释

对于VM我们应该会比较熟悉,就是用虚拟化技术访问物理主机资源,建立一个完整的虚拟操作系统,用hypervisor来进行管理。
而Docker无需hypervisor,且对于很多硬件设备的模拟都不再需要,直接在主机操作系统(Host OS)上进行独立进程的隔离,只配以最精简的资源。

概念摘要

Docker介绍


Docker用go实现并拥有linux 内核的部分优势功能。

Docker is licensed under the open source Apache 2.0 license.

Docker是一个使用者(开发或者系统管理)通过container操作(开发、部署、运行)application(应用)的平台
Linux container部署应用的功能叫做containerization(这里限定Linux container是文档没及时更新吧?)
container的概念不是新的,但是用于快捷部署应用是第一次。

这里对于应用的理解,更像是一个项目。

containerization不断受欢迎的原因:

  • 够灵活:即使很复杂的app也能被containerized
  • 够轻量:container有效利用和共享了主机的内核
  • Interchangeable:可以on-the-fly式更新
  • 便携式:本地编译,云部署,任何地方运行
  • scalable:随意增减副本,自动更新、发布
  • stackable:垂直堆栈式且on-the-fly式放置服务

containerization 让CI/CD无缝化:应用不依赖系统,更新可以随时推送到已发布的应用,资源密度被优化

配置

dockerfile定义了docker所需环境,包括访问资源时需要的网络接口(因为是独立了,所以端口需要定义)和磁盘驱动,以及需要拷贝进去的文件。

因为共享目录的存在,启动应用后可以运行dockerfile上的命令。

dockere


Docker的整个系统基于Docker engine(dockere),dockere 是一个client-server(C/S)应用,它包含:

  • docker daemon(dockerd)
  • REST API
  • 集成CLI客户端(docker)

即CLI 以脚本的方式 通过REST API与dockerd交互,基于Unix sockets或者网络端口(C端和S端可以物理分离)

control groups(cgourps)

dockere依赖于cgroups技术。用来控制 资源是独立还是共享,资源使用量等。

namespaces(命名空间)

dockere的具体资源独立是通过命名空间实现,而命名空间的类型有:

  • Process ID(PID) : 用来实现进程独立
  • Networking(NET):用来实现网络端口
  • InterProcess Communication(IPC):用来访问IPC资源
  • Mount(MNT):用来管理文件系统挂载点
  • Unix Timesharing System(UTS):用来隔离内核和版本标记(version identifiers)

union file systems(UnionFS)

文件系统层面,dockere支持多种UnionFS变体,包括AUFS, btrfs, vfs, and DeviceMapper。

dockerd


dockerd 管理图解
dockerd可以管理对象如 images, containers, networks, volumes …等,而对于service之类的是通过多个dockerd交互共同管理。
dockerd绑定unix socket ,而不是TCP端口。默认情况下unix socket需要root,否则需要使用sudo访问。
所以dockerd永远以root 用户的形式运行。

image


通过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

container


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

Container format

dockere 将命名空间(namespaces),cgroups,unionFS合并入一个wrapper,这个wrapper被叫做container format。
默认为libcontainer,未来可能会支持BSD Jails or Solaris Zones。

service


在分布式应用中,不同的功能片被叫做services。
同理,docker中的service就是一个应用中的具有同一功能的containers(如数据库、web)。
一个service只运行一个image,可以配置包括端口、副本数量、进程资源等等,而配置这些只需要一个 docker-compose.yml文件

运行在service中的单独的container被叫做task。taks会被赋予一个自增的数字id,这个数字id取决于配置文件中的replicas

stack


stack是一组内部关联的service。这些service互相共享依赖,可以通过stack进行统一处理和调整。
一个stack足够部署一个应用,只是很多复杂应用需要多个stack

没有很多说辞,但是纵观之后,我觉得stack就是service、container的依赖形式。

swarm


一共有三句类似的定义:

  1. swarm是运行docker的集群机器
  2. 多个dockerd工作的组织叫做swarm
  3. 多container,多机器应用能够实现,是通过把多机器放入一个“Dockerized”的集群,这个集群叫做swarm。

其实理解起来,我觉得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即可。

猜你喜欢

转载自blog.csdn.net/u013867301/article/details/83900306