1:先创建一个maven项目(这边创建了eureka,服务发现者)
1.1这是我的pop.xml
jdk1.8
artifactId demo
name demo
docker.image.profix zhujm
构建的plugins的imagename就是zhujm/demole
<?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.zzy.demo</groupId> <artifactId>demo</artifactId> <name>demo</name> <version>1.0.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> <relativePath></relativePath> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <!-- The main class to start by executing java -jar --> <start-class>com.zzy.demo.Main</start-class> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <docker.image.prefix>zhujm</docker.image.prefix> <spring.boot.version>1.3.3.RELEASE</spring.boot.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> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-server</artifactId> <version>1.2.3.RELEASE</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <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.3</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> <!-- end::plugin[] --> </plugins> </build> </project>
Spotify 的 docker-maven-plugin 插件是用于构建 Maven 的 Docker Image
- imageName指定了镜像的名字,本例为${docker.image.prefix}/${project.artifactId}
- dockerDirectory指定 Dockerfile 的位置见下图
- resources是指那些需要和 Dockerfile 放在一起,在构建镜像时使用的文件,一般应用 jar 包需要纳入。本例,只需一个 jar 文件。
1.2:这就是我的Main主程序
package com.zzy.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
1.3:这是我的配置文件
server.port=8000 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/1.4这是我的目录结构
以上的资源参考http://blog.csdn.net/canot/article/details/52888597
2.1:Dockerfile 的内容如下
FROM frolvlad/alpine-oraclejdk8
VOLUME /tmp
ADD demo-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
这个参考下http://blog.csdn.net/wsscy2004/article/details/25878223可以知道其中的意思
其中from是指该项目基于什么,由于我们这边是jar所以基于jdk,frolvlad/alpine-oraclejdk8这个是jdk在docker-hub那边的镜像,不过这个镜像有问题
我们使用这个
frolvlad/alpine-oraclejdk8:slim
VOLUME 是挂在地点,持久化
add 是将文件重命名
enrtypoint不知道
- FROM(指定基础image)
VOLUME
指定了临时文件目录为/tmp
。其效果是在主机/var/lib/docker
目录下创建了一个临时文件,并链接到容器的/tmp
。改步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp
目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp
作为工作目录- 项目的 jar 文件作为 "app.jar" 添加到容器的
ENTRYPOINT
执行项目 app.jar。为了缩短 Tomcat 启动时间,添加一个系统属性指向 "/dev/urandom" 作为 Entropy Source
2.2linux安装docker
在linux服务器上装好docker,我的linux版本为centos7,这里不建议使用#yum install docker方式安装,因为这种方式安装的版本比较旧,而且在配置远程api时要好多错误,建议使用方式
#curl -fsSL https://get.docker.com/ | sh或#yum install docker-engine,这里以17.0.3-ce版本为例,使用
#docker version命令即可验证是否安装成功,接下来要想在windows中操作远程linux中的docker,那前提是必须
开启docker远程API,修改docker配置文件#vi /usr/lib/systemd/system/docker.service ,进入编辑模式后,将ExecStart这一行后面加上 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock ,改完后如下所示
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock ,这里就写4个0,你可别改成自己的ip哦,保存后退出,重新加载配置文件#systemctl daemon-reload ,启动docker #systemctl start docker ,
输入#netstat -anp|grep 2375 显示docker正在监听2375端口,输入#curl 127.0.0.1:2375/info 显示一大堆信息,证明远程api就弄好了
2.3创建docker账户
https://hub.docker.com/去这里注册个账户
Create Repository
2.3构建 Docker Image
执行构建成为 docker image: