springboot2.x+docker部署

  这篇文章是我研究了一个下午,出现了好多的问题,百度了很多的内容,这里怕自己忘记,做一个简单的记录!关于docker,这里我就不做过多的阐述了,我以前的文章有过详细的介绍和安装,这里给一个连接 docker的介绍和安装.这里我们使用的工具还是idea,初始化一个springboot项目出来,只引一个web依赖,一直next到最后就好了,如下图所示springboot2.x+docker部署
springboot2.x+docker部署
修改项目启动类,添加一个简单的get请求,用来验证我们之后是否发布成功
springboot2.x+docker部署
修改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文件,此时的目录结构如下:
springboot2.x+docker部署
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

或者
springboot2.x+docker部署
  这里我们可能会遇到一个问题,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 

  当我们在控制台看到如下内容就说明我们发布镜像到私服成功了,
springboot2.x+docker部署
  这时我们去服务器看一下我们的镜像,输入docker命令,查看镜像就可以看到我们刚才上传的名称为demo的镜像了

docker images

镜像列表
springboot2.x+docker部署
下面我们就可以使用命令启动我们的项目了:

 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请求,看到下面的内容就说明我们启动成功了!!
springboot2.x+docker部署
  PS:返回上面我们的镜像列表,发现有一个名称为<none>的无名镜像,这是因为我们上传了2个名称相同的镜像,docker会把名称赋值给我们较新的镜像,原先较旧的镜像也不会覆盖,而是会变为一个无名镜像,解决办法可以在命令行输入下面的命令:

docker rmi $(docker images | grep "none" | awk '{print $3}')