实现目标
- 理解Docker基本概念以及用法
- 安装Docker CE
虚拟机(Virtual Machine,缩写为VM)
VM就是通过软件模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
虚拟机可以在一种操作系统里面运行另外一种操作系统,比如Windows系统里面运行Linux系统。
虽然用户可以通过虚拟机还原软件的原始环境。但是,虚拟机这种解决方案还是会有以及几个缺点。
- 资源占用多
虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1MB,虚拟机依然需要几百MB的内存才能运行。 - 冗余步骤多
虚拟机是完整的操作系统,一些系统级别的操作步骤必不可少,比如用户登录。 - 启动慢
启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
Linux容器(Linux Container, 缩写为LXC)
LXC是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
LXC不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,会有以下几点优势。
- 启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度会快很多。 - 资源占用少
容器只会占用需要的资源,不会占用没有用到的资源。虚拟机由于是完整的操作系统,不可避免地要占用所有资源。另外,多个容器可以共享资源,虚拟机是独享资源。 - 体积小
容器只要包含用到的组件,而虚拟机是打包整个操作系统,所以容器文件比虚拟机文件小很多。总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销会小很多。
什么是Docker
Docker属于LXC的一种封装,提供简单易用的容器使用接口,是目前最流行的LXC解决方案。在现代的开发流程中随处可见Docker的身影,Docker提供了环境隔离、应用打包等功能,让程序部署变得非常简单。
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。它基于Google公司推出的Go语言进行开发实现,这应该也是Go大火的原因之一吧。如果觉得难以理解Docker,我们可以把它类比为一艘货轮,而货轮上面的集装箱就是一个个应用,也就是容器。
Docker目标
Build, Ship and Run Any App, Anywhere
即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的 “一次封装,到处执行”。这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚至可以是一个操作系统或编译器。
Docker核心概念
- 镜像(Image):类似虚拟机镜像,用于创建Docker容器的模板
- 容器(Container):容器是基于镜像创建的运行实例,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux系统(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
- 仓库(Repository):仓库是集中存放镜像文件的场所,包括多个镜像文件,通过不同的标签(TAG)来区分,分为公开仓库(Public)和私有仓库(Private)两种形式。其中,最大的公开仓库是Docker Hub,存放着数量庞大的镜像,供用户下载,用户也可以在本地网络内搭建私有仓库。可以理解为Git代码库。
- 仓库注册服务器(Registry):仓库注册服务器是存放仓库的地方,存放着多个仓库,例如Ubuntu仓库、CentOS仓库等。
- 客户端(Client):Docker客户端通过命令行或者其他工具使用Docker API与Docker的守护进程通信
- 守护进程(Daemon):Docker Daemon是Docker架构中一个常驻在后台的系统进程,也就是Server端,可以是远程的,也可以是本地的。主要功能是接收处理Docker Client发送的请求。
- 主机(Host):一个物理或者虚拟的机器,用于执行Docker Daemon和Container
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
容器 | 对象 |
镜像 | 类 |
Docker Image Layer
Docker的用途
Docker的主要用途,目前有三大类
- 提供一次性的环境:比如本地环境测试软件、持续集成的时候,提供单元测试和构建运行的环境
- 提供弹性的云服务:因为Docker容器可以随开随关,非常适合动态扩容和缩容
- 组建微服务架构:通过多个容器,一台机器可以运行多个服务,因此在本机就可以模拟出微服务架构
容器与虚拟机-架构
- 虚拟机通过在真实的操作系统上通过Hyperviso技术进行虚拟机运行环境与体系的建立并通过该技术进行资源控制,一个性能好的物理机通常可以承载多个虚拟机,每个虚拟机都会有自己的操作系统,如下图所示。
- 容器提供操作系统级别的进程隔离,以Docker为例,当我们运行Docker容器时,此时容器本身只是操作系统中的一个进程,只是利用操作系统提供的各种功能实现了进程间网络、空间、权限等隔离,让多个Docker容器之间相互不知道彼此的存在,如下图所示。
虚拟机技术与容器技术的最大区别在于:多个虚拟机使用多个操作系统内核,而多个容器共享宿主机操作系统内核。
容器与虚拟机-性能
特性 | 容器 | 虚拟机 |
启动速度 | 秒级 | 分钟级 |
磁盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
隔离性 | 安全隔离 | 完全隔离 |
Docker核心技术
- 命名空间 (Namespaces):命名空间是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。在日常使用 Linux 或者 macOS 时,我们并没有运行多个完全分离的服务器的需要,但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件,这是很多时候我们都不愿意看到的,我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。
- 控制组(Control Groups,缩写为CGroups):CGroups用于隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽。每一个 CGroup 都是一组被相同的标准和参数限制的进程,不同的 CGroup 之间是有层级关系的,也就是说它们之间可以从父类继承一些用于限制资源使用的标准和参数。
- 联合文件系统(UnionFileSystem,缩写为UnionFS):UnionFS是一种为Linux操作系统设计的用于把多个文件系统『联合』到同一个挂载点的文件系统服务。
Docker 使用的第一种存储驱动为 AUFS(Advanced Multi-layered unification filesytem),AUFS 完全重写了早期的 UnionFS,目的是提高其性能与可靠性,此外还引入了如 branch 负载均衡等新功能。
Docker的安装
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。
Docker CE 的安装请参考官方文档。
- Mac[1]
- Windows[2]
- Ubuntu[3]
- Debian[4]
- CentOS[5]
- Fedora[6]
- 其他Linux发行版[7]
安装完成后,运行下面的命令,验证是否成功
docker version // 或者docker info
Docker镜像加速
- 阿里云 容器镜像服务->镜像中心->镜像加速器[8]
https://y45bd5ad.mirror.aliyuncs.com
- Docker for Windows镜像加速设置
Docker基础命令
- 搜索镜像
docker search [ImageName]
- 查看本地镜像
docker images
可以看到本地所有的镜像信息
REPOSITORY TAG IMAGE ID CREATED SIZE rabbitmq management 867da7fcdf92 5 weeks ago 181MB mcr.microsoft.com/mssql/server 2017-latest d04f0f18f395 2 months ago 1.46GB liyasthomas/postwoman latest 6c6f62a90502 3 months ago 949MB redis 3.2 87856cc39862 20 months ago 76MB mariadb 10.3.8 2c73b3262fff 23 months ago 363MB
- 删除镜像
docker rmi [ImageID/ImageName]
- 查看正在运行的容器
docker ps
- 查看所有容器包括已经关闭的容器
docker ps -a
- 删除已停止容器
docker rm [Container ID/Container Name]
Docker实例
本次演示的实例是搭建一个文档分享系统ShowDoc
- 获取最新镜像
# 原版官方镜像安装命令(国内用户不建议直接使用原版镜像,可以用后面的加速镜像)docker pull star7th/showdoc # 国内镜像安装命令(安装后记得执行docker tag命令以进行重命名)docker pull registry.cn-shenzhen.aliyuncs.com/star7th/showdoc
- 重命名镜像
docker tag registry.cn-shenzhen.aliyuncs.com/star7th/showdoc:latest star7th/showdoc:latest
- 新建存放ShowDoc数据的目录
# Windows系统,在执行的时候加上文件路径,目录请提前创建好,例子:docker run --rm -v d:/docker/showdoc/data hello-world# Linuxmkdir /docker/showdoc_datamkdir /docker/showdoc_data/htmlchmod -R 777 /docker/showdoc_data
- 启动ShowDoc
docker run -d --name showdoc -p 4999:80 -v d:/docker/showdoc/html:/var/www/html/ star7th/showdoc
- 参数说明
参数 | 说明 |
-d | 后台运行容器 |
--name | 设置容器名 |
-p 4999:80 | 将宿主机4999端口映射到容器80端口 |
-v d:/dockerworkspace/showdoc/html:/var/www/html/ | 将宿主机d:/dockerworkspace/showdoc/html目录映射(挂载)到容器/var/www/html/目录 |
根据以上命令操作的话,往后showdoc的数据都会存放在/showdoc/html目录下。
你可以打开 http://localhost:4999 来访问showdoc (localhost可改为你的服务器域名或者IP)。
账户:showdoc密码:123456
基于Docker的开发环境、测试环境、生产环境的自动化发布流程
Reference
•Docker 核心技术与实现原理[9]•Docker 架构[10]•Docker 核心概念(镜像、容器、仓库)及基本操作[11]•Docker 百度百科[12]•Docker 入门教程[13]•Docker 原理知识[14]•Docker 入门教程手册[15]•Docker 入门实践[16]•Docker的基本使用和简介、核心概念[17]•ShowDoc帮助说明[18]