将spring boot在win10上打包后的jar, 上传到docker所在的vm, 再在docker中编写Dockerfile, 用docker build 命令生成镜像,
这是我最开始生成spring boot镜像的过程。但这很麻烦。今天搞个稍微自动化点的:通过maven插件, 主要是 dockerfile-maven-plugin, maven-deploy-plugin
直接在win 10上把spring boot的docker image上传到远程私有仓库。
0. 准备工作
1. 远程私有仓库, 看 docker registry 2 with tls and basic authentication
远程私有仓库,是指docker上运行的一个registry:2的一个容器。这个远程仓库使用证书和用户名密码。
2. 远程docker
远程docker是指linux里运行的docker进程。不道我说明白没。 :)
因为不想在windows 10上安装 docker toolbox, 所以就用了一个远程的docker(局域网), 这个要开启远程访问:
改 /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd 后加 -H tcp://0.0.0.0:2395 端口随意,这里用2395,不用默认的2375.
改完变这样: ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2395 ... 省略号表示这一行后面的不动。
然后要 # systemctl daemon-reload && systemctl restart docker, (直接运行systemctl restart docker, 会提示让你 systemctl daemon-reload)
(我的环境是远程私有仓库和远程docker用的是同一个vm, centos 7.x 环境)
1. 弄个spring boot项目:
只有一个java文件: ex.boot.Application.java, 这个文件要放到ex.boot包。
package ex.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class Application { public static void main(String... args) { SpringApplication.run(Application.class, args); } @GetMapping("/hello") public String hello() { return "hello"; } }
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ex.boot</groupId> <artifactId>spring-boot-remote-docker-registry</artifactId> <version>0.2</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.4.RELEASE</version> </parent> <properties> <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <finalName>${project.artifactId}-${project.version}</finalName> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <mainClass>ex.boot.Application</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <!-- dockerfile-maven-plugin, 不是docker-maven-plugin, 后者已经不建议使用了。--> <version>1.4.13</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <username>tom</username> <!-- 远程仓库的用户名, 不是远程docker --> <password>12345678</password> <!-- 密码 --> <repository>node1.org/spring-boot-wlz/hello</repository> <!-- 格式: repository_name/image-name, 这里 image-name就是 spring-boot-wlz/hello --> <tag>0.2</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> <!-- 这一行用于Dockerfile, 这里暂时是没用的,因为我的Dockerfile里没有用于它,就放着吧 --> </buildArgs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <!-- 没有这个插件 docker push 不会成功 --> <artifactId>maven-deploy-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build> <distributionManagement> <repository> <id>private.repo</id> <!-- 随意 --> <name>private repo</name> <!-- 随意 --> <url>node1.org</url> <!-- 远程仓库的域名,在win 10的hosts里要加上,位置在 C:WindowsSystem32driversetchosts --> </repository> </distributionManagement> </project>
Dockerfile 位于project根目录,就是和pom.xml同一级目录
FROM java:8 ENTRYPOINT ["java", "-jar", "spring-boot-remote-docker-registry-0.2.jar"] ADD target/spring-boot-remote-docker-registry-0.2.jar spring-boot-remote-docker-registry-0.2.jar
2. 几个注意的地方
1. 要win 10的环境变量里加上 DOCKER_HOST=192.168.1.69:2395 这个是远程docker的IP和端口
也可以在cmd中, 运行mvn deploy前, 设置一下: set DOCKER_HOST=192.168.1.69:2395. 但这个要每次打开cmd窗口后,都要设置,cmd窗口一关,DOCKER_HOST的设置就不能再用了。
相对来说,环境变量的方式一劳永逸。
2. C:WindowsSystem32driversetchosts, 这个文件里加一行:
192.168.1.69 node1.org
3. pom.xml里要有私有仓库的配置
<distributionManagement>
<repository>
<id>private.repo</id>
<name>private repo</name>
<url>node1.org</url>
</repository>
</distributionManagement>
3. 运行: mvn deploy
一行命令搞定,这样每个开发人员每次就这样发布一下就行了。然后,k8s再用私有仓库的 image 发布到集群里。
或者开发人员只要提交代码, 上述过程由jenkins 自动 来完成。