打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
一篇把docker基础说的很透彻的文章

Docker介绍

Docker的目标

1. 提供简单轻量的建模方式

2. 职责的逻辑分离

3. 快速高效的开发生命周期

4. 鼓励使用面向服务的架构

Docker使用场景

1. 使用dockers容器开发,测试,部署服务

2. 创建隔离的运行环境

3. 搭建测试环境

4. 构建多用户的平台即服务(PaaS)基础设施

5. 提供软件即服务(SaaS)应用程序

6. 高性能、超大规模的宿主机部署

Docker基本组成

1. Docker Client客户端

2. Docker Daemon守护进程

3. Docker Image镜像

4. Docker Container容器

5. Docker Registry仓库

Docker容器实现介绍

Docker依赖的Linux内核特性

namespace(命名空间)

编程语言中,引入命名空间的概念是为了重用变量名或者服务例程明 在不同的命名空间中使用同一个变量不会产生冲突。 linux系统引入命名空间也有类似的的作用 例如,在没有操作级虚拟化的linux 系统中,用户态进程从1开始编号(PID) 引入操作心痛虚拟化之后,不同的容器有着不同的PID命名空间,每个容器中的进程都可以1开始编号而不产生冲突

目前,linux中的命名空间有6钟类型,分别对应操作系统管理的6中资源

· 挂载点(mount point)CLONE_NEWNS

· 进程(PID)CLONE_NEWPID

· 网络(net)CLONE_NEWNET

· 进程间通讯(ipc)CLONE_NEWIPC

· 主机名(uts)CLONE_NEWUTS

· 用户(uid)CLONE_NEWUSER

控制组(Cgroup)

命名空间是从命名和编号的角度进行隔离,而控制组则是将进程进行分组, 并真正的将各组进程的计算机资源进行限制,隔离, 控制组是一种内核机制,他可以对进程进行分组,跟踪,限制其使用的计算资源

对于每一类计算资源,控制组通过所谓的子系统(subsystem)来进行控制

· cpusets: 用来分配一组cpu给指定的cgroup,该cgroup中的进程只等被调度到该组CPU上去执行

· blkio: 限制cgroup中的块IO

· cpuacct: 用来统计cgroup中的cpu使用

· devices: 用来黑白名单的方式控制cgroup可以创建和使用的设备节点

· freezer:用来挂起指定的cgroup,或者唤醒挂起的cgroup

· hugetlb:用来限制cgroup中的hugetlb的使用

· memory:用来跟踪限制内存及交换分区的使用

· net_cls: 用来根据发送端的cgroup来标记数据包,流量控制器(traffic controller)会根据这些标记来分配优先级

· net_prio:用来配置cgroup的网络通信优先级

· cpu:用来设置cgroup中的cpu调度参数

· perf_event:用来监控cgroup的cpu性能

与命名空间不同,控制组并没有增加系统调用,而是实现了一个文件系统,通过文件及目录操作来管理控制组

Docker与虚拟机的区别

理解虚拟机

虚拟机运行多个相互隔离的应用时,如下图

从下到上理解上图:

· 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。

· 主操作系统(Host Operating System)。你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。

· 虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。

· I型:虚拟机直接运行在系统硬件上,创建硬件全仿真实例,被称为'裸机'型。

· II型:虚拟机运行在传统操作系统上,同样创建的是硬件全仿真实例,被称为'托管(宿主)'型。

· 从操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个从操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。

· 各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。

· 应用。安装依赖之后,就可以在各个从操作系统分别运行应用了,这样各个应用就是相互隔离的

理解Docker容器

Docker容器运行多个相互隔离的应用时,如下图:

从下到上理解上图:

· 基础设施(Infrastructure)

· 主操作系统(Host Operating System)。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法'运行'Docker。

· Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。

· 各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。

· 应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

对比虚拟机与Docker

Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。 说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库。

Docker Network介绍

Docker自身的4种网络工作方式,和一些自定义网络模式

· Bridge模式

· Host模式

· Container模式

· None模式

Host模式介绍

相当于Vmware中的桥接模式,与宿主机在同一个网络,启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

创建命令

1.docker run --name host --network host --rm -it busybox

container模式介绍

指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

创建命令

1.创建一个容器

2. docker run -it --name web1 httpd

3.创建一个container模式的容器

4.docker run --name web2 --network container:web1 --rm -it httpd

None模式介绍

该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,

创建命令

1.docker run --name none -it --network none --rm httpd

Bridge模式介绍

相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。

创建命令

1.docker run --name web -it --rm httpd

Docker Images介绍

images介绍简介

docker镜像含有启动容器所需要的文件系统及其内容,因此其应用于创建并启动docker容器 采用分层构建机制,最底层为bootfs,其之为rootfs

· bootfs:用于系统引导的文件系统,包裹bootloader和kernel,容器启动完成后会被卸载以节约内存资源

· rootfs:位于boots之上,表现为docker容器的根文件系统

· 传统模式中,系统启动之时,内核挂载rootfs会首先将其'只读'模式,完整性自检完成后将其重新挂在为读写模式

· docker中,rootfs由内核挂载为'只读'模式,而后通过'联合'挂载技术额外挂载一个'可写'层

images layer

位于下层的镜像称为父镜像(parent image),最底层的称为基础镜像(base image) 最上层为'可读写'层,其下均为'只读'层

docker文件系统

advanced multi-layered unification filesystem :高级多层统一文件系统

· 用于为linux文件系统实现'联合挂载'

· aufs是之前的Unionfs的重新实现

· Docker 最初使用aufs作为容器文件系统层,他目前仍作为存储后端之一来支持

docker的分层镜像,除了aufs,docker还持之btrfs,devicemapper和vfs等 在ubuntun系统下,docekr默认ubuntu的aufs,而在centos7上,用的是devicemapper,比较新的docker使用overlay

多层实现联合挂载使用overlay2 Storage Driver: overlay2 # 抽象的二级文件系统,需要建构在本地的文件系统之上 Backing Filesystem: xfs # 后端本地的文件系统

Docker Volumes介绍

Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层 如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即'写时复制'(COW)机制 关闭并重启容器,其数据不受影响;但删除Docker容器,则其更改将会全部丢失。 单纯使用容器有存在如下问题:

· 存储于联合文件系统中,不易于宿主机访问

· 容器间数据共享不方便

· 删除容器其数据会丢失

因此引出了卷(volumes)

· 卷是容器上的一个或多个'目录',此类目录可绕过联合文件系统,与宿主机上的某目录'绑定'

docker有两种类型的卷

· 绑定挂载卷

· docker run –name t1 -it –rm -v /data/volumes/t1:/data busybox # 指定宿主机固定目录

· Dokcer-managed volume

· docker run –name t1 -it -v /data busybox # /var/lib/docker/下生成一个目录 查看挂载情况

1.docker inspect -f {{.Mounts}} t1

2.docker inspect -f {{.Mounts.Destination}} t1

多个容器的卷使用同一个主机目录

1.docker run --name t1 --rm -it -v /data/volumes/t1/:/data busybox

2.docker run --name t2 --rm -it -v /data/volumes/t1:/data busybox

复制使用其他容器的卷

1.docker run --name t1 --rm -it -v /data/volumes/t1/:/data busybox

2.docker run --name t2 --rm -it --network container:t1 --volumes-from t1 busybox

Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读

1.docker run --name t1 --rm -it -v /data/volumes/t1/:/data:ro busybox

Docker Registry介绍

启动容器时,docekr daemon会试图从本地获取相关的镜像,本地镜像不存在是,其将丛register中下载该镜像保存到本地 Registry用于保存docker镜像,包括镜像的层次结构和元数据 用户可自建Registry,也可使用官方的Docker Hub

Docker Registry分类

· Sponsor Registry:第三方的registry,供客户和docker社区使用

· Mirror Registry:第三方的registry,供客户使用

· Vendor Registry:由发布Docker镜像的供应商提供的registry

· Private Registry:通过设有防火墙和额外安全层的私有实体提供的registry

Registry(repository and index)

Repository:

· 由某特定的docker镜像的所有迭代版本组成的镜像仓库

· 一个Registry中可以存多个repository

· repository可分为'顶级仓库'和'用户仓库'

· 用户仓库名称格式为'用户名/仓库名'

· 每个仓库可以包含多个Tag(标签),每个标签对应一个镜像

Index:

· 维护用户账户,镜像的效验以及公共命名空间的信息

· 相当于为Registry提供了一个完成用户认证等功能的检索接口

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
腾讯万台规模的Docker应用实践
docker 基础
Docker终极指南:为什么Docker能做这么多事
容器快速入门完全指南
Docker原理篇
一小时Docker教程 – cSphere.cn – 国内首个docker管理平台
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服