使用Docker来构建、运行、发布微服务( 二 )


1.The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the DockerHub.
(amd64))
3.The Docker daemon created a new container from that image which runstheexecutable that produces the output you are currently reading.
4.The Docker daemon streamed that output to the Docker client,which
sent it
toyour terminal.
To try something more ambitious,you can run an Ubuntu container with:
$docker run-it ubuntu bash
Share images,automate workflows,and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
其中:

  • . hello-world是一个用于测试的非常简单的程序 。该程序执行之后,会输出上述文本内容;
  • .hello-world是托管于Docker Hub上的一个image;
  • 执行docker run hello-world之后,会先在本地查找是否存在hello-world image,如果没有找到,则联网到Docker Hub上下载;
  • ·找到hello-world image后,就运行容器 。
 Docker运行微服务下面,我们就演示下如何用Docker来运行微服务 。
1.创建微服务
我们在之前所创建的hello-world应用的基础上,生成一个新的应用hello-world-docker,用于微服务示例 。
同时,我们执行gradlew build来编译hello-world-docker应用 。编译成功之后,就能运行该编译文件 。
JAVA-jar build/libs/hello-world-docker-1.0.0.jar
此时,在浏览器访问http:/localhost:8080/hello,应能看到“Hello World! Welcome to visit way-lau.com!”字样的内容,则说明该微服务构建成功 。
2.微服务容器化
我们需要将微服务应用包装为Docker容器 。Docker使用 Dockerfile文件格式来指定image层 。
我们在 hello-world-docker应用的根目录下创建Dockerfile文件 。
EROM openjdk:8-jdk-alpine
VOLUME/tmp
ARG JAR FILE
ADD ${JAR FILE}app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-jar","/
app.jar"]
这个Dockerfile是非常简单的,因为本例子中的微服务应用相对比较简单 。其中:
·FROM可以理解为我们这个image依赖于另外一个image 。因为我们的应用是一个Java应用,所以依赖于JDK;
·项目JAR文件以“app.jar”的形式添加到容器中,然后在ENTRYPOINT中执行;
. VOLUME指定了临时文件目录为/tmp 。其效果是在主机/var/lib/docker目录下创建了一个临时文件,并链接到容器的/tmp 。该步骤是可选的,如果涉及文件系统的应用,就很有必要了 。/tmp目录用来持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp 作为工作目录;
·为了缩短Tomcat启动时间,添加一个系统属性指向/dev/./urandomo
3.使用Gradle来构建Docker image
为了使用Gradle来构建Docker image,需要添加docker插件在应用的build.gradle中 。
buildscript {
dependencies{
...
classpath ('gradle.plugin.com.palantir.gradle.docker:gradle-dock-
er:0.17.2')
apply plugin: 'com.palantir.docker'
docker {
name "${project.group}/${jar.baseName }"
files jar.archivePath
buildArgs(['JAR_FILE':"${jar.archiveName}"])
 
执行gradlew build docker来构建Docker image 。
 
>gradlew build docker --info
【使用Docker来构建、运行、发布微服务】...
Starting process 'command 'docker' '. Working directory:D:|workspaceGi
tosclspring-cloud-microservices-developmentsampleshello-world-docker
builddocker Command:docker build --build-arg JAR_FILE=hello-world-
docker-1.0.0.jar-t com.waylau.spring.cloud/hello-world-docker .
Successfully started process 'command 'docker''
2fdfelcd78c2:Pulling fs layer
82630fd6e5ba: Pulling fs layer
00151leb3437:Pulling fs layer
82630fd6e5ba:verifying Checksum
82630fd6e5ba:Download complete
2fdfelcd78c2:verifying Checksum
2fdfelcd78c2:Download complete
2dfelcd78c2:Pull complete
82630fd6e5ba: Pull complete
001511eb3437:Verifying Checksum
001511eb3437: Download complete
0015l1eb3437: Pull complete
Digest:sha256:388566cc68259a0019004c2d343dd6c69b83914dc5c458be959271
a2761795
Status:Downloaded newer image for openjdk:8-jdk-alpine
-—-> 3642e636096d
Step 2/5 :VOLUME /tmp
---> Running in 40ff6fa809e8
--->f467a7dlc267
Removing intermediate container 40ff6fa809e8
step 3/5 :ARG JAR FILE
---> Running in 4872c7353093


推荐阅读