springboot2.x+docker部署
这篇文章是我研究了一个下午,出现了好多的问题,百度了很多的内容,这里怕自己忘记,做一个简单的记录!关于docker,这里我就不做过多的阐述了,我以前的文章有过详细的介绍和安装,这里给一个连接 docker的介绍和安装.这里我们使用的工具还是idea,初始化一个springboot项目出来,只引一个web依赖,一直next到最后就好了,如下图所示
修改项目启动类,添加一个简单的get请求,用来验证我们之后是否发布成功
修改pom文件,添加docker插件,代码如下
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!-- docker私服的地址 -->
<dockerHost>http://10.116.18.162:2375</dockerHost>
<!--镜像名称以及版本号-->
<imageName>demo:1.0.0</imageName>
<!--依赖的基础镜像-->
<baseImage>java</baseImage>
<!--Dockerfile的位置 -->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>
在src/main下面新建一个docker目录,并建一个Dockerfile文件,此时的目录结构如下:
Dockerfile内容如下
FROM java:8
MAINTAINER demo [email protected]
VOLUME /ROOT
ADD demo-0.0.1-SNAPSHOT.jar demo.jar
RUN bash -c 'touch /demo.jar'
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "demo.jar"]
对Dockerfile里面的内容做一个简单的介绍:
1.FROM:指明当前镜像继承的基镜像,编译当前镜像时候会自动下载基镜像
2.MAINTAINER:当前镜像的作者和邮箱,使用空格隔开
3.VOLUME:挂载目录
4.ADD:从当前工作目录复制文件到镜像目录中并重新命名
5.RUN:在当前镜像上执行Linux命令,这里我执行了2个run指令,第二个run指令是为了解决容器和宿主机时间不一致的问题
6.EXPOSE:监听的端口号
7.ENTRYPOINT:让容器像一个可执行程序一样运行
到这里我们对于代码的修改就完成了,下面我们在idea的命令行执行maven命令,或者点击idea的maven插件中的docker:build
mvn clean install -DskipTests docker:build
或者
这里我们可能会遇到一个问题,docker远程连接失败,提示我们连接被拒绝(failed: Connection refused: connect),解决方法如下:
1.进入docker私服所在的服务器,编辑配置文件
vim /usr/lib/systemd/system/docker.service
2.在docker.service的[Service]下增加如下内容:
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
3.重新加载配置文件
systemctl daemon-reload
4.重启docker
systemctl restart docker
当我们在控制台看到如下内容就说明我们发布镜像到私服成功了,
这时我们去服务器看一下我们的镜像,输入docker命令,查看镜像就可以看到我们刚才上传的名称为demo的镜像了
docker images
镜像列表
下面我们就可以使用命令启动我们的项目了:
docker run -d --name demo -p 8000:8080 -v /Logs/demo:/Logs/demo -v demo:1.0.0
启动过程中,我碰到了2个问题,通过万能的百度解决了,大致就是下面2个问题
1.报错信息:
/usr/bin/docker-current: Error response from daemon: driver failed programming
external connectivity on endpoint naughty_goldwasser
(d430dba4b36beeac0aaf4cb2fd257482ee074d1b4295d04ba92709284388696c):
exec: "docker-proxy": executable file not found in $PATH.
大概的意思是说:docker 启动需要exec: “docker-proxy”,但是在$PATH中没有找到
解决办法:
ln -s /usr/libexec/docker/docker-proxy-current /usr/bin/docker-proxy
2.报错信息:
/usr/bin/docker-current: Error response from daemon:
shim error: docker-runc not installed on system.
这个的意思是:系统没有安装 docker-run,其实我们是有的,需要建立一个软连接
解决办法:
cd /usr/libexec/docker/
ln -s docker-runc-current docker-runc
当shell窗口中出现一串代码,并且没有报错信息的时候就说明我们启动成功了,我们去控制台访问一下我们刚才写的get请求,看到下面的内容就说明我们启动成功了!!
PS:返回上面我们的镜像列表,发现有一个名称为<none>的无名镜像,这是因为我们上传了2个名称相同的镜像,docker会把名称赋值给我们较新的镜像,原先较旧的镜像也不会覆盖,而是会变为一个无名镜像,解决办法可以在命令行输入下面的命令:
docker rmi $(docker images | grep "none" | awk '{print $3}')