互联网企业容器技术实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 容器简介与Docker容器引擎

➤➤1.1.1 什么是容器

容器又称为容器虚拟化技术,从名称可以看出容器也是一种虚拟化技术。容器是基于操作系统的轻量级的虚拟化技术。容器的英文名称是 Container,该单词的另一个意思是集装箱,其实容器和集装箱确实有很多相似的地方。下面就通过集装箱这个例子来讲一下什么是容器。如果把容器比作集装箱,容器上面运行的应用服务比作集装箱里面的货物,则运载货物的轮船就是物理机。集装箱可以将不同的货物隔离开来,只不过容器隔离的是应用服务罢了。

其实容器就是将软件打包到一个平台中,用来开发、发布和部署的一种工具。容器镜像是一个轻量级、独立、可执行的软件包,包含运行它所需的所有内容:代码、运行时、系统工具、系统库、设置等。不管环境如何,容器化软件在Linux系统和Windows系统平台上都可以运行相同的应用程序。容器可以将软件与其周围环境隔离开来,解决开发环境和安装环境之间存在差异的问题,还有助于减少团队之间在同一基础架构上运行不同软件的冲突。

➤➤1.1.2 Docker容器

一说到容器,几乎立马想到的就是Docker了,Docker似乎已经成为容器的代名词,导致现在很多人以为容器就是Docker。其实Docker只是容器的其中一种而已,它将容器技术发扬光大。

1.Docker的由来

2013年,dotCloud公司决定开源他们内部使用的容器技术,这就是Docker的由来。之后,Docker很快在各大论坛火爆起来。到了2013年10月,dotCloud公司甚至直接更名为Docker股份有限公司,工作重心也转向全面围绕Docker来开发,可见Docker的火爆程度与崛起速度。Docker 之所以能迅速崛起,是因为它解决了传统方式的各种问题,在很大程度上提高了软件的生产效率,这是很多用户在生产环境中真实遇到的痛点。

2.Docker是什么

其实Docker并不能算一种新技术,因为Docker是基于LXC(Linux Containers),并使用了一些已经存在了很长的时间并且被广泛应用的技术来实现的。Docker 主要是将这些复杂、琐碎的底层技术服务化了。之所以能够获得如此巨大的成功,受到如此多用户的青睐,因为它能够更加了解用户的需求,且足够的简单方便。下面演示Docker的使用,运行Docker的最小镜像hello-world。如果使用的系统环境已经安装了Docker,则可以直接在Root环境下执行以下命令:

docker run hello-world

其实这个镜像并没有实际意义,只是Docker的最小镜像,最大的作用是用来测试Docker服务环境是否正常,在一切正常的情况下,首行会打印出“Hello from Docker!”的字符串。

3.Docker的一般操作

本节主要讲解Docker的一些常用操作,读者可以跟着动手操作。

既然要进行操作,首先需要具备Docker环境,下面介绍Docker的安装方法。

(1)安装Docker

Docker安装起来很方便,其主要是安装在Linux系统环境中,因为Docker的实现是依赖Linux内核的。当然,Docker也有Windows和Mac OS版本,但实质是安装了一个Linux虚拟机,所以为了获得最好的体验,还是需要Linux环境的。本书在CentOS环境中演示:

(2)拉取镜像

Docker通过docker pull命令拉取镜像,命令格式如下:

如上所示,Docker仓库的默认地址是Docker Hub,当没有明确指出时,就会从Docker Hub中拉取镜像。同时,仓库名是两段式名称,采用<用户名>/<镜像名>这种格式,当没有给出用户名的时候,默认为library,即为官方镜像。下面拉取一个ubuntu:16.04镜像。

在没有指明Docker镜像仓库地址的情况下,会将标签为16.04的镜像从Docker Hub中的官方镜像仓库library/ubuntu中拉取到本地。有了Docker镜像,就可以通过镜像运行容器。

(3)镜像的保存和加载

有时会由于环境的原因,导致有些机器无法拉取镜像,可以使用Docker镜像的保存加载机制,把镜像复制到任意的服务器上。

首先通过docker save命令将一个本地存在的镜像打包成一个tar文件,如下所示。

从上面的代码可以看到,已经将本地的ubuntu:16.04镜像打包成ubuntu-1604.tar并保存在本地,接下来可以把 ubuntu-1604.tar 打包文件复制到另外一台服务器上,并通过 docker load将ubuntu:16.04镜像加载到这台服务器上,如下所示。

(4)容器的导入和导出

容器的导入和导出与镜像的保存和加载有很多相似之处,不同之处在于一个用于操作容器,另一个用于操作镜像。

首先通过docker export命令将一个本地存在的容器打包成一个tar文件,如下所示。

如上所示,已将本地的容器tender_fermat打包成ubuntu-export-1604.tar文件,接着可以把该文件复制到其他的服务器上,然后在服务器上通过 import 命令将容器快照导入为镜像,如下所示。

(5)启动Docker容器

启动Docker容器有两种类型,一种是通过镜像创建并启动一个新的容器,另一种是启动一个处于停止状态的容器。可以通过docker run命令创建并启动一个容器,如下所示。

如上启动了一个Nginx服务器的容器,下面重新打开一个终端界面,通过docker ps命令查看本地启动的容器:

由上面可以看出本地启动了一个Nginx服务器容器。要启动一个处于停止状态的容器,可以使用docker start命令。先用Ctrl+C组合键终止刚启动的容器,如下所示。

可以通过docker ps-a命令查看本地所有的容器:

可以发现容器已经终止,下面用docker start命令启动该容器,如下所示。

需要注意的是,在大多数情况下启动的容器需要使其在后台运行,可以通过当docker run启动容器时,为其添加一个-d 参数来实现。这样容器启动后就不会占用一个终端,生命周期不会受到该终端生命周期的影响,同时也就无法通过Ctrl+C组合键终止容器进程了。

(6)进入容器

因为大多数情况都是通过-d 参数使容器在后台启动的,所以需要进入容器中才能进行一些操作。Docker进入容器可以通过docker attach 命令或 docker exec 命令两种方式,通常推荐使用docker exec的方式。下面通过docker attach的方式进入,如下所示。

可以看出,通过 docker attach 进入容器后退出时,会导致容器终止。因为当使用 docker attach命令进入容器时,执行的是容器自带的命令,把容器默认进程杀掉,容器自然就退出了。下面使用docker exec方式进入容器:

通过docker exec进入容器并退出,对容器不会产生影响。在如上命令中,其中的-i参数指打开容器的标准输入,-t:告诉Docker为容器建立一个命令行终端,而/bin/bash则表示进入容器中要执行的命令。

(7)终止容器

Docker可以使用docker stop命令终止一个正在运行的容器,如下所示。

(8)删除容器

Docker可以通过docker rm命令删除一个已经终止的容器,如下所示。