一、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是一个用于开发,交付和运行应用程序的开放平台。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,存放了数量庞大的镜像供用户下载。国内类似的公开仓库有阿里云、网易云等。
Host(主机):安装了Docker程序的机器(Docker直接安装在操作系统之上)。
Client(客户端):连接docker主机进行操作。
Registry(仓库):用来保存各种打包好的软件镜像。
Images(镜像):软件打包好的镜像;放在docker仓库中。
Container(容器):镜像启动后的实例称为一个容器,容器是独立运行的一个或一组应用、
Docker使用步骤: 安装Docker→在仓库中找到软件对应的镜像→使用Docker运行此镜像,生成Docker容器→对容器的启动和停止就是对软件的启动和停止。
4、Docker引擎
Docker Engine是具有以下主要组件的客户端—服务器应用程序
① 服务器是一种长期运行的程序,称为守护进程(dockerd 命令)(docker daemon)
② REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
③ 命令行界面(CLI)客户端(docker命令)
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守护进程
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比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 容器。
- 便宜
开源的,免费的,低成本的。由现代 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安装Docker两种安装方式
1、使用CURL获得Docker的安装脚本进行安装
2、使用YUM仓库来安装Docker
Docker Documentation | Docker DocumentationHome page for Docker's documentationhttps://docs.docker.com/
先设置为中文,首先点击右上角三竖点,并且点击设置
直接下拉到最底端,点击高级,点击语言,设置偏好语言为中文,打开询问是否翻译非您所用语言的网页,然后重新打开谷歌浏览器进入docker或者直接点击左上角刷新按钮
点击下载并安装
卸载docker旧版本
不管曾经是否安装,都建议卸载一下
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine安装管理repository及扩展包的工具
sudo yum install -y yum-utils
sudo yum-config-manager
--add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker引擎
安装之前建议先清空一下yum缓存
yum makecache fast yum install docker-ce docker-ce-cli containerd.io systemctl start docker systemctl enable docker安装阿里云镜像加速器
阿里云官网:https://account.aliyun.com/
阿里云官网:https://account.aliyun.com/(也可以选择其他的加速器,百度搜一下就行)
阿里云官网--->右上角控制台---->搜索框输入容器镜像服务---->左侧栏镜像中心内的加速器--->选择文件系统
每个账号的加速器地址都不同
网络优化 (开启路由转发)
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker
可选项:配置文件修改
#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版本查询
Docker version 或者docker info



