6.2创建Docker镜像文件
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
这一章节, 我们将学习如何将我们的Spring Boot应用作为Docker的镜像,并且如何部署和运行它。
6.2.1如何使用
- 第一步,你需要在Docker官网上注册你的账号。官网是:https://hub.docker.com
- 一旦你有了账号之后,我们需要创建一个Repository,名称叫springboot.bookpub
- 现在我们需要使用Gradle Docker的插件。改变buil.gradle的配置文件如下:
| buildscript { |
- 我们还需要在build.gradle文件中加入这行配置:apply plugin: 'docker'
- 最后,我们需要在build.gradle文件中加入如下的配置:
| distDocker { |
- 确保你已经在你的机器上安装了Docker,我们可以创建镜像,使用命令:./gradlew clean distDocker。Docker的安装可参考:https://docs.docker.com/installation/#installation
- 如果每一步骤都是正确的话,我们可以看到如下的信息:
| $ ./gradlew distDocker …: compileGroovy UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :jar UP-TO-DATE :findMainClass :startScripts UP-TO-DATE :distTar UP-TO-DATE :distDocker Sending build context to Docker daemon 30.46 MBSending build context to Docker daemon Step 0 : FROM aglover/java8-pier ---> 69f4574a230e Step 1 : EXPOSE 8080 ---> Using cache ---> 725f1fd8c808 Step 2 : EXPOSE 8443 ---> Using cache ---> d552630db9d5 Step 3 : ADD .keystore /root/ ---> d0684cbd7fac Removing intermediate container ef2dffe243f4 Step 4 : ADD ch6.tar / ---> a0963c837391 Removing intermediate container fb140e526e29 Step 5 : ENTRYPOINT /ch6/bin/ch6 ---> Running in a769b6d6b40b ---> 778da2170839 Removing intermediate container a769b6d6b40b Successfully built 778da2170839 BUILD SUCCESSFUL Total time: 1 mins 0.009 secs |
- 我们可以命令docker images看到新创建的镜像
| $ docker images REPOSITORY |
TAG |
IMAGE ID |
CREATED |
| VIRTUAL SIZE |
|||
| ch6 |
latest |
778da2170839 |
17 |
| minutes ago |
1.04 GB |
||
| aglover/java8-pier |
latest |
69f4574a230e |
11 months |
| ago |
1.01 GB |
- 镜像创建成功,我们现在可以开始如下的命令:
docker run -d -P ch6
- 我们可以通过docker ps命令来通过HTTP来访问服务。如果容器运行成功,我们可以看到如下的信息:
- 通过这个信息,我们知道我们端口不是8080,而是32778.接下来,我们访问http://localhost:32778/books,会看到如
6.2.2使用原理
在前面的例子,我们已经看到使用Docker容器创建应用包是一件容易的事。另外Gradle-Docker插件帮我们做了一系列创建和发布的事;所有我们需要做的就是配置信息让其生成我们想要的镜像文件。让我们来看一下细节:
- exposePort引导插件去添加一个EXPOSE<port>构造到Dockerfile以至于当我们容器启动时,它将会暴露这些内部的端口到外部可通行的端口映射。当我们在运行docker ps命令时,我们已经看到这人映射了。
- addFile引导插件去添加ADD<src><dest>到Dockerfile以至于当容器开始创建时,将会从资源文件系统拷贝到容器镜像中。在我们的例子中,我们需要拷贝.keystore证书文件,这个证书我们配置了HTTPS连接器,这样的话我们的tomcat.https.properties就会加载${user.home}/.keystore。现在,我们需要在root/directory作为我们基于root的应用。
Gradle-Docker插件使用项目名称作为默认的镜像名称。这个项目名称是由Gradle根据项目文件名称来决定的,除非你可明确镜像的名称。我们可以在gradle.properties文件中加入name=’some_project_name’,然后镜像的名称就会是some_project_name.
如果你看一下Dockerfile的结果,你会看到build/docker/目录在项目的根目录下,你会看到如下的信息:
ADD ch6.tar /
ENTRYPOINT ["/ch6/bin/ch6"]这个ADD配置添加了TAR应用,我们可以通过tvf build/distributions/ch6.tar查看到相关信息。在我们创建容器期间,TAR文件将会在/directory文件中被提取之后用于应用中。
添加如下的信息,你也可以将你的镜像文件上传到你自己的Docker Hub账户上,但要注意的是,这可以会使用一些时间,因为镜像文件的大小。
distDocker {
tag "<docker hub username>/<docker hub repository name>"
push true
exposePort 8080
exposePort 8443
addFile file("${System.properties['user.home']}/.keystore"),
"/root/"
}
当我们使用Docker镜像时,我们可以使用-d或-p的命令:
- -d:说明运行的容器将会在开始进程中分离。
- -p:说明Docker发布会暴露所有内部端口到外部,这样的话我们可以访问。