Docker - 虚拟化容器
Docker 简单使用教程

本期内容主要讲解 Docker 的架构以及一些基本的概念,方便大家理解和使用 Docker ,并对自己的应用程序及服务进行封装,方便后期的交付和部署。

基本概念

  • 镜像(Image):Docker 镜像,Docker 部署的基本单位,本质上相当于一个 root 文件系统。主要负责装载我们的程序文件和这个程序所依赖的环境。
  • 容器(Container):Docker 容器,就是镜像运行时的实体,可以进行创建、启动、停止、删除、暂停等操作。
  • 仓库(Repository):仓库类似于 Git 中的仓库,可以看作一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。镜像与容器的关系类似于面向对象编程中的类与对象,镜像是静态的定义,容器时镜像运行时产生的实体。

Docker 面向对象
镜像
容器 对象

Docker 例子分析

这里我们从一项简单的服务搭建讲起,这里用 WordPress (一个使用广泛的内容管理网站)为例。

为什么要使用 Docker ?

  • 假设不用 Docker,如何搭建 WordPress ?

​ 首先需要找一台 Server 主机(假设操作系统为 Ubuntu),接着按照安装文档一步步敲命令,安装依赖环境,最后编写配置文件;

  • 那使用 Docker 呢?

​ 首先同样需要找一台 Server 主机,这里我们不用管它是什么系统,只要它支持 Docker 就 OK;接着我们在官方源里面拉取最新的 Ubuntu 镜像(这里可以想象成开启了一台 Ubuntu 虚拟机),运行该镜像并进入容器,然后安装依赖环境,编写配置文件即可;

​ 但是这样的安装还不够,因为当你的 container 被删除,你的工作就没有了,因此你还需要将该容器提交( commit )回去作为新的镜像。

那对比上述两种方法有人会问了,这两种方法有什么区别?不都是安装 + 配置吗,感觉 Docker 还更繁琐,需要运行一台 ”虚拟机“。但实际上,他们的差别在于可移植性,如果不适用 Docker ,我们每搭建一个 WordPress 网站,就需要重复一遍上述的过程,但是使用 Docker ,我们就只需要把上述过程完成一次,之后导出镜像,以后的每次搭建都可以直接装载镜像并使用就可以复用了,减少了环境搭建的问题。

Dockerfile 是什么

但是别人会用你的镜像吗?你的镜像比较大,别人也不知道里面到底包含什么,这都不利于镜像的分享和复用,那么如何解决这个问题呢,简单的方法就是用脚本透明化你的镜像制作过程,这样别人直接用脚本进行镜像制作就没问题了。而 Dockerfile 就是这个脚本,他能够很好的记录镜像制作过程。

有了 Dockerfile ,用户只需要执行 docker build 就可以制作和你一样的镜像,并且 Dockerfile 就是一个简单的文本文件,修改和书写也比较方便。这时候用户制作完镜像就可以运行容器启动服务了。

docker 和 docker-compose 什么区别?

还是刚刚的例子,我们使用 docker 已经能够完成镜像的制作 ,那么 docker-compose 又是做什么的呢?

我们考虑这样一种情况,假设你的应用需要 Mysql、php、nginx 以及 smtp 等多项服务,这时候我们又将怎么处理呢?首先我们同样可以使用上述的方法,将这些服务全部集成到一个镜像当中,这是完全没有问题的。但是这样的结果就是复用性较差,而且实际上上述服务都是有自己独立的镜像的,因此更常见的方法是,实现镜像之间的合作,共同服务于一个项目。

而 docker-compose 就是来完成这项工作的。我们需要做的就是把项目所需的镜像、镜像的配置及挂载的卷( volume )等多个信息写在 docker-compose.yml 文件中即可。 以后每次启动服务,只需要执行 docker-compose up 即可。

总结

  • Dockerfile:记录单个镜像(image)的构建过程;

  • docker-compose:记录一个项目(project,一般指代需要多个镜像)的构建过程,本质上应该是多容器编排的过程。

因此封装也会有三种途径:

  • Dockerfile:将所有所需要的环境在一个镜像中安装;从无到有来构建镜像,包括安装运行所需的环境、程序代码。主要配合指令 docker build ;

  • docker-compose:利用官方源拉取的镜像,在运行的时候进行配置组合;主要编排容器,假设使用了多个镜像,当启动的时候,需要手工敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐,而该方法一次性写在 docker-compose.yml 文件中即可。主要配合指令 docker-compose up ;

  • Dockerfile + docker-compose:与第二种方法的区别在于使用的多个镜像不是从官方源直接拉取的镜像,而是需要自己本地完成构建的,需要首先完成镜像构建,后续操作相同。