Docker Maven插件本地构建镜像发布至远程服务器

环境:使用阿里云ECS服务器及Ubuntu 16.04进行测试

1 Ubuntu 16.04安装Docker

1.1安装步骤

# step 1: 安装必要的一些系统工具,添加apt支持https的URLs(如不存在/usr/lib/apt/methods/https这个文件,先安装apt-transport-https包)
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

1.2安装后查看版本信息

docker -v

1.3可以从镜像仓库拉取一个测试镜像

docker pull hello-world

1.4查询可用镜像

docker images

1.5启动docker服务

service docker start

1.6启动测试镜像

docker run hello-world

2 创建测试工程

2.1使用IDEA生成一个基础的Spring Boot工程

2.2在pom文件中添加docker-maven-plugin插件

<?xml version="1.0" encoding="UTF-8"?>
<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>com.laravelshao.springboot</groupId>
   <artifactId>deploy-docker</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>deploy-docker</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
   </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>
         <!--docker maven 插件-->
         <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
               <imageName>micro-deploy-docker</imageName>
               <!--注意 修改成远程服务器地址-->
               <dockerHost> http://X.X.X.X:2375</dockerHost>
               <dockerDirectory>docker</dockerDirectory>
               <resources>
                  <resource>
                     <targetPath>/</targetPath>
                     <directory>${project.build.directory}</directory>
                     <include>${project.build.finalName}.jar</include>
                  </resource>
               </resources>
            </configuration>
            <dependencies>
               <dependency>
                  <groupId>org.apache.httpcomponents</groupId>
                  <artifactId>httpclient</artifactId>
                  <version>4.4</version>
               </dependency>
            </dependencies>
         </plugin>
      </plugins>
   </build>

</project>

2.3在工程根目录下添加docker文件夹并添加Dockerfile文件

FROM frolvlad/alpine-oraclejdk8:slim

VOLUME /opt/common

ADD deploy-docker-0.0.1-SNAPSHOT.jar app.jar

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

EXPOSE 8080

2.4提供一个测试接口

@RestController
public class DemoController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello world docker";
    }
}

2.5构建镜像并发布到远程服务器

mvn clean package docker:build

2.6查看相关博客后发现远程服务器必须开启docker远程api

解决方法:

①在/etc/systemd/system目录下新建目录docker.service.d,并新建文件http-proxy.conf,添加以下内容保存

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

②重新载入配置

systemctl daemon-reload

③重启docker服务

service docker restart

④查看docker进程,发现配置已经更新

ps -ef | grep docker

2.7再次尝试构建镜像发布到远程服务器,还是报连接失败

mvn clean package docker:build

解决方法:

实在不知道那还有问题,就尝试在阿里云ECS管理控制台有没有相关设置,突然看到有一个安全组配置,添加一个安全组规则

2.8 第三次尝试构建镜像发布到远程服务器,总算推送成功

mvn clean package docker:build

2.9查询可用镜像,存在刚才构建的镜像

docker images

2.10启动当前镜像

docker run -p 8080:8080 micro-deploy-docker:latest

2.11请求测试接口http://X.X.X.X:8080/hello,发现无法访问,这时需要在阿里云的安全组中开放8080端口供服务请求使用

添加规则之后再次请求,总算成功了,不容易。

文章来源:

Author:LaravelShao
link:https://my.oschina.net/LaravelShao/blog/1603147