Docker简介:
简单来说,Docker镜像是一个配置好了所需环境的操作系统,我们在自己的电脑上运行一个docker容器,相当于开启了一个新的操作系统。比如说,如果我们在一台windows系统的电脑上运行一个安装了ubuntu系统的docker镜像,就意味着我们可以进入一台ubuntu系统的电脑进行操作。
Docker组成
一个完整的Docker有以下几个部分组成:
- DockerClient客户端
- Docker Daemon守护进程
- Docker Image镜像
- DockerContainer容器
Docker架构:
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
| Docker | 面向对象 |
|---|---|
| 容器 | 对象 |
| 镜像 | 类 |
- Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
- Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
Docker典型场景
在docker的网站上提到了docker的典型场景:
-
Automating the packaging and deployment of applications(使应用的打包与部署自动化)
-
Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
-
Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
-
Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku), 构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。
- 构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题。
- PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其作为PaaS产品的环境基础
- 因为其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来
- 因为LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源
Docker的好处:
环境隔离:Docker镜像就像一个个的集装箱,我们每一个“集装箱”里面运行的“系统环境”都是不一样的,而且也是互不干扰的。举个例子,其中一个“集装箱”内运行的是基于“UBUNTU”系统内核的开发环境,另一个“集装箱”内运行的是基于“CENTOS”系统内核的生产环境,然而这两个“集装箱”都可以运行在同一个“平台”上,无论这个“平台”是WINDOWS 还是 LINUX。
迁移方便: Docker将应用所需内容全部打包到一个容器中,然后在虚拟机、服务器或云之间迁移该容器,而无需重构应用。
Docker局限性:
-
Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
-
LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
-
隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
-
网络管理相对简单,主要是基于namespace隔离
-
container随着用户进程的停止而销毁,container中的log等用户数据不便收集
Docker对disk的管理比较有限
Docker并非适合所有应用场景,Docker只能虚拟基于Linux的服务。
Windows Azure 服务能够运行Docker实例,但到目前为止Windows服务还不能被虚拟化。可能最大的障碍在于管理实例之间的交互。由于所有应用组件被拆分到不同的容器中,所有的服务器需要以一致的方式彼此通信。这意味着任何人如果选择复杂的基础设施,那么必须掌握应用编程接口管理以及集群工具,比如Swarm、Mesos或者Kubernets以确保机器按照预期运转并支持故障切换。
Docker在本质上是一个附加系统。使用文件系统的不同层构建一个应用是有可能的。每个组件被添加到之前已经创建的组件之上,可以比作为一个文件系统更明智。分层架构带来另一方面的效率提升,当你重建存在变化的Docker镜像时,不需要重建整个Docker镜像,只需要重建变化的部分。
可能更为重要的是,Docker旨在用于弹性计算。每个Docker实例的运营生命周期有限,实例数量根据需求增减。在一个管理适度的系统中,这些实例生而平等,不再需要时便各自消亡了。
针对Docker环境存在的不足,意味着在开始部署Docker前需要考虑如下几个问题。首先,Docker实例是无状态的。这意味着它们不应该承载任何交易数据,所有数据应该保存在数据库服务器中。
其次,开发Docker实例并不像创建一台虚拟机、添加应用然后克隆那样简单。为成功创建并使用Docker基础设施,管理员需要对系统管理的各个方面有一个全面的理解,包括Linux管理、编排及配置工具比如Puppet、Chef以及Salt。这些工具生来就基于命令行以及脚本。
比较图:


Docker Hub(Docker 公共仓库):
- Docker用Registry来保存用户构建的镜像。
- Registry分为公有和私有。
- Docker公司运营的公共Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像。
- Ucloud提供了一个免费的公共镜像库服务:Uhub
- UHub可以让用户自由创建和管理镜像库
Docker镜像的命名规则:
- Docker镜像是按照hub/registry/name:tag的规则进行命名的
- 其中hub即为我们存储docker镜像使用的docker hub
- Registry是我们在docker hub中建立的仓库
- Name是镜像名称
- Tag是镜像的标签
在Ucloud的Uhub中,hub内网地址为uhub.service.ucloud.cn | 公网地址为uhub.ucloud.cn
你可以在uhub中建立自己的镜像仓库,并为其命名
Docker的存储:
-
Docker 镜像实际上由一层一层的文件系统组成,每一个layer都有其大小和ID,我们可以来看一个Ubuntu系统的镜像。
-
由4个layer组成,是只读的

镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。如果我们要基于这个ubuntu镜像生成新的镜像,也就是在这个ubuntu镜像上面添加新的层。 -
多个镜像可以共享低层layer
例:本机有一个ubuntu:15.04的镜像,用户基于该镜像做了修改,如下图,新的镜像的低层会直接引用ubuntu15.04的镜像。通过镜像共享的方式,可以减少本机存储空间,加快pull和push的速度。

Docker镜像与容器:

Docker镜像是用于创建容器的模板,基于一个Docker镜像可以创建许多个容器,每个容器之间相互独立。在容器中进行的修改不会对镜像产生影响。容器可以运行、停止和退出。
Docker容器的使用(映射外部端口)
使用 docker -p 就可以实现本服务器与容器之间的映射,从而实现外部网络对容器的访问
Docker的网络模式:
使用docker run启动容器时,可以通过 -p 参数设置本机端口与容器端口的映射。例如: docker run -p 3306:3306 mysql、
建立自己的Docker镜像,使用Dockerfile文件进行打包
- 每一个命令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写
- FROM 指定使用的基础镜像
- EXPOSE 用来指定容器端口,使容器内的应用可以通过端口和外界交互
- RUN 接受命令作为参数并用于创建镜像
- ADD 将本地的./test/文件内容(相对路径)添加到镜像/data/下
- ENV 定义镜像的环境变量
- CMD 用于执行特定的命令,在镜像构建容器后被调用
1277

被折叠的 条评论
为什么被折叠?



