文章目录

  • 用一个简单的demo了解docker构建自定义镜像
    • 首先用docker拉一个nginx
    • 编写一个Dockerfile
    • 构建
    • 查看自己构建的镜像是否成功了
    • 运行
    • 测试
  • 了解一下Dockerfile的常用指令
    • ADD
    • ARG
    • CMD
    • COPY
    • ENTRYPOINT
    • ENV
    • EXPOSE
    • FROM
    • MAINTAINER
    • USER
    • VOLUME
  • 使用Dockerfile构建镜像
    • 步骤
      • 将自己的项目打成jar包
      • 拉取一个java8的镜像
      • 编辑一个Dockerfile
      • 构建镜像
      • 启动并查看是否可以运行
  • 使用Docker Registry管理docker镜像
    • 介绍
    • 步骤
      • 搭建私有仓库
      • 将镜像推送到私有仓库
  • 使用maven插件构建docker镜像
    • 步骤
      • 编写pom文件
      • 将项目扔到服务器中
      • 运行如下命令
      • 查看镜像是否生成了
      • 运行该容器
  • 使用maven插件读取Dockerfile构建镜像
    • 介绍
    • 步骤
      • 项目中编写一个Dockerfile文件
      • 修改pom文件
      • 扔到服务器中
      • 构建镜像
      • 测试运行
  • 构建镜像并推送镜像到远程仓库中
    • 步骤
      • dockerhub注册账号
      • 创建仓库
      • 将dockerhub配置写道maven的setting.xml中
      • 修改pom文件
      • 把项目扔到云服务器中
      • 打包并推送
      • 确认打包和推送都成功
      • 运行程序查看是否正确运行
  • 参考文献

用一个简单的demo了解docker构建自定义镜像

首先用docker拉一个nginx

docker pull nginx

编写一个Dockerfile

命令如下所示,FROM 后面跟的你的基础镜像,而run则是表示你构建镜像时需要执行的指令,下面的指令意思就构建一个自定义的nginx镜像,然后欢迎页面显示this is my Spring Cloud and Docker study Demo

vim Dockerfile

FROM nginx
RUN echo '<h1> this is my Spring Cloud and Docker study Demo</h1> ' > /usr/share/nginx/html/index.html

构建

在Dockerfile的目录下运行如下命令,可以看到命令最后面有个.,这个点就是用于参数传递,表示当前路径

docker build -t nginx:my .

查看自己构建的镜像是否成功了

键入如下命令即可看到我们的自定义的镜像构建完成了

docker images

运行

docker run -d -p 91:80 nginx:my

测试

可以看到笔者通过91端口访问到了自己创建的容器

了解一下Dockerfile的常用指令

ADD

该命令常用于复制文件
格式为

ADD src(源文件或者目录)  desc(容器目标文件或者目标目录)

可以看出这里复制的可以是文件夹或者目录,注意源文件或者目录是相对Dockerfile文件而言的位置。如果src为url且dest没有/,则说明复制的是文件
如果src是url且dest结尾有/,则说明是复制的文件夹

如下所示,这就是一条将dockerfile路径下的jar复制到容器中的命令

ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar

ARG

常用与构建参数,设置的常是环境遍历,但是在容器运行时时是不会存在这些变量的,配置示例

ARG username=用户名

CMD

用于执行容器提供的默认值,在Dockerfile文件中,无论你配置多条cmd,只会以最后一条为准,即只会执行最后一条指令

支持的格式有

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2 (在shell中执行)

示例

cmd echo 'this is a test'

COPY

和ADD命令类似,使用也类似

ENTRYPOINT

和cmd一样,都是指定Docker容器启动时需要执行的指令,可以多次设置,但还是以最后一条为准,使用格式也和cmd差不多,示例如下所示

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

ENV

设置环境变量

示例

ENV JAVA_HOME /path/to/java

EXPOSE

说明运行容器提供的端口,但并不会因为该声明而打开相应端口,该指令主要作用是帮助理解该镜像服务的守护端口
当然,在容器未指明端口随机运行时,会自动映射EXPOSE的端口

EXPOSE 8761

FROM

指定基础镜像,优点类似java的extends关键字,需要注意的时FROM指令必须用在所有指令之前

MAINTAINER

指明维护者信息,用于作为Dockerfile的署名
示例

MAINTAINER 名字<123@qq.com>

USER

用户设置启动镜像时所用的用户id或者uid,写在RUN和CMD以及ENTRYPOINT后的内容都将用该用户执行
示例

USER zhang

VOLUME

该指令使容器的一个容器具有持久化存储的功能,该目录可悲容器本身使用,也可以共享给其他容器,当容器中有数据需要持久化时,就可以在Dockerfile中添加该指令,格式如下,意为将数据持久化到/data目录中

VOLUME /data

使用Dockerfile构建镜像

步骤

笔者这里使用了参考书籍所用的源码具体读者可以去这个地址捞
https://github.com/itmuch/spring-cloud-docker-microservice-book-code-docker

将自己的项目打成jar包

书籍中使用命令,笔者这里就偷了个懒,把源码拉下来在idea中打成jar包扔到服务器中,而使用的模块如下图所示

拉取一个java8的镜像

由于书中编写的Dockerfile使用的时java:8,书中前文并没有提及所以笔者在本文中对此进行详细化

 docker pull java:8

编辑一个Dockerfile

在上文扔到服务器中的jar包位置编写一个Dockerfile

vim Dockerfile

编辑的内容如下

# 使用java8作为基础镜像
FROM java:8
# 将本地文件挂到tmp中
VOLUME /tmp
# 复制文件到容器
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
# 运行命令
RUN bash -c 'touch /app.jar'
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

构建镜像

docker build -t itmuch/microservice-discovery-eureka-0.0.1 .

如果可以看到下图所示的过程说明构建是成功的,读者也可以使用docker images确认是否构建成功

启动并查看是否可以运行

docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka-0.0.1

使用服务器ip地址:8761确认是否可以访问

使用Docker Registry管理docker镜像

介绍

docker hub是官方维护的Docker Registry,上面存放着很多优秀的镜像,读者只需在docker官网注册账号号,就可以将镜像存放到docker hub上。
这里笔者就先演示一下将镜像推送到本地的docker registry

步骤

搭建私有仓库

Docker Registry 100搭建非常简单,使用如下所示命令即可完成搭建

docker run -d -p 5000:5000 --restart=always --name registry2 registry:2

将镜像推送到私有仓库

由于docker push默认会推送到官方仓库,所以这里我们需要修改一下要提交的docker镜像的tag,如下所示,将地址改为localhost

docker tag itmuch/microservice-discovery-eureka-0.0.1:latest localhost:5000/itmuch/microservice-discovery-eureka-0.0.1:latest

执行推送命令

docker push localhost:5000/itmuch/microservice-discovery-eureka-0.0.1:latest

使用maven插件构建docker镜像

步骤

编写pom文件

找到microservice-discovery-eureka对应的pom文件修改build标签对应的配置

<build><plugins><!-- 添加spring-boot的maven插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- 添加docker-maven插件 --><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><!--用于指定仓库+镜像名称--><imageName>itmuch/microservice-discovery-eureka:0.0.1</imageName><!--指定基础镜像--><baseImage>java</baseImage><!--就是dockerfile的 ENTRYPOINT指令--><entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint><resources><resource><targetPath>/</targetPath><!--指定需要复制的根目录--><directory>${project.build.directory}</directory><!--只当要复制的文件--><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin></plugins></build>

将项目扔到服务器中

运行如下命令

这里要求服务器安装好maven,具体maven在阿里云服务器的安装可以参考笔者这篇文章
Linux环境下maven的安装

mvn clean package docker:build

查看镜像是否生成了

docker images

运行该容器

docker run  -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1-SNAPSHOT

使用maven插件读取Dockerfile构建镜像

介绍

上文中我们每次都要打好jar包扔到服务器上去,创建一个Dockerfile,然后使用命令构建镜像,这里我们来一个进阶偷懒,即在项目中创建一个Dockerfile然后在pom文件中指定该文件位置,直接将项目扔到服务器中直接在package阶段就构建镜像

步骤

项目中编写一个Dockerfile文件


内容如下

FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8761
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

修改pom文件

如下所示,可以看到我们构建镜像时,不在指定baseImage entryPoint,直接指定dockerDirectory,而这个标签直接指向dockerfile文件,而且我们还增加了一个executions标签指定打包时就构建镜像

<build><plugins><!-- 添加spring-boot的maven插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><!--在每次package就打包镜像--><executions><execution><id>build-image</id><phase>package</phase><goals><goal>build</goal></goals></execution></executions><configuration><!--最终构建的镜像的名称--><imageName>itmuch/microservice-discovery-eureka:0.0.3</imageName><!--指定dockerfile--><dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin></plugins></build>

扔到服务器中

构建镜像

 mvn package

测试运行

 docker run  -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.3

构建镜像并推送镜像到远程仓库中

步骤

dockerhub注册账号

这部不多赘述,自行去注册即可
https://hub.docker.com/

创建仓库

完成后找到这个选项创建仓库即可,笔者这里就创建了一个名为microservice-discovery-eureka的仓库

将dockerhub配置写道maven的setting.xml中

vi /etc/maven/settings.xml

找到servers标签添加dockerhub的信息

<servers><server><id>docker-hub</id><username>DockerHub 的账号</username><password>DockerHub 的密码</password><configuration><email>admin@souyunku.com</email></configuration></server>
</servers>

修改pom文件

可以看到我们用<serverId>docker-hub</serverId>指定到servers配置的docker-hub信息,以及配置的imageName必须是你的dockerhubid+仓库名更多配置参见以下配置的注释

<build><plugins><!-- 添加spring-boot的maven插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.13</version><configuration><imageName>zhangshiyu3007/microservice-discovery-eureka:0.0.4</imageName><baseImage>java</baseImage><entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources><!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 --><serverId>docker-hub</serverId><!--设置覆盖构建相同标签的镜像--><forceTags>true</forceTags></configuration></plugin></plugins></build>

把项目扔到云服务器中

打包并推送

进入项目目录

 cd microservice-discovery-eureka/

构建镜像并推送

mvn clean package docker:build -DpushImage

确认打包和推送都成功

确认构建成功

docker images

确认推送成功,可以看到命令中已经开始将镜像推送到dockerhub中

运行程序查看是否正确运行

运行镜像,并使用ip:port查看

docker run  -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.4

参考文献

《Spring Cloud与Docker微服务架构实战》
使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上

极简的docker教程-在docker上运行微服务相关推荐

  1. 使用Quarkus在Openshift上构建微服务的快速指南

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! [重磅]到底是什么野生海鲜美味,惹得人们都往泥瓦匠老家买? 作者 | 康仔 来源 | 公众号 ...

  2. Docker教程(一) Docker入门教程

    Docker教程(一) Docker入门教程 本文链接:https://blog.csdn.net/yuan_xw/article/details/51935278 Docker教程(一) Docke ...

  3. Docker教程(二) Docker环境安装

    Docker教程(二) Docker环境安装 本文链接:https://blog.csdn.net/yuan_xw/article/details/77248243 Docker教程(二) Docke ...

  4. Docker教程(四) Docker镜像构建

    Docker教程(四) Docker镜像构建 本文链接:https://blog.csdn.net/yuan_xw/article/details/77744272 Docker教程(四) Docke ...

  5. Docker教程(三) Docker网络访问和数据管理

    Docker教程(三) Docker网络访问和数据管理 本文链接:https://blog.csdn.net/yuan_xw/article/details/77504077 Docker教程(三) ...

  6. grpc入门到精通_gRPC[go语言]大师教程,构建现代化Api和微服务

    gRPC [Golang] Master Class Build Modern API & Microservices gRPC[go语言]大师教程,构建现代化Api和微服务 比REST AP ...

  7. 使用feign调用注解在eureka上的微服务,简单学会微服务

    使用feign调用注解在eureka上的微服务. 首先,确保所有服务(调用方与被调用方)都被注册在同一个eureka服务上. 1. 在调用方添加依赖(万事第一步,加依赖) <dependency ...

  8. apache karaf_未来是Apache Karaf上的微服务架构

    apache karaf 这是Jamie Goodyear的客座博客文章( 博客 , @ icbts ). 他是Savoir Technologies的开源倡导者,Apache开发人员和计算机系统分析 ...

  9. 未来是Apache Karaf上的微服务架构

    这是Jamie Goodyear的客座博客文章( 博客 , @ icbts ). 他是Savoir Technologies的开源倡导者,Apache开发人员和计算机系统分析师: 他为全球大型组织设计 ...

最新文章

  1. 华为10GE LAN板与Wan板区别
  2. 基于区块链的健康链系统设计与实现(6)结束语
  3. [WC 2011]Xor
  4. C#中DataTable中的Compute方法使用收集
  5. 漫画算法:辗转相除法是什么鬼
  6. [Leetcode][第257题][JAVA][二叉树的所有路径][BFS][DFS]
  7. 成功加入微软GDI计划
  8. AnkhSVN的使用
  9. 5岁自学python编程-人工智能时代,孩子需要什么?
  10. 学计算机要学工图吗,工程图学及计算机绘图: 非机类
  11. 演唱会网上订票系统(SSM,JSP,MYSQL)
  12. 我一直在维护的石墨文档开源了
  13. 程序员的有个坏习惯!
  14. 微信800android1840,微信8.0版本官方版
  15. 博士申请 | 港中深韩晓光课题组招收与华为中央媒体院联合培养博士生
  16. word页码与行号怎么统一设置字体
  17. Yapi idea插件使用
  18. java做五子棋 视频_java swing实现五子棋小游戏项目源码附带视频指导运行教程...
  19. 市值将近腰斩,三七互娱真的“失”在买量上吗?
  20. 网上购车平台其实也可以这样上私户

热门文章

  1. Maven工程下,解决配置文件相关的File doesn't exits,以及xxxMapper.xml doesn't exits
  2. python怎么区别同名窗口,win32gui选择两个同名窗口
  3. openfire4.5.2安装部署与基础设置
  4. powerdesign的使用
  5. powerDesign16.5修改name的时候不改变code
  6. Onvif协议学习:1、Onvif与Onvif Profile协议基本概念
  7. 学习系统编程No.15【深入动静态库】
  8. 在Java中搭建一个简单的MVC框架
  9. Win32 GetKeyState和getasynckeystate
  10. php正则匹配包含某个字符串,php正则如何不包含某字符串