站在巨佬的肩膀上,才能看的更远!(没错这篇文章就是大量援引国内外网上各位大佬的博客,外加我这个小菜初入docker的一些理解,整理一下所学,也是为了方便我自己在暑假过完后,被别人问起docker问到我一脸懵逼、不知所措的时候再回来看看...)
这本篇文章的出发点是:从一个小白的角度(几天前的我),尽可能全方位的为您介绍Docker,让您理解并学会它的初步使用,感兴趣的小伙伴还可以通过本篇文章,对Docker的生态与架构有一个初步的掌握。
咳,话说从2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。它是一个变革性、意义重大的技术,虚拟机的概念想必大家都听说过,国外大佬对Docker的评价是,它的出现,不亚于21世纪初我们对虚拟机的引入!
外网上蹭了两张图,看看docker今年来的火爆程度:
但是,仍有许多像我一样的小伙伴并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文就来详细解释,帮助大家理解它,还带有简单易懂的实例,教大家如何将它用于日常开发。
一、那首先Docker到底是个什么东西?(划重点)
初学Docker之时,我们可以很单纯的将Docker看成是一个工具,它可以将我们的应用程序(如我们开发的各种软件、APP等)打包封装到一个容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源,通过容器就可以实现方便快速(几行代码的事儿)并且与平台解耦(linux上运行的软件打包成容器后可以在windows上跑!)的自动化部署方式(在一个容器中,Docker会自动帮我们把软件运行所需要的依赖环境全部配置好!),无论我们部署时的环境如何,容器中的应用程序都会运行在同一种环境下(一花一草一世界,这个容器就是应用程序自己的一方天地!与外界隔绝~)。
举个栗子,小明写了一个CMS系统,该系统的技术栈非常广,需要依赖于各种开源库和中间件。如果按照纯手动的部署方式,小明需要安装各种开源软件,还需要写好每个开源软件的配置文件。如果只是部署一次,这点时间开销还是可以接受的,但如果小明每隔几天就需要换个服务器去部署他的程序,那么这些繁琐的重复工作无疑是会令人发狂的。这时候,Docker的用处就派上场了,小明只需要根据应用程序的部署步骤编写一份Dockerfile文件(Dockerfile和镜像和概念稍后解释),然后构建并发布他的镜像,这样,不管在什么机器上,小明都只需要拉取他需要的镜像,然后就可以直接部署运行了,这正是Docker的魅力所在。
其实从Docker与Container的英文单词原意中就可以体会出Docker的思想。Container可以释义为集装箱,我们可以将之类比成一个房车,没错就是那种空间很大,里边像一个家一样的大车,如下图 ↓


(敲黑板)这个container就是上边的车, Docker就是制造这辆车的工人,container里边运转着的所有家电设施就是我们的应用程序,而我们的应用程序想要跑起来,需要配置各种包依赖和环境依赖,这些东西就相当于房车里边的电力、水和WiFi等。。。
这种房车最大的优点是什么?我们把它停在市区里,它可以正常运转,满足我们的日常生活。周末不上班,出去旅个游,把它停到青岛海边,它依然可以满足我们的生活需要!而且这种转移是非常方便的,有了房车这个“容器”,如果我们想去另一个地方生活,关上车门、说走就走~
那么问题来了,在Docker的实际应用中,image(镜像)、container(容器)、dockerfile(emmm,就是dockerfile)它们的概念和角色都是什么呢?
通过例子,大家应该对Docker是干什么的这个问题有了自己的理解,现在我们就来解释一下Docker的这几个核心概念。
- Image(镜像):Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数,以此来创建它的实例 -- 容器,我们也可以将镜像视为一个静态的、只读的模板,一个镜像可以创建很多相互独立、隔离的容器。类比一下上述房车的栗子,镜像可以看做是把房车里的可运行的家电设备(电视、空调、整体橱柜、冰箱、洗衣机等等)都给搬空了之后剩下的部分(image),我们将之视为一个模板,dockerfile是这个模板的设计蓝图。房车制造工人(docker)可以按照雇主的要求,在里边放置运行各种不同品牌、不同样式的家电(应用程序),使它成为一个完整的房车(container)。此外还需注意的是,这个房车模板(image)是可以被继承的,什么意思呢?我们还可以在上一个image的基础上做一些修改,生成一个新的image,并且与上一个image并存在同一个目录下,只是这两个image的tag(标签)属性不同。
- Container(容器):首先我们在脑中先形成这么一个概念:dockerfile是构建image的基石,image又是构建container的基石。下面引用下一个歪国哥们儿对container的解释:一个Docker容器可以看作是计算机内的计算机。关于这台虚拟计算机很酷的一点是您可以将它发送给您的朋友, 当他们启动这台计算机并运行您的代码时,他们将得到与您完全相同的结果。
容器其实就是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 - dockerfile:Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。构建、运行一个container容器的过程可以粗略的分为三步:编写dockerfile文件、使用docker build命令以dockerfile为基础构建image镜像、使用docker run命令以image镜像为基础生成container容器。如图:
那这个dockerfile长什么样呢?它的格式是酱紫的:FROM scratch ## 所有镜像文件的祖先类 ADD centos-7-docker.tar.xz / LABEL org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20181006" CMD ["/bin/bash"]
- repository(仓库):仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括 时速云 、网易云 等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托