Advanced
Docker 是云原生的基石,它对云原生的推动力等同于第一次工业革命时期蒸汽机的作用。
Docker 需要重点掌握的内容包括:
- 核心原理
- 基础三大件:镜像、容器、仓库
- 镜像生产:通过 Dockerfile 编排镜像所需的资源
- 持久化存储:将容器的数据保存在宿主机磁盘中
- 端口与互联:容器与宿主机、容器与容器、容器与外部的连接与通信机制
- 用户权限:容器中的用户与宿主机的用户之间的关系
- 编排:通过多容器互联,实现所需的业务场景
Docker 官方文档非常完善,而且非常有层次结构。
概念与原理
原理
轻量级虚拟机
Docker 是利用 Linux **虚拟隔离技术(namespace)**将操作系统分割为多个子操作系统,子操作系统之间互不干扰的一种虚拟化技术。
为什么会出现 Docker 技术? 其实主要有两个原因:
- 软件架构复杂化,一个应用需要多个虚拟机协作支撑的情况已经非常普遍(也可以理解为微服务化)
- 传统的操作系统笨重(占用 10G 左右的存储空间)、启动速度太慢(大约 20s)
也就是说,现在的系统架构,要求需要大量运行速度极快,资源占用甚少的轻量级虚拟机。
Docker 的出现,正好解决了上述的困扰,轻量化的虚拟机改变了系统架构,云原生诞生于此。
虚拟隔离
Docker 的核心原理可以归纳为两点:虚拟文件系统+虚拟用户。
什么意思呢?
- 虚拟文件系统本质上还是宿主机上的文件,但通过虚拟技术就变成了一种“独占”资源。
- 虚拟用户本质上还是宿主机上的用户,但通过虚拟技术让容器认为自己有了单独的用户管理。
仅有虚拟还不够,在技术上必须有隔离方可确保容器之间互不干扰。
Docker 是对操作系统资源进行虚拟组合,形成一种新的有边界子操作系统。
再回过头来澄清两个概念:
- 宿主机:运行 Docker 系统的那台虚拟机,被称之为宿主机
- 容器:通过 Docker 创建的轻量级虚拟机,被成为容器(Container)
以应用的角度看,容器与宿主机不是从属关系,而是并列关系
Docker 容器是一台真实的虚拟机,这是理解容器的关键。
容器虚拟机拥有传统虚拟机的一切功能和操作方式,只有这样才能跳出“技术陷阱”,直接借鉴虚拟机的技术原理来掌握容器技术。
容器存在的根本目前也是用于运行软件,既然是运行软件,同样需要:
- 安装基础环境
- 与外部互联
- 被外界访问
- 存储数据
- 存储代码
- 高可用
- 负载均衡
镜像
文件
Docker 的镜像是 Docker 容器运行的基础,镜像是一种文件的形态。
如果只考虑 Docker 容器的操作系统属性,那么镜像=轻量级操作系统安装包。
如果需考虑 Docker 容器的应用软件属性,那么镜像=(轻量级操作系统+应用)安装包
例如:MySQL 镜像= 虚拟的 Linux 操作系统 + MySQL
镜像是怎么产生的?
用户编写镜像编排 Dockerfile,对这种文件进行 build 操作,就生成了一个镜像。
镜像是一个文件?
镜像从逻辑上可以简单理解是一个文件,但实际上是多层文件的组合。
所以,镜像虽然不是一个单独的文件,但可以被导出成为一个压缩文件:
# 镜像导出成一个tarball文件
docker save image
# 加载一个 tarball 镜像文件
docker load image
镜像存放在哪里?
运行容器时,Docker 会从 /var/lib/docker/image 目录下寻找是否镜像文件。
如果没有镜像文件,Docker 会尝试从 Dockerhub 镜像仓库中下载到本地,然后运行。
仓库
众所周知,DockerHub 是由 Docker 官方运营的全球最大的镜像仓库。
实际上,除了 DockerHub 之外,还有多种构建仓库的方式:
自建仓库
支持自建仓库。一般云提供商均提供了镜像仓库服务,供客户存放自己的私有镜像。
容器
容器是 Docker 最重要的组件,上面已经多次提到容器就是一个轻量级虚拟机。
运行
通过 docker run 命令运行容器,它的用法和参数如下(详情)。
下面我们通过一个简单的示例,介绍如何运行一个容器:
- 找到一个 Docker 镜像,例如:MySQL
- 运行如下的命令启动一个 MySQL 容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag
- 容器运行成功后,运行如下命令即可开始使用 MySQL 的客户端命令
docker exec -it mysql mysql -uroot -p123456
上述示例我们完成如下几个工作:
- 通过镜像页面找到运行容器的方案
- 运行一个容器
- 进入一个容器