最近在学springCloud微服务,突然想把微服务部署到docker上,于是就开始有了如下坎坷的经历。
springCloud原理配置什么的,我不做过多赘述了,就挑重点讲吧。
首先是环境,在windows上装docker,会附送这三个玩意,一般只用前两个,第三个据说不稳定啥的,我也没试过,第一个就是docker启动的客户端,第二个就是虚拟机(linux)。。。我都是第一次用。。。
先说说我遇到的问题吧,在项目pom.xml文件中(这个项目在本地测试通过)加入了如下代码:
在我预想中应该是顺顺利利能编译过的,因为我是抄来的,但是,无论是本机还是上传到虚拟机进行mvn clean install -DskipTest都会爆以下错误:
Failed to execute goal com.spotify:docker-maven-plugin:1.1.1:build (default) on project bookshop-Repository: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: com.spotify.docker.client.shaded.org.apache.http.client.ClientProtocolException: Cannot retry request with a non-repeatable request entity: Connection reset by peer: socket write error -> [Help 1]
接下来几天陆陆续续我就在想办法解决这个问题。。。试了好多方法都搞不定,正当我快放弃的时候。突然灵机一动,docker不是容器技术嘛,容器运行的都是image,而先前在pom中加的那段代码就是将jar包重新打包生成image。。。所以,就有了如下操作,
1、我在本地打jar包;
2、我把jar包和所需配置文件传到虚拟机;
3、我在虚拟机执行docker build制造image ;
4、执行docker-compose up命令启动容器。
然后就成功了,所以说绝望的时候就是快成功的时候,never give up!!!下面我尽量详细的说一说操作过程:
1、docker安装好(for windows 7 64位)
2、并且使用docker pull java 、docker pull consul(因为我的服务是注册在consul)
使用docker images能看到如下的图,证明装好了
3、添加Docker的network,相同network中的镜像可以直接通过名称访问
docker network create t1
4、在本地把jar包打好并放入公共目录(此目录就是本机和虚拟机公共目录,我懒得上传了,差不多意思可以了)
5、在公共目录下创建Dockerfile文件,代码如下:(其实意思和pom中的差不多)
FROM java
VOLUME /tmp
ADD bookshop-Repository-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java", "-Dvertx.disableDnsResolver=true", "-jar", "/app.jar"]
6、在公共目录下创建docker-compose.yml文件,代码如下(用于docker-compose up 命令)
version: "0.1"
services:
consul:
image: consul
container_name: consul
ports:
- "8500:8500"
net: t1
book-Repository:
image: bookshop_repository
container_name: book-Repository
ports:
- "9001:9001"
links:
- consul
net: t1
此时公共目录下应该有三个文件
7、移步至docker 客户端,目录切到公共目录下,执行docker build -t bookshop-repository .
8、执行docker-compose up -d (-d其实是后台执行,不加也可以)
9、根据配置consul是在8500端口,bookshop-repository在9001端口,测试通过~~
注:192.168.99.100是docker地址,在启动的时候你可以看到。
后记,这次尝试绕了点圈子,不过还是成功了,但毕竟是野路子,通常情况下还是应该