本身编写 Dockerfile 可以很好的实现咱们想要的程序运行环境,不过若是装有咱们想要环境的镜像已经由热心的开发者构建好并共享在 Docker Hub 上,直接使用它们就会远比本身编写 Dockerfile 并进行构建要来的简单的多了。事实上,在开发过程当中咱们用到的镜像大部分仍是直接采用 Docker Hub 中已经存在的镜像的,即便本身编写 Dockerfile,也只是对已有镜像进行简单的改动,不多会从零开始搭建镜像。在这一节中,咱们要来看看如何更好地使用 Docker Hub 上由其余开发者共享的镜像。mysql
因为 Docker 的容器设计是程序即容器的,因此组成咱们服务系统的多个程序通常会搭建在多个容器里,互相之间协做提供服务。例如一套最简单的 Web 服务,咱们可能会须要 Java 容器来运行基于 Spring Boot 的程序,须要 MySQL 容器来提供数据库支持,须要 Redis 容器来做为高速 KV 存储等等。装有这些程序的镜像咱们均可以很容易的在 Docker Hub 上找到并直接使用,但在咱们使用前,光选择镜像仍是不够的,咱们还得根据须要选择对应程序版本的镜像。git
虽然咱们常把软件的版本放在 Tag 里做为镜像名的一部分,但对于一些复杂的应用,除了版本外,还存在不少的变量,镜像的维护者们也喜欢将这些变量一同组合到镜像的 Tag 里,因此咱们在使用镜像前,必定要先了解不一样 Tag 对应的不一样内容。github
这里咱们来看个例子,下面是由 Docker 官方提供的 OpenJDK 镜像的说明页面。web
一般来讲,镜像的维护者会在镜像介绍中展现出镜像全部的 Tag,若是没有,咱们也可以从页面上的 Tags 导航里进入到镜像标签列表页面。sql
在 OpenJDK 镜像的 Tag 列表里,咱们能够看到一样版本号的镜像就存在多种标签。在这些不一样的标签上,除了定义 OpenJDK 的版本,还有操做系统,软件提供者等信息。docker
镜像维护者为咱们提供这么多的标签进行选择,其实方便了咱们在不一样场景下选择不一样环境实现细节时,都能直接用到这个镜像,而不须要再单独编写 Dockerfile 并构建。数据库
可是换句话说,正是有这么多不一样标签的镜像存在,因此咱们在选择的时候,更要仔细认真,找到咱们想要的那个镜像。网络
若是你们多接触几个镜像,就会发现带有 Alpine 的版本是许多镜像中都常见的标签。带有 Alpine 标签的镜像究竟是什么样的存在呢?它与相同软件不一样标签的镜像又有什么样的区别呢?app
镜像标签中的 Alpine 其实指的是这个镜像内的文件系统内容,是基于 Alpine Linux 这个操做系统的。Alpine Linux 是一个至关精简的操做系统,而基于它的 Docker 镜像能够仅有数 MB 的尺寸。若是软件基于这样的系统镜像之上构建而得,能够想象新的镜像也是十分小巧的。webapp
在 Docker 里,Alpine 系统的镜像到底有多小,咱们不妨来与其余系统镜像作一个比较。
能够看到,Alpine 系统镜像的尺寸要远小于其余常见的系统镜像。让咱们再来比较同一个软件在基于普通系统的镜像和基于 Alpine 系统的镜像后尺寸上的区别。
因为基于 Alpine 系统创建的软件镜像远远小于基于其余系统的软件镜像,它在网络传输上的优点尤其明显。若是咱们选择这类的镜像,不但能够节约网络传输的时间,也能减小镜像对硬盘空间的占用。
固然,有优势也会有缺点,Alpine 镜像的缺点就在于它实在过于精简,以致于麻雀虽小,也没法作到五脏俱全了。在 Alpine 中缺乏不少常见的工具和类库,以致于若是咱们想基于软件 Alpine 标签的镜像进行二次构建,那搭建的过程会至关烦琐。因此若是你想要对软件镜像进行改造,并基于其构建新的镜像,那么 Alpine 镜像不是一个很好的选择 (这时候咱们更提倡基于 Ubuntu、Debian、CentOS 这类相对完整的系统镜像来构建)。
除了合理选择镜像外,许多镜像还为咱们提供了更加方便的功能,这些细节咱们一般均可以在镜像的详情里阅读到。
这里咱们以 MySQL 为例,看看一般咱们是怎样阅读和使用镜像的特殊功能的。
本身安装过 MySQL 的朋友必定知道,搭建 MySQL 最麻烦的地方并非安装的过程,而是安装后进行初始化配置的过程。就拿更改 root 帐号的密码来讲,在初始的 MySQL 里就要耗费很多工做量。
若是咱们拿到一个 MySQL 镜像,运行起来的 MySQL 也就约等于一个刚刚安装好的程序,面临的正好是复杂的初始化过程。
好在 MySQL 镜像的维护者们为咱们打造了一些自动化脚本,经过它们,咱们只须要简单的传入几个参数,就可以快速实现对 MySQL 数据库的初始化。
在 MySQL 镜像的详情里,描述了咱们要如何传入这些参数来启动 MySQL 容器。
对于 MySQL 镜像来讲,进行软件配置的方法是经过环境变量的方式来实现的 ( 在其余的镜像里,还有经过启动命令、挂载等方式来实现的 )。咱们只须要经过这些给出的环境变量,就能够初始化 MySQL 的配置了。
例如,咱们能够经过下面的命令来直接创建 MySQL 中的用户和数据库。
$ sudo docker run --name mysql -e MYSQL_DATABASE=webapp -e MYSQL_USER=www -e MYSQL_PASSWORD=my-secret-pw -d mysql:5.7
经过这条命令启动的 MySQL 容器,在内部就已经完成了用户的建立和数据库的建立,咱们经过 MySQL 客户端就可以直接登陆这个用户和访问对应的数据库了。
若是深究 MySQL 是如何实现这样复杂的功能的,你们能够到 MySQL 镜像的 Dockerfile 源码库里,找到 docker-entrypoint.sh 这个脚本,全部的秘密正暗藏在其中。MySQL 正是利用了 ENTRYPOINT 指令进行初始化这种任务安排,对容器中的 MySQL 进行初始化的。
经过 MySQL 镜像这样的逻辑,你们还能够触类旁通,了解其余镜像所特用的使用方法,甚至能够参考编写、构建一些可以提供这类方法的 Dockerfile 和镜像。
若是咱们但愿将咱们镜像公开给网络上的开发者们,那经过 Docker Hub 无疑是最佳的方式。
要在 Docker Hub 上共享镜像,咱们必须有一个 Docker Hub 的帐号,这自没必要说了。在登陆到咱们帐号的控制面板后,咱们可以找到建立的按钮,在这里选择 Create Automated Build
( 建立自动构建 )。
自动构建镜像是 Docker Hub 为咱们提供的一套镜像构建服务,咱们只须要提供 Dockerfile 和相关的基本文件,Docker Hub 就可以在云端自动将它们构建成镜像,以后即可以让其余开发者经过 docker pull
命令拉取到这一镜像。
自动构建让不须要咱们再用本机进行镜像的构建,既能节约时间,又能享受高速的云端机器构建。
在 Docker Hub 中并不直接存放咱们用于构建的 Dockerfile 和相关文件,咱们必须将 Docker Hub 帐号受权到 GitHub 或是 Bitbucket 来从这些代码库中获取 Dockerfile 和相关文件。
在链接到 GitHub 或 Bitbucket 后,咱们就能够选择咱们存放 Dockerfile 和相关文件的代码仓库用来建立自动构建了。
在基本信息填写完成,点击建立按钮后,Docker Hub 就会开始根据咱们 Dockerfile 的内容构建镜像了。而此时,咱们也可以访问咱们镜像专有的详情页面了。
在 Build Details 页面里,咱们能够看到镜像构建的进度和详细的构建状况。