获取镜像的途径有两个,一是从镜像仓库获取,如官方的Docker Hub,二是自定义。上文已经介绍如何从镜像仓库获取镜像,本文基于一个Springboot项目,来介绍自定义一个镜像的基本流程。

1. 定制镜像的本质

我们知道镜像是分层存储的,镜像的构建也是一层一层进行的,一层构建完后,就变为只读,在其上再构建下一层。因此定制镜像,实际上就是定义每一层要干的事,比如执行某个命令,设置一个环境变量,声明一个暴露端口等等。然后在构建时,按照各层的定义,一层一层地完成构建,最终形成一个包含这些层的镜像。

2. Dockerfile文件

Docker中定义各层要干的事的文件叫Dockerfile,它是一个文本文件,包含了一条条的指令,每一条指令对应一层镜像,指令的内容就描述了这一层该如何构建。如下示例了一个非常简单的Dockerfile,

FROM nginxRUN echo '

Hello jboost!

' > /usr/share/nginx/html/index.html

我们定制镜像,必须要以某一个镜像为基础,在其上构建自己需要的层,如上示例中,我们是以nginx镜像为基础,然后在第二层定制了我们自己的内容——修改index.html的内容为

Hello jboost!

,这样运行容器打开nginx主页时就不会显示默认的页面内容了。

上面示例中接触了Dockerfile的两个指令

  • FROM:FROM指令指定基础镜像,每一个定制镜像必须要有一个基础镜像,所以必须要有一条FROM指令,并且是Dockerfile的第一条指令
  • RUN:RUN指令指定需要执行的命令,后面接的命令就像是shell脚本一样可执行

Dockerfile还提供了许多其它指令,后续我们再集中介绍,本文只对接触到的指令做简单说明。

3. 自定义一个镜像

这部分以一个Springboot项目为基础,介绍自定义一个镜像涉及的基本环节。项目地址为:https://github.com/ronwxy/swagger-register ,该项目是一个Swagger API文档注册服务,其它项目可将Swagger API信息注册到该服务,进行统一查看与管理。

3.1 定义Dockerfile文件

首先,我们在项目的根目录下创建一个Dockerfile文件(文件名就叫Dockerfile),其内容为:

FROM openjdk:8-jdk-alpineENV PROFILE=devRUN mkdir /app /logsCOPY ./target/swagger-register-1.0.0-SNAPSHOT.jar /app/app.jarWORKDIR /appVOLUME /register-dataEXPOSE 11090CMD ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "app.jar"]

从上往下依次介绍如下

  • 第一行:FORM openjdk:8-jdk-alpine, 表示以openjdk:8-jdk-alpine这个镜像为基础镜像,因为这是一个Springboot项目所以必须要有jdk支持,我们在定制镜像时,可以找一个最适合的镜像作为基础镜像。
  • 第二行:ENV PROFILE=dev, 定义了一个环境变量,这个环境变量可以在后面被引用
  • 第三行:RUN mkdir /app /logs,通过mkdir命令创建了两个目录,用来保存jar执行文件及日志
  • 第四行:COPY ./target/swagger-register-1.0.0-SNAPSHOT.jar /app/app.jar 将target目录下的jar包复制到/app目录下,并且进行重命名
  • 第五行:WORKDIR /app, 指定工作目录为/app,后面各层的当前目录就是指定的工作目录
  • 第六行:VOLUME /register-data, 定义一个匿名数据卷,前面说过写操作不要直接在容器内进行,而要改为写挂载的数据卷目录,这个定义可在运行容器时通过 -v 来覆盖。
  • 第七行:EXPOSE 11090, 声明了运行容器时提供的服务端口,也仅仅是个声明而已,只是告诉使用的人要映射这个端口,通过 -p 可映射端口。
  • 第八行:CMD [“java”, “-Dspring.profiles.active=${PROFILE}”, “-jar”, “app.jar”], 指定了容器启动命令,因为是一个Springboot项目,所以就是一个java -jar的执行命令,容器启动的时候就会执行该命令来运行Springboot服务,这里引用了第二行定义的环境变量PROFILE

3.2 配置maven插件

定义好Dockerfile后,为了方便构建镜像,我们可以借助maven的dockerfile插件dockerfile-maven-plugin,在pom.xml的build部分加入配置如下

org.springframework.boot            spring-boot-maven-plugin        com.spotify            dockerfile-maven-plugin            1.4.10${docker.image.prefix}/${project.artifactId}target/${project.build.finalName}.jar

repository指定了镜像的名称,docker.image.prefix需要properties部分进行定义,我这里是springboot。

3.3 构建镜像

下载源码: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镜像即为我们刚刚构建好的定制镜像。

3.4 启动容器

我们可以通过以下命令来启动一个刚才定制镜像的容器

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

其中:

  • -d 表示以后台进程方式运行
  • –name 指定容器名称
  • -p 指定端口映射,左边为宿主机端口,右边为容器服务端口
  • -v 指定数据卷挂载,左边为宿主机目录,右边为容器目录
  • –restart=always 表示在docker启动时自动启动该容器

关于容器相关的内容后面详细介绍,这里不展开说明了。启动容器后, 我们就可以浏览器打开地址 http://宿主机ip:11090/doc.html 来访问服务了(打开页面后内容是空的,因为没有任何服务注册Swagger API, 相关内容可参考 swagger api文档集中化注册管理)

4. 总结

本文介绍了一个基于Springboot项目的Docker镜像定制及使用过程,对镜像的构建过程,及Dockerfile的基本指令以及容器的运行做了基本介绍。后续会对Dockerfile的其它指令及Dockerfile的一些最佳实践进行更为详细的介绍,欢迎关注。

maven项目中如何直接访问某一个页面_整一个自己的docker镜像相关推荐

  1. 在maven项目中使用Junit进行单元测试

    在maven项目中使用Junit进行单元测试(一) 在maven项目中使用Junit进行单元测试一 创建maven项目 编写测试用代码 小结 这是第一篇博文,所以我决定先从比较简单的内容写起,同时熟悉 ...

  2. executequery方法_在IDEA的maven项目中连接使用MySQL8.0方法教程

    首先看一下我的基本的开发环境: 操作系统:MacOS 10.13.5编辑器:IDEA 2018.3其他:MySQL8.0.15.Maven 3.3.9.JDK 1.8 好,下面就正式开始: 第一步:在 ...

  3. java maven 读取配置文件_Java项目和maven项目中如何获取设置配置文件中的属性

    通常情况下,我们会在一些配置文件文件中配置一些属性.如: indexPath = E\:\\Tomcat_7.0\\webapps\\ipost_stage\\lucene\\index imgUpl ...

  4. log4j在maven项目中的使用

    log4j在maven项目中的使用 log4j在maven项目中的使用 一.序言 二.log4j在maven中的使用 1.导入依赖 2.配置log4j 方法一:创建log4j.properties 方 ...

  5. 在Maven项目中使用tk-mybatis(不结合SpringBoot)

    什么是tk-mybatis 通用 Mapper4(tk-mybatis) 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及Example 相关的单表操作.通用 Ma ...

  6. Idea在Maven项目中使用支付宝沙箱环境

    进入支付宝开发者中心注册账号点击进入 进入后会看到如下页面,点研发服务 进入之后先下载密匙生成器: 安装好后打开,点生成密匙 复制应用公匙 使用应用公匙生成支付宝公匙 得到支付宝公匙 然后我们开始下载 ...

  7. idea2019导入maven项目中的某些问题

    idea2019导入maven项目中的某些问题 idea2019导入maven项目,会出现很多莫名其妙的问题,需要注意的是如果是idea2019的版本是3月以前的,那会maven需要下载3.6.1以前 ...

  8. W2-2:在Maven项目中进行Junit5单元测试

    系列文章目录 W2-1:Maven引入外部依赖--以GSON的使用为例 W2-2:在Maven项目中进行Junit5单元测试 - 环境:IntelliJ IDEA Community Edition ...

  9. 解决 maven 项目中加入了 lombok 库后依然报错的问题

    解决 maven 项目中加入了 lombok 库后依然报错的问题 参考文章: (1)解决 maven 项目中加入了 lombok 库后依然报错的问题 (2)https://www.cnblogs.co ...

最新文章

  1. html 访问 php 变量
  2. MONTH_NAMES_GET
  3. 卫星导航 | 整秒转时分秒(时间转换)
  4. 让C/C++程序员告诉你什么叫浪漫,表白黑科技,炫酷多彩求爱利器
  5. 二叉树的递归遍历与复制
  6. laravel重定向自定义显示提示消息
  7. 开源 静态 文件 服务器,Node.js搭建静态服务器
  8. HDU 2819 Swap(二分图匹配)
  9. Struts + Spring + Hibernate 进阶开端(一)
  10. “我男友是程序员,修BUG比我重要,服了!”
  11. 文本框换行_word的段落标记与换行,你真的知道么?
  12. 3dsmax给物体贴图之后,物体不显示贴图的解决办法
  13. 金橙子打标卡二次开发应用
  14. axure如何导出原件_axure怎么导出为pdf格式
  15. Faraway(枚举 去绝对值)
  16. 企业微信应用分享(一)
  17. QoS(Quality of Service),中文名为服务质量。
  18. android+判断小米手机,android 判断手机为小米
  19. 柴夥說算法(4)--再說樹
  20. 下载IE6的完整版的‘方法

热门文章

  1. 如何简单地利用Bitmap为中介储存图片到数据库中
  2. 51单片机——My-Clock项目
  3. 开发自己的 chart - 每天5分钟玩转 Docker 容器技术(167)
  4. 对抗高并发拯救系统架构,我们并不需要复仇者联盟|深圳活动
  5. spring之AOP(转)
  6. UWP图片编辑器(涂鸦、裁剪、合成)
  7. Html5-Canvas实现简易的抽奖转盘
  8. 第1章 游戏之乐——快速找出故障机器
  9. 电脑开机密码忘记了怎么办?
  10. linux eclipse java_实验一 Java开发环境的熟悉(Linux + Eclipse)