docker补充

Docker最初是dotcloud 公司创始人Solomon Hykes 在法国期间发起的一个公司内部的项目,在2013年3月1以Apache 2.0授权协议开源,主要项目代码在GiHub 上进行维护,Docker 项目后来还加入了Linux 基金会,并成立推动开放容器联盟。

Docker 使用的是Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其他的隔离的进程,因此也称其为容器。

跟普通虚拟机进行比较,传统的虚拟机技术在虚拟出一套硬件后,在其上运行一个完整的操作系统,在该系统上面再运行所需要的进程,而容器内核的应用进程直接运行于宿主机的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更为轻便。

在使用Docker 包括三个基本的概念,镜像,容器,仓库,该三个概念就是Docker的整个生命周期。

Docker 引擎是一个包含以下主要组件的客户端服务器应用程序,一种服务器,它是一种称为守护进程并且长时间运行的程序,REST API 用于指定程序可以用来与守护进程通信的接口,并指示它做什么,还是一个有命令行界面工具的客户端。

在使用docker的时候,我们需要知道Docker的架构,Docker使用客户端 - 服务器 (c/s)架构模式,使用远程的api 来管理和创建Docker容器,Docker 容器通过docker 镜像来创建。在docker中,docker容器和镜像的关系类似于对象和类的关系

镜像(images) docker 镜像 是用于创建docker容器的模版

容器(container) 容器是独立运行的一个或一组应用

客户端(client )Docker 客户端通过命令行或者其他工具使用Docker API,便可于Docker 的守护进程进行通信

主机(Host)一个物理或者虚拟机的机器用于执行Docker 守护进程和容器

仓库 (Registry) Docker 仓库用于保存镜像,可以理解为代码控制中的代码仓库,Docker Hub 提供了大量的Docker 镜像集合提供使用

Docker Machine Docker Machine 是一个简化Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker 的 分层存储(重点)

 因为镜像包含操作 系统完整的root 文件系统,其提及往往是庞大的,因为在Docker 在设计的时候,就充分利用了Union FS (联合安装)的技术,将其设计分曾存储的架构,所以严格来说,镜像并非是一个像iso那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件组成,或者说,是由多层文件系统联合组成。镜像在构建的时候,会一层层的构建,前一层是后一层的基础(因为镜像是由多个文件组成,只有当基础的文件将上面文件所需要的环境构建成功之后,上层的文件才能构建成功),每一层构建完就不会再发生改变,后一层上的任何改变之后发生在自己的这一层,比如,删除前一层的文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已经删除,但是实际上该文件会一直跟随镜像,因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉,分层存储的特征使得镜像得意复用,定制变的更为容易,甚至可以用之前构建好的镜像作为基础层,然后再进一步添加新的层,以定制自己所需要的内容,构建新的镜像。

Docker 容器

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行在属于自己的独立的 命名空间 , 因此容器可以拥有自己的 root 文件系统,自己的网络配置,自己的进程空间,甚至自己的ID 空间,容器内的进程是运行在一个隔离的环境里的,使用起来没,就好像是在一个独立与宿主机的系统操做一样,这种特性使得容器封装的应用比直接在宿主机运行更加安全(沙箱机制)。

前面讲解的镜像是使用的分层存储,容器也是如此,每一个容器运行的时候,是以镜像为基础,在其上创建一个当前容器的存储层,我们可以称为这个为容器运行时读写为准备的存储层为容器存储层。

容器存储层的生存周期和容器一样,当容器消亡时,容器存储层也随之消亡,因此,任何个保存与容器存储层的信息的信息都会随着容器的删除而丢失。

按照Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化,所有的文件写入操作,都应该由数据卷(Volume)或者绑定宿主机目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生命周期是独立于容器的,容器的消亡,数据卷不会消亡,因此,使用数据卷后,容器的删除或者重新运行之后,数据切不会丢失(数据卷就是把容器中的目录映射到宿主机上面,在读写的时候,不会将数据保存到容器中,而是直接保存到宿主机上的映射的目录中,当容器消亡,或者删除时,宿主机上映射的文件中的数据并不会消失,当下次容器运行的时候,还是会将对应的文件进行映射,从而不会发生任何改变)

Docker仓库

镜像构建完成之后,可以很容易在当前的宿主机上面运行,但是,如果需要在其他的服务器上面使用这个镜像,我们就需要一个集中的存储,分布镜像的服务,Docker Registry 就是这样的服务,一个Docker Registry 中可以含有多个仓库(Reposutory),每个仓库可以包含多个标签,每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应软件的各个版本,我们可以使用 仓库名 : 标签 的格式来指定具体的软件是那个版本的镜像,如果不给出标签,将以latest 作为默认标签。例如:ubuntu:14.04

仓库名经常以 两段式路径形式出现,比如 jwilder/nginx-proxy 前者往往以为着Docker Registry 多用户环境下的用户名,后者则表示是对应的软件名,但这并非绝对,取决于所使用的Docker Registry 的软件或服务。

共有的Docker Registry 

最常用的就是GItHub ,在使用的时候需要配置一些加速器,来提供下载的速度。

私有的Docker Registry

自己发布的项目大部分都是发布到自己的私有仓库中,可以在本地搭建私有仓库,Docker 官网 提供了 Docker Registry 镜像,可以直接使用作为私有的Registry服务。

重点- 使用DockerFile 定制镜像

镜像的定制实际上就是定制每一层所添加的配置、文件,如果我们可以把每一层的修改、安装、构建、操作的命令都写到一个脚本,用这个脚本来构建、定制镜像。

Dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此,每一条指令的内容,就是描述盖层应当如何让构建。

讲解一下Dockerfile的指令

COPY:拷贝的指令,用于拷贝文件,用法于Linux的用法一致

ADD:跟COPY的用法一致,也是拷贝文件,但是该指令会自动的解压缩到目标路径中去,但是官网不提倡使用该方式,因为该方式没有copy的意思明确,并且add指令会使得镜像构建缓存失效,从而降低镜像的构建速度

CMD:CMD指令的格式和RUN类似,用来执行命令的,但是,在一个Dockerfile文件中,只能有一个CMD指令,该指令一般用于启动程序使用,在实际操作中,一般为CMD ["java" ,"-jar" ,"a.jar","--spring-profiles.active=pord"], 使用。

ENTRYPOINT : 目的是和CMD一样的,都是在指定容器启动的程序以及参数,ENTRYPOINT在运行时也可以代替,不过比CMD要略显繁琐,需要通过docker run 的参数 --entrypoint来指定。

当是定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接的运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令,该指令也可以用来运行 .sh 后缀名的文件。

EVN:用于设置环境变量,无论是后面其他指令,如RUN 还是运行时的应用,都可以直接使用这里定义的环境变量,

  例如:ENV NODE_VERSION 7.2.0 在后面使用的时候,可以直接使用 $NODE_VERSION 进行数据的获取

EXPOSE:该指令用于暴露端口 宿主机端口:容器端口

WORKDIR:用来指定工作目录,因为在创建容器的时候,我们说过,一个容器是由很多层组成的,而且每层之间互不影响,后面的层是在前面基础层的基础上进行操作的,所以在操作每一层的时候,需要将当前目录切换到当前层进行操作,如果不指定,在另外一个层中进行操作是会报错的

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值