极简的docker教程-在docker上运行微服务
文章目录
- 用一个简单的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上运行微服务相关推荐
- 使用Quarkus在Openshift上构建微服务的快速指南
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! [重磅]到底是什么野生海鲜美味,惹得人们都往泥瓦匠老家买? 作者 | 康仔 来源 | 公众号 ...
- Docker教程(一) Docker入门教程
Docker教程(一) Docker入门教程 本文链接:https://blog.csdn.net/yuan_xw/article/details/51935278 Docker教程(一) Docke ...
- Docker教程(二) Docker环境安装
Docker教程(二) Docker环境安装 本文链接:https://blog.csdn.net/yuan_xw/article/details/77248243 Docker教程(二) Docke ...
- Docker教程(四) Docker镜像构建
Docker教程(四) Docker镜像构建 本文链接:https://blog.csdn.net/yuan_xw/article/details/77744272 Docker教程(四) Docke ...
- Docker教程(三) Docker网络访问和数据管理
Docker教程(三) Docker网络访问和数据管理 本文链接:https://blog.csdn.net/yuan_xw/article/details/77504077 Docker教程(三) ...
- grpc入门到精通_gRPC[go语言]大师教程,构建现代化Api和微服务
gRPC [Golang] Master Class Build Modern API & Microservices gRPC[go语言]大师教程,构建现代化Api和微服务 比REST AP ...
- 使用feign调用注解在eureka上的微服务,简单学会微服务
使用feign调用注解在eureka上的微服务. 首先,确保所有服务(调用方与被调用方)都被注册在同一个eureka服务上. 1. 在调用方添加依赖(万事第一步,加依赖) <dependency ...
- apache karaf_未来是Apache Karaf上的微服务架构
apache karaf 这是Jamie Goodyear的客座博客文章( 博客 , @ icbts ). 他是Savoir Technologies的开源倡导者,Apache开发人员和计算机系统分析 ...
- 未来是Apache Karaf上的微服务架构
这是Jamie Goodyear的客座博客文章( 博客 , @ icbts ). 他是Savoir Technologies的开源倡导者,Apache开发人员和计算机系统分析师: 他为全球大型组织设计 ...
最新文章
- 华为10GE LAN板与Wan板区别
- 基于区块链的健康链系统设计与实现(6)结束语
- [WC 2011]Xor
- C#中DataTable中的Compute方法使用收集
- 漫画算法:辗转相除法是什么鬼
- [Leetcode][第257题][JAVA][二叉树的所有路径][BFS][DFS]
- 成功加入微软GDI计划
- AnkhSVN的使用
- 5岁自学python编程-人工智能时代,孩子需要什么?
- 学计算机要学工图吗,工程图学及计算机绘图: 非机类
- 演唱会网上订票系统(SSM,JSP,MYSQL)
- 我一直在维护的石墨文档开源了
- 程序员的有个坏习惯!
- 微信800android1840,微信8.0版本官方版
- 博士申请 | 港中深韩晓光课题组招收与华为中央媒体院联合培养博士生
- word页码与行号怎么统一设置字体
- Yapi idea插件使用
- java做五子棋 视频_java swing实现五子棋小游戏项目源码附带视频指导运行教程...
- 市值将近腰斩,三七互娱真的“失”在买量上吗?
- 网上购车平台其实也可以这样上私户
热门文章
- Maven工程下,解决配置文件相关的File doesn't exits,以及xxxMapper.xml doesn't exits
- python怎么区别同名窗口,win32gui选择两个同名窗口
- openfire4.5.2安装部署与基础设置
- powerdesign的使用
- powerDesign16.5修改name的时候不改变code
- Onvif协议学习:1、Onvif与Onvif Profile协议基本概念
- 学习系统编程No.15【深入动静态库】
- 在Java中搭建一个简单的MVC框架
- Win32 GetKeyState和getasynckeystate
- php正则匹配包含某个字符串,php正则如何不包含某字符串