docker部署jar包的⼏种⽅式
docker部署jar包的⼏种⽅式
前⾔
简单记录⼀下docker打包jar部署的⼏种⽅式,避免以后忘记,不过这种⼿动的⽅式应⽤应该不多!
现在微服务⼤多数采⽤集部署⽅式,使⽤k8s或者swarm配合docker+jenkins等实现⾃动化部署集及动态扩展等,后⾯再慢慢写相关的吧。没有服务器资源演⽰,懒得弄 !
使⽤Dockerfile⼿动打包jar
简单打包运⾏
docker安装和使⽤基础看这⾥:
我这⾥就⽤前⼏天写的SpringCloudAlibabaDemo做演⽰吧,需要演⽰⼯程的看这⾥:
user模块已久打包成jar了,如下:
把jar上传到你的服务器,我这⾥就在本机演⽰,直接cp到/opt/java_app_docker⽬录下
在相同⽬录下创建Dockerfile
sudo vim Dockerfile
然后输⼊:
# 拉取jdk8作为基础镜像
FROM java:8
# 作者
MAINTAINER zbdemo <zbdemo@163>
# 添加jar到镜像并命名为user.jar
ADD user-0.0.1-SNAPSHOT.jar user.jar
# 镜像启动后暴露的端⼝
EXPOSE 8001
# jar运⾏命令,参数使⽤逗号隔开
ENTRYPOINT ["java","-jar","user.jar"]
然后使⽤docker命令打包:
docker build -t user .
user表⽰镜像名称
最后的.表⽰Dockerfile在当前⽬录
打包完成后使⽤docker images查看镜像
使⽤docker run命令创建并运⾏容器:
docker run -d --name user -p 8001:8001 user
命令解释如下:
命令功能
docker run创建并启动容器
–name指定⼀个容器名称
-d后台运⾏容器,并返回容器ID
-p指定端⼝
user需要启动的镜像(名称+版本)不指定版本默认最新版本
:符号左边为宿主机,右边为容器空间
命令功能
启动完成,查看启动⽇志:
docker logs -f -t user
jar⽇志启动成功,查看容器:
docker ps
访问⼀下,测试效果:
localhost:8001/hello/hello
没错,⼿动docker打包jar镜像并运⾏完成了,但是这样搞就显得有点呆,还不如直接java -jar运⾏呢!操作这么⿇烦,每次更新还要删除容器,删除镜像重新创建,⽽且⽇志⽂件等重要信息也会丢失!当然如果你使⽤jenkins等shell⾃动化的⼯具当我没说
进化:可复⽤容器
⾸先停⽌并删除刚刚创建的容器和镜像
停⽌容器:
docker stop user
删除容器:
docker rm user
删除镜像:
docker rmi user
修改Dockerfile⽂件
sudo vim Dockerfile
修改后内容如下(给jar安排了⼀个⽬录,⽅便挂载到宿主机):
# 拉取jdk8作为基础镜像
FROM java:8
# 作者
MAINTAINER zbdemo <zbdemo@163>
# 添加jar到镜像并命名为user.jar
ADD user-0.0.1-SNAPSHOT.jar /app/user.jar
# 镜像启动后暴露的端⼝
EXPOSE 8001
# jar运⾏命令,参数使⽤逗号隔开
ENTRYPOINT ["java","-jar","/app/user.jar"]
然后在/opt/java_app_docker⽂件夹下⾯创建jar挂载⽬录
sudo mkdir app
把你的jar包cp⼀份到宿主机/opt/java_app_docker/app⽬录下并改名为user.jar 这⾥⼀定要在app⽬录下存放你的jar,不然容器启动会失败,不到jar
打包镜像-创建并运⾏容器
打包镜像:
docker build -t user .
创建并运⾏容器:
docker run -d --name user -p 8001:8001 -v /opt/java_app_docker/app:/app user
命令解释如下:
命令功能
docker run创建并启动容器
–name指定⼀个容器名称
-d后台运⾏容器,并返回容器ID
maven打包本地jar包
-
p指定端⼝
user需要启动的镜像(名称+版本)不指定版本默认最新版本
-v挂载⽬录到宿主机
:符号左边为宿主机,右边为容器空间
命令功能
这样的⽅式启动完成之后,更新服务时只需要更换宿主机/opt/java_app_docker/app⽬录下的jar包,然后重启容器即可实现更新,省略了每次更新删除打包创建等过程
究极进化:jdk镜像直接创建可服⽤容器
上⾯的⽅式在单应⽤情况下是可⾏的,但是如果我是微服务架构呢?⽐如现在我要部署我的gateway⽹关服务,是不是还要重新⾛⼀遍流程?很呆
⾸先停⽌并删除刚刚创建的容器和镜像
停⽌容器:
docker stop user
删除容器:
docker rm user
删除镜像:
docker rmi user
查看jdk版本
docker images
我这⾥是openjdk8
创建并运⾏容器(直接基于jdk镜像创建容器):
docker run -d --name user -p 8001:8001 -v /opt/java_app_docker/app:/app java:8 /usr/bin/java -jar /app/user.jar
命令解释如下:
命令功能
docker run创建并启动容器
–name指定⼀个容器名称
-d后台运⾏容器,并返回容器ID
-p指定端⼝
-v挂载⽬录到宿主机
java:8需要启动的镜像(名称+版本)不指定版本默认最新版本
/usr/bin/java -jar /app/user.jar jar启动命令及jar所在位置,因为创建的容器挂在了宿主机/opt/java_app_docker/app⽬录,所以⾥⾯映射了我们上⾯
放进去的user.jar
:符号左边为宿主机,右边为容器空间
这样的⽅式省略了创建Dockerfile并把jar打包成镜像的操作,⽆论多少个服务,只要有jdk镜像,⼀条命令搞定!⽐如现在我需要增加gateway服务,那就把gateway.jar放在任意⽬录下,直接执⾏:
docker run -d --name user -p ${任意外部端⼝} {任意容器端⼝} -v ${你的gateway.jar存放⽬录}:/${任意容器内⽬录名称} java:8 /usr/bin/java -jar /${任意容器内⽬录名称}/gateway.jar
这种⽅式也是直接替换挂载⽬录下jar,然后docker restart 容器ID or 名称 就⾏
超究极进化:maven插件打包(不推荐)
为什么不推荐呢?⾸先是maven插件直接打包docker镜像的⽅式污染⼯程,反正就很奇怪的感觉,其次你的项⽬是要发布⽣产环境的,直接打包镜像给运维,太卷了吧?
所以综上所属,我就简单介绍下
pom添加docker打包⽅式
<!--docker 镜像插件-->
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<imageName>${project.artifactId}</imageName>
<dockerDirectory>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>
创建Dockerfile⽂件
内容如下:
# 基础镜像使⽤java
FROM java:8
# 作者
MAINTAINER zbdemo
# 将jar包添加到容器中并更名为app.jar
ADD gateway-0.0.1-SNAPSHOT.jar gateway.jar
EXPOSE 8000
ENTRYPOINT ["java","-jar","gateway.jar"]
命令⽅式
打包:
mvn package -st.skip=true docker:build
本机docker
保存镜像到本地docker:
docker save -o /gateway.jar gateway
查看镜像:
docker images
创建并运⾏容器:
docker run --name gateway -p 8000:8000 -d gateway
服务器docker
或者上传到服务器:
scp /gateway.jar root@ip:/opt/app
加载镜像:
docker load </opt/app/gateway.jar
查看镜像:
docker images
创建并运⾏容器:
docker run --name gateway -p 8000:8000 -d gateway.tar
或者这样
打包
推送
⽆聊的进化:maven打包⾃动推送镜像到指定服务器(不推荐,研发环境随便玩)
准备⼯作
开启服务器的docker远程访问权限:⾃⾏百度?反正我不想这样玩
pom修改如下:
<!--docker 镜像插件-->
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<imageName>${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<!-- docker容器地址 -->
<dockerHost>192.168.101.1:2375</dockerHost>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
打包:
mvn package -st.skip=true docker:build
或者
完成去服务器docker images看⼀下应该有了
关于docker容器启动后注册到nacos的ip是docker容器ip问题!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。