虚拟化容许在同一硬件上运行两个彻底不一样的操做系统,每一个客户操做系统都经历了引导,加载内核等全部过程。能够拥有很是严格的安全性!git
能够基于虚拟化方法如何模仿客户操做系统的硬件并模拟客户操做环境来对虚拟化方法进行分类。docker
主要有三种类型的虚拟化:shell
- 仿真;
- 半虚拟化;
- 基于容器的虚拟化;
docker不是虚拟化方法,它依赖与实际实现基于容器的虚拟化或操做系统及虚拟化的其余工具。为此,docker最初使用LXC驱动程序,而后移动到libcontainer如今重命名为runc。Docker主要专一于在应用程序容器内自动部署应用程序。应用程序容器旨在打包和运行单个服务,而系统容器则设计为运行多个进程,如虚拟机。所以,Docker被视为容器化系统上的容器管理或应用程序部署工具。编程
主要表如今如下几个方面:安全
- 与虚拟机不一样,容器不须要引导操做系统内核,所以能够在不到一秒的时间内建立容器。此功能使基于容器的虚拟化比其余虚拟化方法更加独特和可取;
- 因为基于容器的虚拟化为主机增长了不多或没有开销,所以基于容器的虚拟化具备接近本机的性能;
- 对于基于容器的虚拟化,与其余虚拟化不一样,不须要其余软件;
- 主机上的全部容器共享主机的调度程序,从而节省了额外资源的需求;
- 与虚拟机映像相比,容器状态(Docker或LXC映像)的大小很小,所以容器映像很容易分发;
- 容器中的资源管理是经过cgroup实现的。Cgroups不容许容器消耗比分配给它们更多的资源。虽然主机的全部资源都在虚拟机中可见,但没法使用。这能够经过在容器和主机上同时运行top或htop来实现。全部环境的输出看起来都很类似;
CI功能就是在每次提交以后不断地集成全部提交到存储库的代码,并编译检查错误。服务器
每一个容器都是在本身的名命空间中运行,但使用与全部其余容器彻底相同的内核。发生隔离是由于内核知道分配给进程的命名空间,而且在API调用期间确保进程只能访问其本身的命名空间中的资源。网络
docker镜像是docker容器的源代码,Docker镜像用于建立容器。架构
Docker容器包括应用程序及其全部依赖项,但与其余容器共享内核,做为主机操做系统上用户空间中的独立进程运行。Docker容器不依赖于任何特定的基础架构:它们能够在任何计算机,任何基础架构和任何云中运行。ide
Docker容器能够有四种状态:工具
- 运行;
- 已暂停;
- 从新启动;
- 已退出;
能够经过运行“docker ps –a”命令来识别Docker容器的状态,这将依次列出全部可用的docker容器及其在主机上的相应状态。
- 1)FROM:构建镜像基于哪一个镜像;
- 2)MAINTAINER:镜像维护者姓名或邮箱地址;
- 3)RUN:构建镜像时运行的shell指令;
- 4)CMD:运行容器时执行的shell环境;
- 5)EXPOSE:声明容器的服务端口(仅仅是声明);
- 6)ENV:设置容器环境变量;
- 7)ADD:拷贝文件或目录到容器中,若是是URL或压缩包便会自动下载或自动解压;
- 8)COPY:拷贝文件或目录到容器中,跟ADD相似,但不具有自动下载或解压的功能;
- 9)ENTRYPOINT:运行容器时执行的shell命令;
- 10)VOLUME:指定容器挂载点到宿主机自动生成的目录或其余容器;
- 11)USER:为RUN、CMD、和ENTRYPOINT执行命令指定运行用户;
- 12)WORKDIR:为RUN、CMD、ENTRYPOINT、COPY和ADD设置工做目录,意思为切换目录;
- 13)HEALTHCHECH:健康检查;
- 14)ARG:构建时指定的一些参数;
- 15)LABEL:咱们使用LABEL按照项目,模块,许可等组织咱们的镜像。咱们也可使用LABEL来帮助实现自动化。在LABEL中,咱们指定一个键值对,之后可用于以编程方式处理Dockerfile;
注意:
(1)RUN在building时运行,能够写多条;
(2)CMD和ENTRYPOINT在运行container时,只能写一条,若是写多条,最后一条生效;
(3)CMD在构建容器时能够被COMMAND覆盖,ENTRYPOINT不会被COMMAND覆盖,但能够指定——entrypoint覆盖;
(4)若是在Dockerfile文件中须要往镜像中导入文件,则该文件必须在Dockerfile所在目录或子目录中;
(5)每一个目录下最好就只有一个Dockerfile,若是有多个Dockerfile文件时,使用Dockerfile生成镜像时便须要使用“-f”来指定具体的Dockerfile文件;
(6)指令必须所有为大写;
(7)使用Dockerfile生成镜像时,保证Dockerfile中所需的软件、文件与Dockerfile在同一个目录下;
当镜像用做另外一个镜像构建的基础是,ONBUILD指令向镜像添加将在稍后执行的触发指令。若是要构建其余镜像的基础的镜像(例如,可使用特定于用户的配置自定义的应用程序构建环境或守护程序),这将很是有用。
重要的是,每一个层只是与以前一层的一组差别层(相同的就再也不放到锌层中);
docker swarm是Docker的本机群集,它将Docker主机池转变为单个虚拟Docker主机。Docker swarm提供标准的Docker API,任何已经与Docker守护进程通讯的工具均可以使用Swarm透明地扩展到多个主机。
能够进行如下更改:
所以,但愿定义一个额外的Compose文件,它指定适合生产的配置。此配置文件只须要包含您要从原始Compose文件中进行的更改。
docker默认状况下,有五种网络模式:
- host模式:直接使用docker宿主机的I网络。如IP地址、网卡类型等;
- none模式:不会给容器进行任何网络配置。也就是说,使用这种模式的容器没有IP地址(只有一个回环地址);
- bridge模式:docker默认的网络配置,此模式会为每个容器分配名称空间,能够设置IP,可是要与docker host主机的虚拟网络在同一网段;经过虚拟网卡与外界通讯;
- container模式:这种模式与已经存在的容器共有同一个IP地址;
- Network:自定义网络。能够自行建立而且能够注定多种网络驱动,如bridge、overlay等;
跨主机通讯的两种解决方案:
overlay网络:使用这种方法,须要事先建立一个consul服务,将须要跨主机通讯的docker host加入到同一个consul集群中,而后再建立一个overlay类型的自定义网络。因为其网卡做用因而全局的,因此基于此网卡类型建立的容器就能够正常通讯;
若是使用macvlan网络的方式,须要如下步骤:
- 首先要保证须要跨主机通讯的docker hos是能够正常通讯的;
- 两台docker host建立的虚拟网卡是在同一网段;
- 而后两台docker host基于虚拟网卡建立macvlan类型的网卡;
- 经过macvlan网络类型建立的容器便可通讯;
docker实现数据持久化的方式:
建立容器时,使用“-v”选项,将本地的目录挂载到容器中。采用这种方式容器的挂载类型为bind!
Bind mount的特色:
- Data Volume是目录或文件,不能是没有格式化的磁盘(块设备);
- 容器能够读写volume中的数据;
- 随源文件变化而变化;
- volume数据能够永久保存,即便使用它的容器已经被销毁;
注意:
建立容器时,使用“-v“选项,只指定容器中的目录便可!采用这种方式容器的挂载类型为volume;
特色:
采用这种方式,即事先建立一个容器,专用于挂载本地的目录,而后建立容器时,使用“--volumes-from”指定挂载本地目录的容器便可(这种模式是将本来容器中挂载的全部目录都挂载到新建立的容器中)!
这种方式也是提供bind mount模式和manager volume模式!
—————————————————————未完待续!!!—————————————————————