Docker学习笔记

1. docker是什么

docker核心功能是镜像(容器)管理,容器是应用的打包,包含了应用执行所依赖的数据(包括lib,配置文件等等),实现快速开发和部署应用。

之前也有可以提供镜像管理的产品,如vagrant。

Vagrant并不提供虚拟化技术,本质上是一个虚拟机外挂,通过虚拟机的管理接口来管理虚拟机,让用户更轻松的进行一些常用配置,比如:CPU/Memory/IP/DISK等分配。并且提供了一些其它的管理操作:比如开机运行指定命令,镜像二次打包,插件编写等等。

docker是一个容器引擎,每一个实例是一个相对隔离的空间,与宿主机共享操作系统内核,并且共享宿主机资源。相对于披着虚拟机皮的vagrant,docker相对虚拟机更加轻量,消耗更少的资源。虚拟化只是docker运行镜像的一个环节。贴一张docker官方介绍图。

这里写图片描述

Vagrant是设计用来管理虚拟机的(操作系统级别镜像),是对传统虚拟机的一层封装,使用puppet和/或chef管理,用来自动调配多个虚拟机,能让你更方便的使用虚拟机,但依赖第三方虚拟化(VirtualBox、VMware fusion,甚至amazon-ec2,最近支持了docker),主要解决的是开发,测试和运维一整套流程相关的问题。

Docker是设计用来管理应用的(应用级别镜像),是基于lxc的虚拟化的容器技术,虚拟化只是docker运行镜像的一个环节,解决了同一机器上的环境隔离,以及提高部署时环境依赖的效率。

两者解决的问题有些相像,但是解决的方案不是在一个层次上的。对于开发环境来说,vagrant是一种更为抽象,更为通用的解决方案。Docker所能提供的场景只是vagrant所支持的特殊场景之一。

2. 框架

Docker使用client-server架构模式,如下图。用户不直接和DOCKER_HOST交互,而是通过Client用户接口接收用户指令,然后和DOCKER_HOST的Daemon通信。Docker daemon会处理复杂繁重的任务,例如建立、运行、发布你的Docker容器。

这里写图片描述

Docker内部主要有三种资源:

● images
● registries
● containers

Docker image是一个只读模板,包含了操作系统以及可运行的应用。镜像是用来创建容器的,是Docker的 构建 部分。

Docker registry是镜像仓库。是Docker的 分发 部分。

Docker contatiner类似文件夹,包含了应用运行所需要的所有环境。每一个容器都是一个独立和安全的应用平台,可以运行、开始、停止、移动和删除,是Docker的 运行 部分。

3. 工作原理

3.1 镜像工作原理

Docker镜像是Docker容器运行时的只读模板。每一个镜像由一系列的层(layers)组成。Docker使用UnionFS来将这些层联合到一个镜像中。Union文件系统允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。

修改一个Docker镜像,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级。分层使得分发Docker镜像变得简单和快速。

每个镜像都是从一个基础的镜像开始的,在这些基础镜像上,Docker镜像通过指令(一种简单、具有描述性的步骤)进行创建,每个指令在镜像中创建新的层,指令可以包含这些动作:

  • 运行一个命令。
  • 增加文件或者文件夹。
  • 创建一个环境变量。
  • 当运行容器的时候哪些程序会运行。

这些指令存储在Dockerfile文件中。当你需要建立镜像的时候,Docker可以从Dockerfile中读取这些指令并且运行,然后返回一个最终的镜像。

3.2 仓库工作原理

仓库用于存储镜像。

3.3 容器工作原理

一个Docker容器包含了一个操作系统、用户添加的文件和元数据(meta-data)。

我们可以看到,每个容器都是从镜像建立的。镜像告诉 Docker容器内包含了什么,当容器启动时运行什么程序,还有许多配置数据。

Docker镜像是只读的。当Docker运行一个从镜像建立的容器,它会 在镜像顶部添加一个可读写的层,应用程序可以在这里运行。

4. 容器运行

使用docker指令系统运行容器:

$ docker run -i -t ubuntu /bin/bash

Docker客户端使用docker命令来运行,run参数表明客户端要运行一个新的容器。Docker客户端运行一个容器至少需要告诉Docker守护进程以下参数信息:

  • 这个容器从哪个镜像创建,这里是ubuntu,基础的Ubuntu镜像。
  • 在容器中要运行的命令,这里是/bin/bash,在容器中运行Bash shell。

命令运行后,docker按顺序执行:

  • 拉取ubuntu镜像:Docker检查ubuntu镜像是否存在,如果在本地没有该镜像,Docker会从Docker Hub下载。如果镜像已经存在,Docker会使用它来创建新的容器。
  • 创建新的容器:当Docker有了这个镜像之后,Docker会用它来创建一个新的容器。
  • 分配文件系统并且挂载一个可读写的层:容器会在这个文件系统中创建,并且一个可读写的层被添加到镜像中。
  • 分配网络/桥接接口:创建一个允许容器与本地主机通信的网络接口。
  • 设置一个IP地址:从池中寻找一个可用的IP地址并且服加到容器上。
  • 运行你指定的程序:运行指定的程序。
  • 捕获并且提供应用输出:连接并且记录标准输出、输入和错误让你可以看到你的程序是如何运行的。

现在拥有了一个运行着的容器!从这里开始你可以管理你的容器,与应用交互,应用完成之后,可以停止或者删除你的容器。

5. 底层技术

Docker使用Go语言编写,并且使用了一系列Linux内核提供的性能来实现我们已经看到的这些功能。

5.1 命名空间(Namespaces)

Docker充分利用了一项称为namespaces的技术来提供隔离的工作空间,我们称之为 container(容器)。当你运行一个容器的时候,Docker为该容器创建了一个命名空间集合。

这样提供了一个隔离层,每一个应用在它们自己的命名空间中运行而且不会访问到命名空间之外。

一些Docker使用到的命名空间有:

  • pid命名空间: 使用在进程隔离(PID: Process ID)。
  • net命名空间: 使用在管理网络接口(NET: Networking)。
  • ipc命名空间: 使用在管理进程间通信资源 (IPC: InterProcess Communication)。
  • mnt命名空间: 使用在管理挂载点 (MNT: Mount)。
  • uts命名空间: 使用在隔离内核和版本标识 (UTS: Unix Timesharing System)。

5.2 群组控制

Docker还使用到了cgroups技术来管理群组。使应用隔离运行的关键是让它们只使用你想要的资源。这样可以确保在机器上运行的容器都是良民(good multi-tenant citizens)。群组控制允许Docker分享或者限制容器使用硬件资源。例如,限制指定的容器的内容使用。

5.3 联合文件系统

联合文件系统(UnionFS)是用来操作创建层的,使它们轻巧快速。Docker使用UnionFS提供容器的构造块。Docker可以使用很多种类的UnionFS包括AUFS, btrfs, vfs, and DeviceMapper。

5.4 容器格式

Docker连接这些组建到一个包装中,称为一个 container format(容器格式)。默认的容器格式是libcontainer。Docker同样支持传统的Linux容器使用LXC。在未来,Docker也许会支持其它的容器格式,例如与BSD Jails 或 Solaris Zone集成。

6. 命令

这里写图片描述

docker命令总的来说分为以下几种:

  • 容器生命周期管理

    docker [ run | start | stop | restart | kill | rm | pause | unpause ]
    
  • 容器操作运维

    docker [ ps | inspect | top | attach | events | logs | wait | export | port ]
    
  • 容器rootfs命令

    docker [ commit | cp | diff ]
    
  • 镜像仓库

    docker [ login | pull | push | search ]
    
  • 本地镜像管理

    docker [ images | rmi | tag | build | history | save | import ]
    

    示例:

    docker images # 列出机器上的镜像
    
  • 环境信息相关

    docker [ info | version ]
    

7. 管理数据

docker管理数据有两种方法:数据卷和数据卷容器

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,直到没有容器使用 *数据卷的使用,类似于 Linux 下对目录或文件进行 mount

创建数据卷

在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。

下面创建一个 web 容器,并加载一个数据卷到容器的 /webapp 目录。

sudo docker run -d -P --name web -v /webapp training/webapp python app.py

参考文献

  1. Get started with Docker
  2. 7 步精简 Docker 镜像几百MB(上)
  3. 深入了解Docker存储驱动
  4. Docker生态系统 – 常规组件简介
  5. Docker是什么 Docker定义解释
  6. Linux vs Windows 容器:有什么区别?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值