Docker入门篇(一):Hello Docker

2,425 阅读9分钟

Docker的设计理念是:Build, Ship and Run Any App Anywhere。它由Go语言编写。它希望对应用组件的封装,分发,部署,运行等生命周期进行管理,使得最终的Application可以在任何机器上顺利运行。

Docker就像货船一样:将各种APP以及他们所依赖的环境配置全部装入到独立集装箱中,然后将这些集装箱安全地运输到另一处地方。

在本专题中,以一个Java EE程序员的视角去了解它,因此主要介绍基础和使用部分。在了解Docker之前,应该具备:

  1. Linux相关命令以及背景知识。

  2. 对Maven/Git等有基本的认识。

🌏Docker官方网站:点此进入

为什么需要Docker?

一个产品(代码)的开发环境和部署环境往往是不同的。这其中可能包括了操作系统运行环境,或者到应用配置的差异。这些差异很有可能导致一个现象:在开发环境中运行正常的代码一旦在部署环境中就出现各种问题。

尤其是随着版本的不断迭代,运行环境的越来越复杂,开发人员和运维人员的沟通成本会越来越高。

那可不可以有这样一个方法,使得开发人员在交付代码时,将代码的运行环境(包括配置/数据/参数等等)也一并打包到部署环境中呢

Docker正是为了解决这个问题而诞生的。它对此提供了一个标准化的解决方案,从2014年诞生之日起就发展迅速。

在从前,代码即应用。开发人员只管将程序编译完然后提交给运维,由运维去部署。而学习Docker之后,则不只是简单提交代码,而是将运行文档,配置环境,运行环境,运行依赖包等等放置到一个集装箱中交付到运维(云平台)手中。

我们将要在一个集群环境中部署应用

由于互联网的野蛮生长,现在的网络应用已经通通采取了分布式集群来应对如此高并发的请求。

也就是说,如果按照传统的方式来部署应用,运维人员可能要手动地配置每个分布式节点的安装环境,这样的人力和时间成本都是巨大的。

再比如,如果分布式集群要再次进行弹性扩容,运维人员要重新在新的机器上安装MySQL,JDK,Hadoop,ZooKeeper,当然还没有算上配置这些环境所需要的成本。

所以Docker的设计者就想做这样一件事情:将自己的代码+配置+环境打包成一个镜像,然后直接将整个镜像迁移到其它的运行机器当中。

这和JVM虚拟机的理念不谋而合:一次编译,到处运行。

只需要一个镜像

假设某个App需要依赖Redis, MongoDB, MySQL才能正常运行,那么使用传统的方法,运维人员需要按照开发人员提供的开发手册,手动在部署环境中安装Redis,MongoDB,MySQL这些工具,同时开要考虑到版本不同所带来的差异(比如MySQL5.7和MySQL8.0)。

在使用Docker之后,可以直接将这些工具打包成一个镜像文件,运维只需要将这个镜像运行在Docker中,就可以获得完全一样的部署环境。

简单概括Docker

Docker是一个解决了运行环境和配置问题,方便做持续继承继承并有助于整体发布的容器虚拟化技术。

Docker带来了以下便捷:

  • 更快速的应用交付和部署。
  • 更便捷的升级和扩容/缩容。
  • 降低系统运维的门槛。
  • 高效的计算资源利用。
  • 一次构建,随处运行。

简单了解两类虚拟技术

虚拟机技术

想必我们一定了解或使用过大名鼎鼎的VM Ware(或类似的工具)。我们可以利用这个工具,在Windows系统中运行Linux, Unix系统,而运行在虚拟机内的程序对此毫无感知。

而对于我们而言,虚拟机以及其内部所有的应用,配置只是一个普通的镜像文件。当不需要的时候就可以整个删掉。并且虚拟机内的环境发生变化时,对我们真正的物理机毫无影响。

当然,虚拟机还模拟了内存,处理器,硬盘,网络适配器等硬件设备。相当于模拟了整套操作系统。这使得虚拟机也有它的局限性:资源占用多,冗余步骤多,启动慢

虚拟容器技术

基于上述的这些原因,Linux后来又发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为LXC)。它并不是一个完整的操作系统,但保留了Linux的系统运行环境,并支持对不同应用所运行的进程进行隔离。

容器没有自己的内核(依赖宿主机的Kernel),也没有硬件虚拟。因此虚拟容器和虚拟机相比要更为轻便。CentOS/Ubuntu基础镜像仅仅约200M,一般公司的宿主机可以部署100-1000个容器。

另外,每个容器之间是相互隔离的。每个容器有自己的文件系统,容器之间的进程不会相互影响。

Docker使用Linux作为内核,那Windows用户怎么办?很遗憾,Windows系统首先需要安装一个Linux虚拟环境(如果你的Windows系统非专业版或旗舰版),然后再运行Docker。用起来要比Linux系统下更麻烦一些。不过别灰心,因为至少在国内,服务器我们基本全部选择Linux内核的OS。

如果你想在Windows环境中学习如何运用Docker,则需要使用VM Ware模拟一个Linux虚拟机,并在此虚拟机中学习运用Docker。不要忘记配置虚拟机的网络设置,因为我们会在虚拟机中使用yum或Docker pull命令从互联网上下载文件。

🌏参考链接:物理机,虚拟机,容器的比较

Docker容器的框架

Docker基于C/S架构。客户端和Docker的守护进程相互交流,由Docker-Daemon进程负责Docker容器的构建,分发,以及运行。

客户端和守护进程通过sockets,或者是RESTful API进行沟通和交流。

Docker三要素

镜像(image)

Docker镜像是一个只读的模板。就好比我们利用一个ISO文件就可以创建很多份虚拟机一样,同一个模板也可以创建很多个容器。

容器(container)

容器是由镜像创建出来的运行实例。它可以被启动,停止,甚至删除。每个容器都是相互隔离且保证安全的平台。可以把容器看作是一个简易的Linux环境(root用户权限,进程空间和网络空间等),以及运行在其中的应用程序。

🌏参考链接:深入了解容器和镜像

仓库(repository)

就像管理代码/项目的GitHub仓库一样,Docker镜像也会集中存放在一个中央仓库中进行管理。最大的公开仓库就是Docker Hub。权限可以分为私有(Private)公开(Public)

Docker Hub

相比Docker Hub,我们对GitHub可能更为了解:我们相当于将自己的工作/应用存储到了云端,以便自己在任意一台机器都可以通过clone来继续完成自己的工作。

Docker Hub的工作其实是类似的:开发人员将自己的配置+应用打包成的Docker镜像也存储到云端,运维人员可以直接在云端中获取该Docker镜像并部署。

🌏Docker Hub官方网站:点此进入

针对国内开发者

受网络限制,国内开发者一般都选择阿里云网易云等作为云端仓库。不过我们更倾向于前者,因此笔者之后的文章也全部以阿里云为平台进行操作的。

在CentOS 7 下安装Docker

目前,Linux仅在发行版本(release)中的内核支持Docker。

Docker运行在CentOS 7上,要求系统为64位,系统内核版本是3.10以上。

Docker运行在CentOS 6.5或更高的版本,则要求系统是64位,系统内核版本为2.6.32-431或者更高的版本。

附带Docker官网安装教程:点此进入

笔者是在centOS 7环境下安装的Docker。即使在centOS 6.8环境中,安装Docker的步骤也可能有所不同。

通过uname命令来查看CentOS系统的内核版本:

$ uname -r

检查release文件:

$ cat /etc/redhat-release

通过yum安装gcc相关依赖(如果是虚拟机进行的操作,需要先检查网络是否连通):

$ yum -y install gcc
$ yum -y install gcc-c++

如果原来的系统装有旧版本的docker引擎,就复制下方命令将它们移除:

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

如果yum提示没有匹配参数,则说明目前机器中没有安装任何与docker相关依赖,否则就会将它们卸载。

随后我们使用yum命令来安装Docker-CE版本。官网给出以下提示:

Before you install Docker Engine for the first time on a new host machine, you need to set up the Docker repository. Afterward, you can install and update Docker from the repository.

大意为:如果你是在新的机器中安装Docker引擎,首先需要配置Docker仓库,随后,你就可以在这个仓库中安装或者更新Docker了。

$ sudo yum install -y yum-utils

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

❗:官网中提供的download.docker.com仓库在国内的速度非常缓慢,因此接下来的stable镜像仓库需要配置为阿里云仓库。当然,也可以在上一步的--add-repo参数中直接就进行替换。

$ yum-config-manager --add-repo \
	http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

系统提示该配置信息被配置到了/etc/yum.repos.d/docker-ce.repo文件中,可以使用cat查看该配置文件。

Docker中文官网推荐:更新yum的软件包索引。

$ yum makecache fast

随后使用yum安装Docker-ce版本,可添加-y参数跳过所有的问询(全部安装),随后需要稍等片刻。

$ yum -y install docker-ce

最后,启动Docker-CE版,我们就可以正式使用它了!

$ systemctl start docker

通过version参数检查Docker是否安装成功:

$ docker version

使用阿里云配置镜像加速

登录阿里云,选择注册新账号,或者选择复用淘宝账号。在服务中搜索:容器镜像服务,选择镜像加速器。我们在Docker专题的最后,学习如何将自己的镜像上传到远程仓库时,也会使用阿里云的容器镜像服务。

镜像加速器中,阿里云已经给出了加速器地址。在操作文档中可以根据自己的系统快速复制命令,笔者为centOS系统。手动配置过程如下:

$ mkdir -p/etc/docker
$ vim /etc/docker/daemon.json

在json文件中配置加速器地址,保存并退出:

{
  "registry-mirrors": ["这个值以你的加速器地址为准"]
}

重新加载配置文件并启动:

$ systemctl daemon-reload
$ systemctl restart docker

查看进程中是否已经启动了Docker:

ps -ef | grep docker

🌏阿里云首页:点此登录

下载一个hello-world镜像

按照惯例,在第一次安装完Docker之后我们启动一个helloWorld实例。

$ docker run hello-world

终端首先会提示:Unable to find image 'hello-world:latest' locally。不过无需担心,这是因为Docker引擎会优先在本地搜索是否有此镜像。当在本地找不到hello-world镜像时,Docker才会会从远端仓库中将它下载下来。:latest是一个标签,表示下载hello-world镜像的最新版。

最终,Docker会从阿里云仓库中下载该镜像,并由此创建一个容器并运行(run)。

如果屏幕当中显示如下信息,则表示安装成功:

Hello from Docker!
This message shows that your installation appears to be working correctly.