Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
Docker解决了什么问题?
云计算、大数据,移动技术的快速发展,加之企业业务需求的不断变化,导致企业架构要随时更改以适合业务需求,跟上技术更新的步伐。毫无疑问,这些重担都将压在企业开发人员身上;团队之间如何高效协调,快速交付产品,快速部署应用,以及满足企业业务需求,是开发人员亟需解决的问题。Docker技术恰好可以帮助开发人员解决这些问题
Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题
2、Docker与虚拟机的区别 2.1、虚拟机总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样
2.2、Docker基础设施(Infrastructure):它可以是你的个人电脑,数据中心的服务器,或者是云主机。
主操作系统(Host Operating System):你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版
虚拟机管理系统(Hypervisor):利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare
从操作系统(Guest Operating System):假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个从操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存
各种依赖:每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库
应用:安装依赖之后,就可以在各个从操作系统分别运行应用了,这样各个应用就是相互隔离的
不难发现,相比于虚拟机,Docker要简洁很多。因为我们不需要运行多个从操作系统了
2.3、虚拟机与Docker的对比主操作系统(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可以节省大量的磁盘空间以及其他系统资源
虚拟机更擅长于彻底隔离整个运行环境。例如:云服务提供商通常采用虚拟机技术隔离不同的用户
3、容器和虚拟化Docker通常用于隔离不同的应用,例如:前端,后端以及数据库
| 对比项 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 计算能力消耗 | 几乎无 | 损耗50%左右 |
| 硬盘使用 | 一般为MB | 一般为GB |
| 性能 | 接近原生 | 弱于 |
| 交付、部署 | 容器镜像 | 虚拟机镜像 |
| 系统支持量(单机) | 单机支持上千个容器 | 一般几十个 |
| 管理效率 | 管理简单 | 概念里复杂 |
| 隔离性 | 资源限制 | 完全隔离 |
4、Docker通常场景 4.1、作为云主机使用Docker之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的。传统虚拟机需要有额外的虚拟机管理程序和虚拟操作系统层,而Docker容器是直接在操作系统层面之上实现的虚拟化;如图:
4.2、作为服务使用相比虚拟机来说,容器使用的是一系列非常轻量级的虚拟化技术,使得其启动、部署、升级跟管理进程一样迅速,用起来灵活又感觉跟虚拟机一样没什么区别,所以有些人直接使用Docker的Ubuntu等镜像创建容器,当作轻量的虚拟机来使用。
4.3、微服务架构使用如果你仅仅把Docker容器当作一个轻量的固定虚拟机用,那其实只能算是另类用法,Docker容器最重要价值在于提供一整套平台无关的标准化技术,简化服务的部署、升级、维护,只要把需要运维的各种服务打包成标准的集装箱,就可以在任何能运行Docker的环境下跑起来,达到开箱即用的效果,这个特点才是Docker容器风靡全球的根本原因。
Web应用服务
持续集成和持续部署
5、为什么用Docker如果说上面两种应用场景还不足以体现出与传统的PaaS平台相比的巨大优势的话,那么对微服务的架构这种复杂又灵活的使用场景的无缝支持绝对具有革命意义
微服务架构将传统分布式服务继续拆分解耦,形成一些更小服务模块,服务模块之间独立部署升级,这些特性与容器的轻量、高效部署不谋而合
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势
Docker 在如下几个方面具有较大的优势:
5.2、高效的部署和扩容Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应用和服务本地容器做开发。可以直接集成到可持续开发流程中
例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间
5.3、更高的资源利用率Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个
Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容或方便的下线的你的应用和服务,这种速度趋近实时。
5.4、更简单的管理Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可
6、Docker优与缺 6.1、优点使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理
6.2、缺点1、更快速的交付和部署
对开发和运维(devops)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间
2、更高效的虚拟化:Docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
4、更简单的管理
5、CPU/内存的低消耗
6、快速开/关机
7、跨云计算基础构架
Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:
1、Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
2、LXC是基于Cgroup等Linux kernel功能的,因此Container的Guest系统只能是Linux base的
3、隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
网络管理相对简单,主要是基于namespace隔离
4、cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
5、docker对disk的管理比较有限
6、container随着用户进程的停止而销毁,container中的log等用户数据不便收集
7、Docker引擎
Docker Engine 是一个开源的容器技术,被用来对你的应用进行容器化构建
Docker Engine 实际上是一个客户端/服务器(Client/Server)应用:
一个在服务器上长期运行的被称为dockerd 的进程
一个指定结构的 APIs,这个 API 被用来与 Docker 守护进程进行通信
一个命令行界面(CLI)客户端docker
命令行界面(CLI)使用 Docker APIs 来控制和与 Docker 来互相作用。这个使用脚本或者 CLI 命令行来进行控制和执行。 其他 Docker 应用使用下层 API 和 CLI 来对 Docker 来进行控制
Docker 守护进程创建和管理 Docker 的对象(objects), 例如 镜像(images),容器(containers),网络(networks),卷(volumes)
Docker Engine 是一个开源的容器技术,被用来对你的应用进行容器化构建
Docker Engine 实际上是一个客户端/服务器(Client/Server)应用:
一个在服务器上长期运行的被称为dockerd 的进程
一个指定结构的 APIs,这个 API 被用来与 Docker 守护进程进行通信
一个命令行界面(CLI)客户端docker
命令行界面(CLI)使用 Docker APIs 来控制和与 Docker 来互相作用。这个使用脚本或者 CLI 命令行来进行控制和执行。 其他 Docker 应用使用下层 API 和 CLI 来对 Docker 来进行控制
Docker 守护进程创建和管理 Docker 的对象(objects), 例如 镜像(images),容器(containers),网络(networks),卷(volumes)
8、Docker架构
Docker使用C/S体系的架构,Docker客户端与Docker守护进程通信,Docker守护进程负责构建,运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API通过unix套接字或网络接口进行通信
Docker Daemon(Docker 守护进程)
Docker守护进程(程序)侦听Docker API请求并管理Dockerobjects,如图像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理Docker服务
Docker Client(Docker 客户)
Docker客户端(码头工人)是许多Docker用户与Docker交互的主要方式。比如我们可以通过docker run 命令来运行一个容器,然后我们的docker client会把命令发送给上面的Dockerd,主它来负责处理。Docker客户端可以与多个守护进程通信。
Docker Repository(Docker 仓库)
用来存储Docker镜像的仓库,Docker hub是官方提供的一个公共仓库,而且Docker默认也是从Docker Hub上查找镜像的。当然你也可以很方便的运行一个私有仓库,当我们使用docker pull或者docker run命令时,就会从我们配置的docker镜像仓库中去拉取镜像,使用docker push时,会将我们构建的镜像推送到对应的镜像仓库中
Docker Desktop(Docker 桌面)
Docker Desktop是一个适用于Mac或Windows环境的易于安装的应用程序,使您能够构建和共享容器化的应用程序和微服务。Docker桌面包括Docker守护程序(程序),Docker客户端(码头工人),Docker编写,Docker内容信任,Kubernetes和凭据帮助器
Docker objects (Docker 对象)
创建和使用图像、容器、网络、卷、插件和其他对象
Docker使用C/S体系的架构,Docker客户端与Docker守护进程通信,Docker守护进程负责构建,运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API通过unix套接字或网络接口进行通信
Docker守护进程(程序)侦听Docker API请求并管理Dockerobjects,如图像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理Docker服务
Docker Client(Docker 客户)
Docker客户端(码头工人)是许多Docker用户与Docker交互的主要方式。比如我们可以通过docker run 命令来运行一个容器,然后我们的docker client会把命令发送给上面的Dockerd,主它来负责处理。Docker客户端可以与多个守护进程通信。
Docker Repository(Docker 仓库)
用来存储Docker镜像的仓库,Docker hub是官方提供的一个公共仓库,而且Docker默认也是从Docker Hub上查找镜像的。当然你也可以很方便的运行一个私有仓库,当我们使用docker pull或者docker run命令时,就会从我们配置的docker镜像仓库中去拉取镜像,使用docker push时,会将我们构建的镜像推送到对应的镜像仓库中
Docker Desktop(Docker 桌面)
Docker Desktop是一个适用于Mac或Windows环境的易于安装的应用程序,使您能够构建和共享容器化的应用程序和微服务。Docker桌面包括Docker守护程序(程序),Docker客户端(码头工人),Docker编写,Docker内容信任,Kubernetes和凭据帮助器
Docker objects (Docker 对象)
创建和使用图像、容器、网络、卷、插件和其他对象
Docker客户端(码头工人)是许多Docker用户与Docker交互的主要方式。比如我们可以通过docker run 命令来运行一个容器,然后我们的docker client会把命令发送给上面的Dockerd,主它来负责处理。Docker客户端可以与多个守护进程通信。
用来存储Docker镜像的仓库,Docker hub是官方提供的一个公共仓库,而且Docker默认也是从Docker Hub上查找镜像的。当然你也可以很方便的运行一个私有仓库,当我们使用docker pull或者docker run命令时,就会从我们配置的docker镜像仓库中去拉取镜像,使用docker push时,会将我们构建的镜像推送到对应的镜像仓库中
Docker Desktop是一个适用于Mac或Windows环境的易于安装的应用程序,使您能够构建和共享容器化的应用程序和微服务。Docker桌面包括Docker守护程序(程序),Docker客户端(码头工人),Docker编写,Docker内容信任,Kubernetes和凭据帮助器
Docker objects (Docker 对象)
创建和使用图像、容器、网络、卷、插件和其他对象
创建和使用图像、容器、网络、卷、插件和其他对象
Docker Images(Docker 镜像)
镜像是只读模板,包含创建Docker容器的说明。通常,一个镜像会基于另外的一些基础镜像构建并加上一些额外的自定义功能,并进行了一些额外的定制。例如,您可以构建一个基于centos镜像,然后在这个基础镜像上面安装一个 Apache web服务器和应用程序,这样就可以构建成属于我们自己的镜像了
Docker Container(Docker 容器)
容器是独立运行的一个或一组应用,是镜像运行时的实体。可以使用Docker REST API或者CLI创建、启动、停止、移动或删除容器。容器的实质是进程,但与直接在宿主机执行的进程不同,容器进行运行于属于自己独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户id空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像在一个独立于宿主的系统下操作一样
Docker Host(Docker 主机)
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器
Docker 三个基本概念
Docker运行流程镜像(Image):Docker 镜像 只读
容器(Container):镜像和容器的关系 可读可写
仓库(Repository):Docker 仓库
二、安装Docker 1、 版本说明当我们想运行一个容器的时候,docker会:
1、拉取镜像,若本地已经存在该镜像,则不用到网上去拉取
2、创建新的容器
3、分配union文件系统并且挂着一个可读写的层,任何修改容器的操作都会被记录在这个读写层上,你可以保存这些修改成新的镜像,也可以选择不保存,那么下次运行改镜像的时候所有修改操作都会被消除
4、分配网络桥接接口,创建一个允许容器与本地主机通信的网络接口
5、设置ip地址,从池中寻找一个可用的ip地址附加到容器上,换句话说,localhost并不能访问到容器
6、运行你指定的程序
7、捕获并且提供应用输出,包括输入、输出、报错信息
Docker-CE指Docker社区版,由社区维护和提供技术支持,为免费版本,适合个人开发人员和小团队使用
Docker-EE指Docker企业版,为收费版本,由售后团队和技术团队提供技术支持,专为企业开发和IT团队而设计
相比Docker-EE,增加一些额外功能,更重要的是提供了更安全的保障
此外,Docker的发布版本分为Stable版和Edge版,区别在于前者是按季度发布的稳定版(发布慢),后者是按月发布的边缘版(发布快)
| 系统 | IP | 主机名 |
| CentOS 7.4 | 192.168.2.17 | Docker |
注意:确保服务器可以上网
2、安装阿里云官方安装: docker-ce镜像-docker-ce下载地址-docker-ce安装教程-阿里巴巴开源镜像站
[root@Docker ~]# yum -y install wget ..... [root@Docker ~]# wget -O /etc/yum.repos.d/CentOS-base.repo https://mirrors.aliyun.com/repo/Centos-7.repo .... [root@Docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 #安装依赖 ..... [root@Docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #docker的网络yum源 ........ [root@Docker ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo #替换内容 [root@Docker ~]# yum makecache fast #建立缓存 ..... [root@Docker ~]# yum -y install docker-ce #安装新版本的docker ..... [root@Docker ~]# systemctl start docker [root@Docker ~]# systemctl enable docker
例:安装旧版本如下(这里安装新版本)
[root@Docker ~]# yum list docker-ce.x86_64 --showduplicates | sort -r #查看所有版本 已加载插件:fastestmirror 已安装的软件包 可安装的软件包 * updates: mirrors.aliyun.com Loading mirror speeds from cached hostfile * extras: mirrors.aliyun.com docker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stable docker-ce.x86_64 3:20.10.8-3.el7 docker-ce-stable docker-ce.x86_64 3:20.10.7-3.el7 docker-ce-stable ..... [root@Docker ~]# yum -y install docker-ce-17.09.0.ce-1.el7.centos #安装旧版本 ....
3、docker配置文件说明
在docker-ce中,已废弃/etc/sysconfig/docker这种配置方式,转而采用/etc/docker/key.json
将docker的下载镜像的仓库,修改为国内的阿里镜像仓库
在docker-ce中,已废弃/etc/sysconfig/docker这种配置方式,转而采用/etc/docker/key.json
将docker的下载镜像的仓库,修改为国内的阿里镜像仓库
先登录阿里云控制台:阿里云-上云就上阿里云
每个人的镜像都不一样
[root@Docker ~]# vim /etc/docker/key.json "crv":"P-256","d":"zqohLs5cZ6_gjR-TA9xrHWKJk3D0uZRfNQw1bZIrO3c","kid":"HAVX:RJQY:GHIF:BNAR:XHCS:EV2Y:57UP:XCH5:POPA:CU5W:XITI:PGVL","kty":"EC","x":"IaELJnTCdJhqB6xjdy31y15tHkI8IUTOwyvAmPYnf7I","y":"oNJLINYEcC763iIAnO0JkNqmZEiOf18nwJQMZXNw0S0","registry-mirrors": ["https://2ycqmdil.mirror.aliyuncs.com"]} 保存 加入到最后注意要加逗号隔开,"registry-mirrors": ["https://2ycqmdil.mirror.aliyuncs.com"] 设置完后重启 [root@Docker ~]# systemctl restart docker
到此Docker安装完成



