Docker学习笔记(一)

yinshidaoshi · · 970 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

**1**.什么是Docker,跟传统虚拟机的不同之处,为什么使用Docker。 Docker基于Linux内核的cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其他隔离的进程,也被称为容器。 docker在容器的基础上进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大简化了容器的创建和维护,使得与传统虚拟机技术相比更加轻便快捷。 与传统虚拟机技术相比,传统虚拟机技术是虚拟一套硬件,在上面运行一个完整的操作系统,再在操作系统上运行所需应用进程;而容器的应用进程运行于宿主内核,容器内没有自己的内核,也没有虚拟硬件,因此,Docker要比传统虚拟机技术更加轻便。 ![image.png](https://static.studygolang.com/180117/a60b79e5d3037508641d071ee0f7ad80.png) **传统虚拟机技术** ![image.png](https://static.studygolang.com/180117/99a8cfda8563e052bc1a546ad83d5414.png) **Docker** **使用Docker的理由** 1.更高效地利用系统资源 2.更快的启动时间(秒级) 3.一致的运行环境,避免出现“这段代码在我电脑上执行没问题”这种状况 4.持续交付和部署 对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。 而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。 5.更轻松的迁徙 由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。 6.更轻松的维护扩展 Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。 **日常一图顶千言** ![image.png](https://static.studygolang.com/180117/2c39f7bfd2e42e466b7211dfc0edcb47.png) **2**Docker中的基本概念 **镜像**是一个特殊的文件系统,除了包含容器运行所必需的程序、库、资源、配置等文件,还包含一些为运行时准备的配置参数,镜像不包含任何动态数据,构建后也不会改变。 分层存储 因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。 **容器** Docker中镜像和容器的关系类似于“类”和“实例”,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停。 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。 与镜像相同,容器使用的也是分层存储,每一个容器运行时都以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个是,为容器运行时读写而准备的存储层,也叫容器存储层。 容器存储器生命周期与容器相同,容器消亡时,容器存储器也会消失,任何保存在容器存储层的数据都会随容器的删除而丢失。 按照docker最佳实践要求,容器不应该向存储器内写入任何数据,容器存储层应该保持无状态化,所有的文件写入都应该使用数据卷,或绑定宿主目录,在这些位置读写,会跳过网络存储层,直接对宿主或网络存储发生读写,其性能和稳定性更高。 数据卷的生存周期独立于容器,容器消亡后数据卷不会消失,因此,使用数据卷,容器删除后或重新运行后数据不会消失。 **仓库** 镜像构建完成后可以很方便地在宿主机上运行,如果要在其他服务器上运行,我们就需要一个服务,这个服务可以集中地分发存储镜像,Docker Registry 就是这样的服务。 Registry可以包含多个仓库(即Repository),一个仓库可以包含多个tag,每个tag对应一个镜像,通常来说,一个仓库会包含一个软件的多个版本,一个tag对应一个镜像的版本,我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。举例说明: 以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。我们可以通过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest 仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。 **Docker Registry公开服务**:是开放给用户使用、允许用户管理镜像的registry服务,一般这类服务都会允许用户免费上传、下载公开的镜像,提供收费服务帮助用户管理私有镜像,最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。 **私有 Docker Registry**:用户可以搭建私有Registry,开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

970 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传