前言
刚接触docker,之前学了怎么pull别人的镜像,今天写了个demo想学习一下自己的项目怎么打包成镜像,再发布到docker hub上,记录一下。
总结一下大概流程就是在idea上配置docker, 然后把自己的项目打包成jar包,再打包成镜像在容器里运行一下,确定运行没有问题之后再登录自己的docker hub,把镜像传上去。
环境
windows10, idea 2022, jdk 8,maven
具体步骤
1.使用maven给项目打成jar包
点package
注意:这里记录几个问题
(1)我一开始就是直接打包的,然后terminal运行jar包报错,如下
查了一下问题是打包的时候要制定main class,解决方案是在pom.xml里添加:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.fisco.Application</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
红线的地方写自己主类的位置
我的main class 位置
(2)修改上面的问题之后,再运行又报错:
查了一番资料,感觉是maven打包出的问题,目前没解决这个问题,我在主函数里没有使用这个包
2.idea连接docker
(1)在 File-> Settings 里安装docker插件
(2)连接docker
在 File-> Settings->build,execution,deployment->Docker,点上面那个+,填写右边的配置信息。
注意connect to docker daemon with:的选项,我看了很多文章,发现大家都没有docker for windows的选项,不知道为啥,可能idea版本问题??很多人都用的TCP socket连接,感觉很麻烦,暂时留个坑,下次弄了来填。
选了docker for windows之后他就自动连上了,下面会显示连接成功。
(3)编写docker file
我新建了一个file,取名Dockerfile 放在target目录下面,HelloWorld-1.0-SNAPSHOT.jar是我打包的jar包
我的docker file内容,docker file语法参照这篇文章Docker 基础之Dockerfile命令详解,根据自己需求进行修改
##使用 JDK 8 环境为基础镜像,如果镜像不是本地的将会从 DockerHub 进行下载
FROM java:8
#作者
MAINTAINER cnzhangxy
#复制上下文目录下的target/demo-0.0.1-SNAPSHOT.jar 到容器里
COPY HelloWorld-1.0-SNAPSHOT.jar HelloWorld-1.0-SNAPSHOT.jar
#声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务
EXPOSE 8081
#指定容器启动程序及参数 <ENTRYPOINT> "<CMD>"
ENTRYPOINT ["java","-jar","HelloWorld-1.0-SNAPSHOT.jar"]
(4)添加项目Docker运行配置
点Edit configurations
点“+”
点 Docker-> dockerfile
3.在容器内运行
把configuration换成docker,再点击运行
会发现下面弹出docker的窗口,就可以看到自己的docker的信息啦,可以在images和containers可以看见刚刚新建的镜像和容器。
4.上传docker hub
确定在容器内的运行是正确的之后就可以发布在docker hub上了
(1)登录:docker login -u 你的用户名
(2)输入密码,登陆成功后,在推送前,必须将你的镜像命名规范格式,否则会失败。输入如下命令:
docker tag 镜像id 你的docker账户名/新的镜像名:版本号
例:docker tag c3e2d1273618 cnzhangxy/demo:1.0
(3)规范格式后可以推送镜像
docker push 用户名/镜像名:标签(版本号)
例:docker push cnzhangxy/demo:1.0
5.结束
打开docker hub,登陆之后就能看见自己的镜像啦