如何通过 docker 远程构建 springboot 镜像

我有一台阿里云服务器,上面安装了 docker 环境,同时,我的本机 mac 电脑也安装了 docker 环境,我想在本机电脑上构建 springboot 项目的镜像并将它推送到阿里云的 docker 环境中,我应该怎么做?

1 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

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 一下,就可以运行项目了。