一、docker的发展

   最早的时候,容器技术在FreeBASE出现,叫做jail,是把一个程序放在jail中单独运行,不管运行是否出错,对外面其他应用都不会产生影响,后来,jail技术在linux中实现,叫做 Linux vserver,主要功能为chroot、namespaces和cgroups。

chroot: 完整的根文件系统(FHS)标准

namespaces:UTS(隔离内核和版本标识)、Mount(管理挂载点)、IPC( 管理跨进程通信方向)、PID(进程隔离)、user(用户间隔离)、network(管理网络接口)

cgroups: 资料的分配和监控通过比较复杂的代码开发过程,调用以上三项技术,实现容器的创建—>管理---->销毁

 

过度

 LXC(LinuXContainer)的出现

 LXC 对于原有的常用功能进行封装,方便了我们做容器生命周期的管理,通过固有“模板”,安装并启动容器。将远程的程序包下载到本地,安装并创建好我们需要的容器,但是仍然需要制定模板来使用,大规模创建及复制比较麻烦

 

目前

 docker技术应运而生

 docker技术是在LXC的基础上,加入了镜像技术,进行了二次开发和封装

 

二、什么是docker

  1、概述

   Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

 沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制

 Docker在2013年一炮而红,直到现在,已经成为容器技术的代名词。

 Docker从一开始就以提供标准化的运行时环境为目标,真正做到"Build,Ship and Run any APP,Angwhere",可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了Caas (容器即服务)技术。

小结:Dcoker是基于容器技术的轻量级虚拟化解决方案docker是容器引擎,把linux的cgroup、namespaces等容器底层技术进行完美的封装、并抽象为用户提供创建和管理容器的便捷界面(命令行cli、api等)

  

Docker 核心技术

1. Namespace(名称空间,命名空间) — 实现 Container 的进程、网络、消息、文件系统和主机名的隔离。

2. Cgroup — 实现对资源的配额和度量

注:Cgroup 的配额,可以指定实例使用的 cpu 个数,内存大小等。就像vmware 虚拟机中的硬件配置参数。

 

Docker的理念:Build,Ship and Run Any App,Anywhere,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到一次封装,到处运行。 

 

2、使用docker(容器)的意义

    Docker 把容器化技术做成了标准化平台

    统一了基础设施环境- -----docker容器环境(引擎)

统一了程序打包(装箱)方式-----docker镜像

统一了程序部署(运行)方式-----docker 容器

  

3、docker三要素(核心因素)

镜像:镜像就是一个模板(只读),容器就是镜像的一个实例。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。是一组资源的集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境)

容器:基于镜像的一种运行时状态,是用镜像创建的运行实例,一个容器运行一种服务。可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

容器的定义和镜像几乎一模一样,唯一区别在于容器的最上面那一层是可读可写的。

仓库:仓库(Repository)是集中存放镜像文件的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。

仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内类似的公开仓库有阿里云、网易云等。

docker容器简介及安装_名称空间

Host(主机):安装了Docker程序的机器(Docker直接安装在操作系统之上)。

Client(客户端):连接docker主机进行操作。

Registry(仓库):用来保存各种打包好的软件镜像。

Images(镜像):软件打包好的镜像;放在docker仓库中。

Container(容器):镜像启动后的实例称为一个容器,容器是独立运行的一个或一组应用、

Docker使用步骤: 安装Docker→在仓库中找到软件对应的镜像→使用Docker运行此镜像,生成Docker容器→对容器的启动和停止就是对软件的启动和停止。

 

4、Docker引擎

Docker Engine是具有以下主要组件的客户端—服务器应用程序

① 服务器是一种长期运行的程序,称为守护进程(dockerd 命令)(docker daemon)

② REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口

③ 命令行界面(CLI)客户端(docker命令)

docker容器简介及安装_docker_02


CLI使用Docker REST API通过脚本或直接CLI命令控制,或者与Docker守护程序交互。许多其他Docker应用程序都使用基础API和CLI

守护程序创建和管理Docker对象,例如 图像、容器、网络和卷

 

5、Docker应用

 

  更快速的应用交付和部署

传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。容器非常适合持续集成和持续交付(CI/CD) 工作流程

 

更便捷的升级和扩缩容

随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。

 

更简单的系统运维

应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。

 

更高效的计算资源利用

Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以可以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。

 

6、Docker 架构

Docker 使用客户端—服务器(C/S)架构,Docker客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以在同一系统上运行,或者可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信

 

Docker 主要组成

① Docker Client :客户端

② Docker Daemon :守护进程

③ Docker Images:镜像

④ Docker Container:容器

⑤ Docker Registry:镜像仓管

docker容器简介及安装_linux_03

Docker守护进程

Docker守护程序倾听Docker API请求并管理Docker对象,例如图片、容器、网络和卷,守护程序还可与其他守护程序通信以管理Docker服务

 

Docker 客户端

Docker 客户端是许多Docker用户与Docker交互的主要方式。当使用诸如 docker run此类命令的时候,客户端会将这些命令发送到dockerd(守护进程命令) 以执行这些命令,该docker命令使用Docker API。Docker 客户客户端可以与多个守护进程通信

 

Docker 注册表

Docker 注册表存储Docker镜像。Docker Hub是所有人都可以使用的公共注册表,并且Docker配置为默认在Docker Hub上查找镜像。甚至可以建立自己的私人注册表。如果使用Docker数据中心(DDC),则其中包括Docker可信注册表(DTR)

 

命名空间

Docker使用 namespace 提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建以组名称空间,这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间内运行,并且其访问仅限于该名称空间

 

Docker Engine在Linux上使用以下名称空间:

pid 名称空间:进程隔离(PID:进程ID)

net 名称空间:管理网络接口(NET:网络)

ipc 名称空间:管理访问IPC资源(IPC:进程间通信,信号量,消息队列,就是不同的进程访问使用的内存空间要隔离开)

mnt 名称空间:管理文件系统挂载点(MNT)

uts 名称空间:隔离内核和版本标识符 (UTS:Unix时间共享系统

User 名称空间:操作进程的用户和用户组

 

对照组(控制组

Linux上的Docker引擎还依赖于另一种控制组(cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许 Docker Engine 将可用的硬件资源共享给容器,并由选择的实施限制和约束,例如:限制特定容器可用的内存

 

联合文件系统

联合文件系统或UnionFS是通过创建图层进行操作的文件系统,使其非常轻便且快速。Docker Engine使用UnionFS为容器提供构建模块。Docker Engine可以使用多个UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper。

 

容器格式

Docker Engine 将名称空间,控制组和UnionFS组合到一个称为容器格式的包装器中,默认容器格式为libcontainer

 

7、docker容器和虚拟机的区别

docker容器简介及安装_linux_04

docker容器简介及安装_名称空间_05

面试题:

为什么Docker比VM快?

(1)docker有着比虚拟机更少的抽象层。

docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上、docker有明显优势。

 

(2)docker利用的是宿主机的内核,而不需要宿主机OS。 新建一个docker容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。避免引寻、加载操作系统内核等比较费时费资源的过程;新建一个VM虚拟机时,虚拟机软件需要加载宿主机OS,整个新建过程是分钟级别的。而docker由于直接利用宿主机的OS,则省略了返个过程,新建一个docker容器只需要几秒钟。

 

Docker优缺点:

优点:

1. 快、小

比虚拟机小,比虚拟机快,管理操作(启动,停止,开始,重启等等) 都是以秒或毫秒为单位。 Docker 启动一个容器实例时间很短,一两秒就可以启动一个实例。

2. 敏捷

像虚拟机一样敏捷,而且会更便宜,在 bare metal(裸机)上布署像点个按钮一样简单。

3. 灵活

将应用和系统“容器化”,不添加额外的操作系统,

4. 轻量

你会拥有足够的“操作系统”,仅需添加或减小镜像即可。在一台服务器上可以布署 100~1000 个 Containers 容器。

5. 便宜

 开源的,免费的,低成本的。由现代 Linux 内核支持并驱动。轻量的 Container 必定可以在一个物 理机上开启更多“容器”,注定比 VMs 要便宜。

6. 对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT 的发布速度更快。

7. 开发人员并不关心具体哪个 Linux 操作系统 使用 Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统。 然后,在部署时一切是完全一样的,因为一切都是基于 Docker Image 的运行。

8.Google,微软,亚马逊,IBM 等都支持 Docker。

9.Docker 支持 Unix/Linux 操作系统,也支持 Windows 或 Mac

缺点: 

1. Docker 部署应用的时候,并不包含数据。日志,数据库等通常应放在 Docker 容器外。 一个容器的镜像通常都很小,不适合存大量数据,存储可以通过外部挂载的方式使用。比如使用:NFS, ceph、glusterfs、ipsan,MFS 等

一句话:docker 只用于计算,存储交给别人。

2. 所有容器共用 linux kernel 资源,资源能否实现最大限度利用,所以在安全上也会存在漏洞。

 

二、docker安装及常用命令

1、安装

安装环境

 Centos7 3.1版本以上,关闭增强和防火墙

docker容器简介及安装_docker_06

安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

设置阿里云镜像源

cd /etc/yum.repos.d/
yum-config-manager --add-repo ​​https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

docker-1.13(统一版本、开源) ————》 分类型1.15-1.17 过程种分成两种,① 开源社区 docker-ce ② 企业版(收钱) docker-ee

安装docker-ce 社区版
yum install -y docker-ce
开启docker,并开机自启
systemctl start docker
systemctl enable docker

docker容器简介及安装_名称空间_07

2、安装加速器(选择安装,意义不大,)

阿里云官网:https://account.aliyun.com/(也可以选择其他的加速器,百度搜一下就行)

阿里云官网--->右上角控制台---->搜索框输入容器镜像服务---->左侧栏镜像中心内的加速器--->选择文件系统​

每个账号的加速器地址都不同

docker容器简介及安装_名称空间_08

3、网络优化 (开启路由转发)

vim /etc/sysctl.conf
net.ipv4.ip_forward=1

sysctl -p
systemctl restart network
systemctl restart docker


4、可选项:配置文件修改(生产经验)

#registry-mirrors 以上添加
"graph":"/data/docker", #数据目录
"storage-driver":"overlay2", #存储引擎
"insecure-registries":["registry.access.redhat.com","quary.io"], #私有仓库
#registry-mirrors 以下添加
"bip":"172.184.70.1/24", #docker网络
"exec-opts":["native.cgroupdriver-systemd"], #启动时的额外参数
"live-restore":true
#当docker容器引擎挂掉的时候,使用docker跑起来的容器还能继续运行​

docker容器简介及安装_名称空间_09

5、docker版本查询

   Docker version 或者docker info

docker容器简介及安装_名称空间_10

⭐⭐⭐ 面试题(生产经验)
#docker-server端配置文件 /etc/docker/daemon.json
{
"graph": "/data/docker", 数据目录 默认:/var/lib/docker/containers(image)
"storage-driver": "overlay2", 存储引擎 LXC 时为overlay ,docker是overlay2(存储驱动/引擎)
"insecure-registries": ["registry.access.redhat.com","quary.io"] 私有仓库
"registry-mirrors": ["https://q"] 镜像加速
"bip": "172.7.5.1/24",
⭐⭐⭐⭐docker网络 (172.17.0.1 docker 0)
"exec-opts": ["native.cgroupdriver=systemd"], 启动时候的额外参数(驱动,k8s使用)
"live-restore": true 当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离)
}
以上是建议的配置项
docker 容器网络生产经验
docker 的网络建议 和宿主机的IP“对照”
比如宿主机 10.2.5.6 容器的地址就可以修改为172.5.6.1,这样方便在故障发生时,更容易定位故障节点位置