Docker容器基础

什么是Docker

简介

         Docker是 PaaS 提供商dotCloud开源的一个基于 LXC 的高级容器引擎,基于GO语言并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

Docker架构

Docker是CS架构,主要由下面三部分组成:

  • Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互
  • Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon
  • Docker hub/registry: 共享和管理Docker镜像,用户可以上传或者下载上面的镜像

Docker的主要特性

文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。

Docker vs VM

VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。

Docker组件

  •  Docker image(镜像)

镜像是只读的,镜像中包含有需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。

  • Docker container(容器)

容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。

  •  repository(仓库)

                仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库又分为:

            公开仓库
                  docker团队控制的top-level的顶级repository,即Docker Hub,存放了数量庞大的镜像供用户下载,任何人都能读取,里面包含了许多常用的镜像。
           私有仓库
                  用户也可以在本地网络内创建一个私有仓库。

Docker镜像是如何工作的?

Docker镜像是由文件系统叠加而成。最底端是一个引导文件系统。在Docker里,root文件系统永远只能是只读状态,并且Docker利用联合加载(union mount)技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。

Docker将这样的文件系统称为镜像。一个镜像可以放到另一个镜像的顶部。位于下面的镜像称为父镜像(parent image),可以依次类推,直到镜像栈的最底部,最底部的镜像称为基础镜像(base image)。当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。比如,如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏。通常这种机制被称为写时复制(copy on write)每个只读镜像层都是只读的,并且以后永远不会变化。通常这种机制被称为写时复制(copy on write)

Docker容器是怎样工作的?

当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器。

运行一个容器的内部过程

docker client告诉docker daemon运行一个容器,例如:docker run -i -t ubuntu /bin/bash
让我们分解一下这个命令,docker client启动使用docker命令,docker client告诉docker daemon你的容器是从哪个docker镜像构建的,你希望在容器内部运行哪个命令。所以启动过程如下:

1.docker检查是否存在ubuntu镜像,如果本地不存在ubuntu镜像,则docker会到docker index下载。
2.利用镜像创建容器
3.为镜像创建文件系统层和read-write层
4.为容器创建网络接口,使容器和本地机器可以通讯
5.在地址池中为容器分配一个可用的IP地址
6.运行你的应用
7.连接log的标准输入、输出、错误,以使你直到你的应用是否正常运行

 

猜你喜欢

转载自blog.csdn.net/yuanfangPOET/article/details/88622571