如何通过 docker 远程构建 springboot 镜像
我有一台阿里云服务器,上面安装了 docker 环境,同时,我的本机 mac 电脑也安装了 docker 环境,我想在本机电脑上构建 springboot 项目的镜像并将它推送到阿里云的 docker 环境中,我应该怎么做?
1 个解决方案
1. 开启 docker 远程访问权限
- CentOS 6
修改 /etc/default/docker 文件,重启后生效(service docker restart)。
DOCKER_OPTS="-H=unix:///var/run/docker.sock -H=0.0.0.0:2375"
- CentOS 7
打开 /usr/lib/systemd/system/docker.service 文件,修改 ExecStart 这行。
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
重启后生效
systemctl daemon-reload
systemctl restart docker.service
测试是否生效
curl http://127.0.0.1:2375/info
2. 修改你的 pom.xml 文件
<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">
<groupId>com.exception</groupId>
<artifactId>qms</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<docker.image.prefix>exception</docker.image.prefix>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<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.14</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<dockerHost>http://192.168.1.200:2375</dockerHost>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置参数解释:
-
imageName:指定了镜像的名字
-
dockerDirectory:指定 Dockerfile 的位置
-
dockerHost:指定 Docker 远程 API 地址
-
resources:指那些需要和 Dockerfile 放在一起,在构建镜像时使用的文件,一般应用 jar 包需要纳入
3. 创建 Dockerfile
在 src/main/docker 目录下创建一个名为 Dockerfile 的文件,配置如下:
# FROM 指定使用哪个镜像作为基准
FROM openjdk:8-jdk-alpine
# VOLUME 为挂载路径 -v
VOLUME /tmp
# ADD 为复制文件到镜像中
ADD qms-1.0.0-SNAPSHOT.jar app.jar
# RUN 为初始化时运行的命令 touch 更新 app.jar
RUN sh -c 'touch /app.jar'
# ENV 为设置环境变量
ENV JAVA_OPTS=""
# ENTRYPOINT 为启动时运行的命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
项目结构如下:
4. 通过 maven 构建镜像
package docker:build -Dmaven.test.skip=true
控制台输出:
/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java -Dmaven.multiModuleProjectDirectory=/Users/a123123/Work/IdeaProjects -Dmaven.home=/Users/a123123/Work/apache-maven-3.5.3 -Dclassworlds.conf=/Users/a123123/Work/apache-maven-3.5.3/bin/m2.conf -Dfile.encoding=UTF-8 -classpath /Users/a123123/Work/apache-maven-3.5.3/boot/plexus-classworlds-2.5.2.jar org.codehaus.classworlds.Launcher -Didea.version=2017.3.5 package docker:build -Dmaven.test.skip=true
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.exception:qms >--------------------------
[INFO] Building qms 1.0.0-SNAPSHOT
[INFO] --------------------------------[jar]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ qms ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 467 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ qms ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ qms ---
[INFO] Not copying test resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ qms ---
[INFO] Not compiling test sources
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ qms ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ qms ---
[INFO] Building jar: /Users/a123123/Work/IdeaProjects/exception/question-ms/target/qms-1.0.0-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.5.10.RELEASE:repackage (default) @ qms ---
[INFO]
[INFO] --- docker-maven-plugin:0.4.13:build (default-cli) @ qms ---
[INFO] Copying /Users/a123123/Work/IdeaProjects/exception/question-ms/target/qms-1.0.0-SNAPSHOT.jar -> /Users/a123123/Work/IdeaProjects/exception/question-ms/target/docker/qms-1.0.0-SNAPSHOT.jar
[INFO] Copying src/main/docker/Dockerfile -> /Users/a123123/Work/IdeaProjects/exception/question-ms/target/docker/Dockerfile
[INFO] Building image exception/qms
Step 1/6 : FROM openjdk:8-jdk-alpine
---> 224765a6bdbe
Step 2/6 : VOLUME /tmp
---> Using cache
---> 84294cfa1895
Step 3/6 : ADD qms-1.0.0-SNAPSHOT.jar app.jar
---> 5fc2606407c8
Step 4/6 : RUN sh -c 'touch /app.jar'
---> Running in 81ae91524df1
Removing intermediate container 81ae91524df1
---> 606c9ddf246c
Step 5/6 : ENV JAVA_OPTS=""
---> Running in 177b9eb16988
Removing intermediate container 177b9eb16988
---> 7e8a7f4e8103
Step 6/6 : ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
---> Running in 98e91ca62b53
Removing intermediate container 98e91ca62b53
---> 607aada5e3ab
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 607aada5e3ab
Successfully tagged exception/qms:latest
[INFO] Built exception/qms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:03 min
[INFO] Finished at: 2018-05-26T23:26:03+08:00
[INFO] ------------------------------------------------------------------------
Process finished with exit code 0
再去阿里云服务验证一下:
可以看到构建的 springboot 项目镜像已经出现在阿里云的 docker 环境中,接下来只要 run 一下,就可以运行项目了。