1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-20 22:17:09 +08:00
2019-03-25 17:19:36 +08:00

221 lines
16 KiB
Java
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

**本文只是对Docker的概念做了较为详细的介绍并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令**
<!-- TOC -->
- [ 先从认识容器开始](#-先从认识容器开始)
- [1.1 什么是容器?](#11-什么是容器)
- [先来看看容器较为官方的解释](#先来看看容器较为官方的解释)
- [再来看看容器较为通俗的解释](#再来看看容器较为通俗的解释)
- [1.2 图解物理机,虚拟机与容器](#12-图解物理机虚拟机与容器)
- [ 再来谈谈 Docker 的一些概念](#-再来谈谈-docker-的一些概念)
- [2.1 什么是 Docker?](#21-什么是-docker)
- [2.2 Docker 思想](#22-docker-思想)
- [2.3 Docker 容器的特点](#23-docker-容器的特点)
- [2.4 为什么要用 Docker ?](#24-为什么要用-docker-)
- [ 容器 VS 虚拟机](#-容器-vs-虚拟机)
- [3.1 两者对比图](#31-两者对比图)
- [3.2 容器与虚拟机总结](#32-容器与虚拟机总结)
- [3.3 容器与虚拟机两者是可以共存的](#33-容器与虚拟机两者是可以共存的)
- [ Docker基本概念](#-docker基本概念)
- [4.1 镜像(Image):一个特殊的文件系统](#41-镜像image一个特殊的文件系统)
- [4.2 容器(Container):镜像运行时的实体](#42-容器container镜像运行时的实体)
- [4.3仓库(Repository):集中存放镜像文件的地方](#43仓库repository集中存放镜像文件的地方)
- [ 最后谈谈:Build Ship and Run](#-最后谈谈build-ship-and-run)
- [ 总结](#-总结)
<!-- /TOC -->
> **Docker 是世界领先的软件容器平台**所以想要搞懂Docker的概念我们必须先从容器开始说起
## 先从认识容器开始
### 1.1 什么是容器?
#### 先来看看容器较为官方的解释
**一句话概括容器容器就是将软件打包成标准化单元以用于开发交付和部署**
- **容器镜像是轻量的可执行的独立软件包** 包含软件运行所需的所有内容代码运行时环境系统工具系统库和设置
- **容器化软件适用于基于Linux和Windows的应用在任何环境中都能够始终如一地运行**
- **容器赋予了软件独立性** 使其免受外在环境差异例如开发和预演环境的差异的影响从而有助于减少团队间在相同基础设施上运行不同软件时的冲突
#### 再来看看容器较为通俗的解释
**如果需要通俗的描述容器的话我觉得容器就是一个存放东西的地方就像书包可以装各种文具衣柜可以放各种衣服鞋架可以放各种鞋子一样我们现在所说的容器存放的东西可能更偏向于应用比如网站程序甚至是系统环境**
![认识容器](https://user-gold-cdn.xitu.io/2018/6/17/1640cae21c18e404?w=445&h=363&f=png&s=81473)
### 1.2 图解物理机,虚拟机与容器
关于虚拟机与容器的对比在后面会详细介绍到这里只是通过网上的图片加深大家对于物理机虚拟机与容器这三者的理解
**物理机**
![物理机](https://user-gold-cdn.xitu.io/2018/6/18/1641129f0ecdf8ff?w=720&h=353&f=jpeg&s=55729)
**虚拟机**
![虚拟机](https://user-gold-cdn.xitu.io/2018/6/18/164112a72a917f4a?w=720&h=321&f=jpeg&s=43096)
**容器**
![容器](https://user-gold-cdn.xitu.io/2018/6/18/164112ac76e6f693?w=720&h=302&f=jpeg&s=41669)
通过上面这三张抽象图我们可以大概可以通过类比概括出 **容器虚拟化的是操作系统而不是硬件容器之间是共享同一套操作系统资源的虚拟机技术是虚拟出一套硬件后在其上运行一个完整操作系统因此容器的隔离级别会稍低一些**
---
> 相信通过上面的解释大家对于容器这个既陌生又熟悉的概念有了一个初步的认识下面我们就来谈谈Docker的一些概念
## 再来谈谈 Docker 的一些概念
![Docker的一些概念](https://user-gold-cdn.xitu.io/2018/6/18/16410734eb1ed373?w=1566&h=696&f=png&s=294564)
### 2.1 什么是 Docker?
说实话关于Docker是什么并太好说下面我通过四点向你说明Docker到底是个什么东西
- **Docker 是世界领先的软件容器平台**
- **Docker** 使用 Google 公司推出的 **Go 语言** 进行开发实现基于 **Linux 内核** 的cgroupnamespace以及AUFS类的**UnionFS**等技术**对进程进行封装隔离属于操作系统层面的虚拟化技术** 由于隔离的进程独立于宿主和其它的隔离的进
因此也称其为容器**Docke最初实现是基于 LXC.**
- **Docker 能够自动执行重复性任务例如搭建和配置开发环境从而解放了开发人员以便他们专注在真正重要的事情上构建杰出的软件**
- **用户可以方便地创建和使用容器把自己的应用放入容器容器还可以进行版本管理复制分享修改就像管理普通的代码一样**
![什么是Docker](https://user-gold-cdn.xitu.io/2018/6/18/16411c3946dda762?w=971&h=629&f=jpeg&s=56655)
### 2.2 Docker 思想
- **集装箱**
- **标准化** 运输方式 存储方式 API接口
- **隔离**
### 2.3 Docker 容器的特点
- #### 轻量
在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核它们能够迅速启动只需占用很少的计算和内存资源镜像是通过文件系统层进行构造的并共享一些公共文件这样就能尽量降低磁盘用量并能更快地下载镜像
- #### 标准
Docker 容器基于开放式标准能够在所有主流 Linux 版本Microsoft Windows 以及包括 VM裸机服务器和云在内的任何基础设施上运行
- #### 安全
Docker 赋予应用的隔离性不仅限于彼此隔离还独立于底层的基础设施Docker 默认提供最强的隔离因此应用出现问题也只是单个容器的问题而不会波及到整台机器
### 2.4 为什么要用 Docker ?
- **Docker 的镜像提供了除内核外完整的运行时环境确保了应用运行环境一致性从而不会再出现 这段代码在我机器上没问题啊 这类问题一致的运行环境**
- **可以做到秒级甚至毫秒级的启动时间大大的节约了开发测试部署的时间更快速的启动时间**
- **避免公用的服务器资源会容易受到其他用户的影响隔离性**
- **善于处理集中爆发的服务器使用压力弹性伸缩快速扩展**
- **可以很轻易的将在一个平台上运行的应用迁移到另一个平台上而不用担心运行环境的变化导致应用无法正常运行的情况迁移方便**
- **使用 Docker 可以通过定制应用镜像来实现持续集成持续交付部署持续交付和部署**
---
> 每当说起容器我们不得不将其与虚拟机做一个比较就我而言对于两者无所谓谁会取代谁而是两者可以和谐共存
## 容器 VS 虚拟机
  简单来说 **容器和虚拟机具有相似的资源隔离和分配优势但功能有所不同因为容器虚拟化的是操作系统而不是硬件因此容器更容易移植效率也更高**
### 3.1 两者对比图
  传统虚拟机技术是虚拟出一套硬件后在其上运行一个完整操作系统在该系统上再运行所需应用进程而容器内的应用进程直接运行于宿主的内核容器内没有自己的内核而且也没有进行硬件虚拟因此容器要比传统虚拟机更为轻便.
![容器 VS 虚拟机](https://user-gold-cdn.xitu.io/2018/6/17/1640cb4abec9e902?w=1086&h=406&f=png&s=70264)
### 3.2 容器与虚拟机总结
![容器与虚拟机 (VM) 总结](https://user-gold-cdn.xitu.io/2018/6/18/16410aa3b89ae481?w=801&h=206&f=png&s=37241)
- **容器是一个应用层抽象用于将代码和依赖资源打包在一起** **多个容器可以在同一台机器上运行共享操作系统内核但各自作为独立的进程在用户空间中运行** 与虚拟机相比 **容器占用的空间较少**容器镜像大小通常只有几十兆**瞬间就能完成启动**
- **虚拟机 (VM) 是一个物理硬件层抽象用于将一台服务器变成多台服务器** 管理程序允许多个 VM 在一台机器上运行每个VM都包含一整套操作系统一个或多个应用必要的二进制文件和库资源因此 **占用大量空间** 而且 VM **启动也十分缓慢**
  通过Docker官网我们知道了这么多Docker的优势但是大家也没有必要完全否定虚拟机技术因为两者有不同的使用场景**虚拟机更擅长于彻底隔离整个运行环境**例如云服务提供商通常采用虚拟机技术隔离不同的用户 **Docker通常用于隔离不同的应用** 例如前端后端以及数据库
### 3.3 容器与虚拟机两者是可以共存的
就我而言对于两者无所谓谁会取代谁而是两者可以和谐共存
![两者是可以共存的](https://user-gold-cdn.xitu.io/2018/6/17/1640cca26fc38f9e)
---
> Docker中非常重要的三个基本概念理解了这三个概念就理解了 Docker 的整个生命周期
## Docker基本概念
Docker 包括三个基本概念
- **镜像Image**
- **容器Container**
- **仓库Repository**
理解了这三个概念就理解了 Docker 的整个生命周期
![Docker 包括三个基本概念](https://user-gold-cdn.xitu.io/2018/6/18/164109e4900357a9?w=1024&h=784&f=jpeg&s=127361)
### 4.1 镜像(Image):一个特殊的文件系统
  **操作系统分为内核和用户空间**对于 Linux 而言内核启动后会挂载 root 文件系统为其提供用户空间支持而Docker 镜像Image就相当于是一个 root 文件系统
  **Docker 镜像是一个特殊的文件系统除了提供容器运行时所需的程序资源配置等文件外还包含了一些为运行时准备的一些配置参数如匿名卷环境变量用户等** 镜像不包含任何动态数据其内容在构建之后也不会被改变
  Docker 设计时就充分利用 **Union FS**的技术将其设计为 **分层存储的架构** 镜像实际是由多层文件系统联合组成
  **镜像构建时会一层层构建前一层是后一层的基础每一层构建完就不会再发生改变后一层上的任何改变只发生在自己这一层** 比如删除前一层文件的操作实际不是真的删除前一层的文件而是仅在当前层标记为该文件已删除在最终容器运行的时候虽然不会看到这个文件但是实际上该文件会一直跟随镜像因此在构建镜像的时候需要额外小心每一层尽量只包含该层需要添加的东西任何额外的东西应该在该层构建结束前清理掉
  分层存储的特征还使得镜像的复用定制变的更为容易甚至可以用之前构建好的镜像作为基础层然后进一步添加新的层以定制自己所需的内容构建新的镜像
### 4.2 容器(Container):镜像运行时的实体
  镜像Image和容器Container的关系就像是面向对象程序设计中的 实例 一样镜像是静态的定义**容器是镜像运行时的实体容器可以被创建启动停止删除暂停等**
  **容器的实质是进程但与直接在宿主执行的进程不同容器进程运行于属于自己的独立的 命名空间前面讲过镜像使用的是分层存储容器也是如此**
  **容器存储层的生存周期和容器一样容器消亡时容器存储层也随之消亡因此任何保存于容器存储层的信息都会随容器删除而丢失**
  按照 Docker 最佳实践的要求**容器不应该向其存储层内写入任何数据** 容器存储层要保持无状态化**所有的文件写入操作都应该使用数据卷Volume或者绑定宿主目录**在这些位置的读写会跳过容器存储层直接对宿主(或网络存储)发生读写其性能和稳定性更高数据卷的生存周期独立于容器容器消亡数据卷不会消亡因此 **使用数据卷后容器可以随意删除重新 run 数据却不会丢失**
### 4.3仓库(Repository):集中存放镜像文件的地方
  镜像构建完成后可以很容易的在当前宿主上运行但是 **如果需要在其它服务器上使用这个镜像我们就需要一个集中的存储分发镜像的服务Docker Registry就是这样的服务**
  一个 Docker Registry中可以包含多个仓库Repository每个仓库可以包含多个标签Tag每个标签对应一个镜像所以说**镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库**
  通常**一个仓库会包含同一个软件不同版本的镜像****标签就常用于对应该软件的各个版本** 我们可以通过```<仓库名>:<标签>```的格式来指定具体是这个软件哪个版本的镜像如果不给出标签将以 latest 作为默认标签.
**这里补充一下Docker Registry 公开服务和私有 Docker Registry的概念**
  **Docker Registry 公开服务** 是开放给用户使用允许用户管理镜像的 Registry 服务一般这类公开服务允许用户免费上传下载公开的镜像并可能提供收费服务供用户管理私有镜像
  最常使用的 Registry 公开服务是官方的 **Docker Hub** 这也是默认的 Registry并拥有大量的高质量的官方镜像网址为[https://hub.docker.com/](https://hub.docker.com/) 。在国内访问**Docker Hub** 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://www.163yun.com/product/repo)、[DaoCloud 镜像市场](https://www.daocloud.io/)、[阿里云镜像库](https://www.aliyun.com/product/containerservice?utm_content=se_1292836)等。
  除了使用公开服务外用户还可以在 **本地搭建私有 Docker Registry** Docker 官方提供了 Docker Registry 镜像可以直接使用做为私有 Registry 服务开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现足以支持 docker 命令不影响使用但不包含图形界面以及镜像维护用户管理访问控制等高级功能
---
> Docker的概念基本上已经讲完最后我们谈谈Build, Ship, and Run
## 最后谈谈:Build Ship and Run
如果你搜索Docker官网会发现如下的字样**Docker - Build, Ship, and Run Any App, Anywhere**那么Build, Ship, and Run到底是在干什么呢
![build ship run](https://user-gold-cdn.xitu.io/2018/6/18/16411c521e79bd82?w=486&h=255&f=png&s=185903)
- **Build构建镜像** 镜像就像是集装箱包括文件以及运行环境等等资源
- **Ship运输镜像** 主机和仓库间运输这里的仓库就像是超级码头一样
- **Run 运行镜像** 运行的镜像就是一个容器容器就是运行程序的地方
**Docker 运行过程也就是去仓库把镜像拉到本地然后用一条命令把镜像运行起来变成容器所以我们也常常将Docker称为码头工人或码头装卸工这和Docker的中文翻译搬运工人如出一辙**
## 总结
本文主要把Docker中的一些常见概念做了详细的阐述但是并不涉及Docker的安装镜像的使用容器的操作等内容这部分东西希望读者自己可以通过阅读书籍与官方文档的形式掌握如果觉得官方文档阅读起来很费力的话这里推荐一本书籍Docker技术入门与实战第二版