原文地址:http://blog.jboost.cn/docerk-5.htmlhtml
获取镜像的途径有两个,一是从镜像仓库获取,如官方的Docker Hub,二是自定义。上文已经介绍如何从镜像仓库获取镜像,本文基于一个Springboot项目,来介绍自定义一个镜像的基本流程。
java
咱们知道镜像是分层存储的,镜像的构建也是一层一层进行的,一层构建完后,就变为只读,在其上再构建下一层。所以定制镜像,实际上就是定义每一层要干的事,好比执行某个命令,设置一个环境变量,声明一个暴露端口等等。而后在构建时,按照各层的定义,一层一层地完成构建,最终造成一个包含这些层的镜像。nginx
Docker中定义各层要干的事的文件叫Dockerfile,它是一个文本文件,包含了一条条的指令,每一条指令对应一层镜像,指令的内容就描述了这一层该如何构建。以下示例了一个很是简单的Dockerfile,git
FROM nginx RUN echo '<h1>Hello jboost!</h1>' > /usr/share/nginx/html/index.html
咱们定制镜像,必需要以某一个镜像为基础,在其上构建本身须要的层,如上示例中,咱们是以nginx镜像为基础,而后在第二层定制了咱们本身的内容——修改index.html的内容为<h1>Hello jboost!</h1>
,这样运行容器打开nginx主页时就不会显示默认的页面内容了。 github
上面示例中接触了Dockerfile的两个指令spring
Dockerfile还提供了许多其它指令,后续咱们再集中介绍,本文只对接触到的指令作简单说明。docker
这部分以一个Springboot项目为基础,介绍自定义一个镜像涉及的基本环节。项目地址为:https://github.com/ronwxy/swagger-register ,该项目是一个Swagger API文档注册服务,其它项目可将Swagger API信息注册到该服务,进行统一查看与管理。shell
首先,咱们在项目的根目录下建立一个Dockerfile文件(文件名就叫Dockerfile),其内容为:api
FROM openjdk:8-jdk-alpine ENV PROFILE=dev RUN mkdir /app /logs COPY ./target/swagger-register-1.0.0-SNAPSHOT.jar /app/app.jar WORKDIR /app VOLUME /register-data EXPOSE 11090 CMD ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "app.jar"]
从上往下依次介绍以下 浏览器
openjdk:8-jdk-alpine
这个镜像为基础镜像,由于这是一个Springboot项目因此必需要有jdk支持,咱们在定制镜像时,能够找一个最适合的镜像做为基础镜像。定义好Dockerfile后,为了方便构建镜像,咱们能够借助maven的dockerfile插件dockerfile-maven-plugin
,在pom.xml的build部分加入配置以下
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- Docker maven plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.10</version> <configuration> <repository>${docker.image.prefix}/${project.artifactId}</repository> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> <!-- Docker maven plugin --> </plugins> </build>
repository指定了镜像的名称,docker.image.prefix
须要properties部分进行定义,我这里是springboot
。
下载源码:https://github.com/ronwxy/swagger-register.git ,而后在项目的根目录下执行以下命令(前提是本地已经装好了docker与maven及jdk)
mvn clean package -Dmaven.test.skip=true dockerfile:build
该命令首先会执行mvn clean package -Dmaven.test.skip=true
对项目进行打包,生成./target/swagger-register-1.0.0-SNAPSHOT.jar文件,而后基于当前目录下的Dockerfile文件进行构建,以下图所示
由上图可看出,该镜像构建分八步(对应Dockerfile的八行指令),每一步生成一个镜像层,每一层都有惟一的ID。由图中也能够看出,除了COPY之类的命令外,每一层的构建其实是先基于上一层启动一个容器,而后执行该层定义的操做,再移除这个容器来实现的,如第八步中
Step 8/8 : CMD ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "app.jar"] [INFO] [INFO] ---> Running in f4acd0b53bca [INFO] Removing intermediate container f4acd0b53bca [INFO] ---> a9ee579f2d62
先启动一个ID为f4acd0b53bca的容器,在其中执行CMD所定义的命令,而后再移除容器f4acd0b53bca,最后生成ID为a9ee579f2d62的镜像。
构建完后,咱们就能够在本地镜像中经过docker iamges
看到咱们定制的镜像了,如图
图中springboot/swagger-register镜像即为咱们刚刚构建好的定制镜像。
咱们能够经过如下命令来启动一个刚才定制镜像的容器
docker run -d --name swagger-register -p 11090:11090 -v /home/jenkins/swagger-register/register-data:/register-data -v /home/jenkins/swagger-register/logs:/logs --restart=always springboot/swagger-register:latest
其中:
关于容器相关的内容后面详细介绍,这里不展开说明了。启动容器后, 咱们就能够浏览器打开地址 http://宿主机ip:11090/doc.html 来访问服务了(打开页面后内容是空的,由于没有任何服务注册Swagger API, 相关内容可参考 swagger api文档集中化注册管理)
本文介绍了一个基于Springboot项目的Docker镜像定制及使用过程,对镜像的构建过程,及Dockerfile的基本指令以及容器的运行作了基本介绍。后续会对Dockerfile的其它指令及Dockerfile的一些最佳实践进行更为详细的介绍,欢迎关注。
个人我的博客地址:http://blog.jboost.cn
个人微信公众号:jboost-ksxy (一个不仅有技术干货的公众号,欢迎关注,及时获取更新内容)
—————————————————————————————————————————————————————
原文出处:https://www.cnblogs.com/spec-dog/p/11204914.html