后端——》在windows和linux上部署springboot项目到docker上

本文目录 

  1. 在win10下安装docker(非重点): 
  2.  docker的常用命令
  3. 在docker上部署项目并且处理遇到的坑

1: 在win10下安装docker

docker允许在win10专业版上安装,但是很多电脑都是出厂预装的win10家庭版,这个需要破解安装,网上教程很多,如果安装出问题,此处推荐一篇博客(侵删)https://blog.csdn.net/li_chunlong/article/details/105531124。在这里提一下docker很重要的两个概念:容器和镜像。镜像是运行在容器中的,就像一个jar包运行在虚拟机上,可以把镜像类比为一个jar包,容器类比为一个虚拟机。

2: docker的最最最最常用命令

  • 1、docker version
  • (安装完成后使用)查看版本号,在安装完成后,可以通过这个命令查看版本。
  • 2、docker info
  • (安装完成后使用)查看容器的一些配置信息。(如果使用docker info命令后输出 error during connect: Get http://%2F%....巴拉巴拉。那么恭喜踩坑了,重新安装吧)。
  • 3、docker images
  • (项目部署前后都可以使用)查看本地有哪些镜像。可跟参数 -a,eg:docker images -a查看所有镜像
  • 4、docker rmi 8ae296c2e568
  • (删除镜像)根据IMAGE ID删除镜像,IMAGE ID可以通过docker images 命令查看得到,本例中的8ae296c2e568就是IMAGE ID。当然还可以根据镜像名称和标签删除。
  • 5、docker ps
  •   (项目部署前后都可以使用) 查看有哪些正在使用的容器。可跟参数 -a,eg:docker ps -a查看所有容器
  • 6、docker stop 622a496650c9
  •  (停止容器) 根据CONTAINER ID停止容器,也可以理解为停止部署在这个容器中的项目,停止后容器所占用的端口号释放
  • 7、docker rm   622a496650c9
  • (删除容器)根据 CONTAINER ID删除容器。
  • 8、docker run -p 8083:8082 main-system
  • (启动镜像)docker run是启动镜像, -p 8083:8082 的意义是将项目的8082端口映射以8083端口的形式暴露出去供别人调用(有点类似nginx),左边的这个8083端口是自定义的,右边的8082端口是java程序或者说tomcat的端口号。main-system是镜像名称。整个命令的意思是 从镜像仓库中选择main-system这个镜像,将这个镜像加载的程序端口8082以8083的端口号暴露给调用者。使用这个命令 后,端口号为8082的程序被隔离在容器中,以8083端口号暴露出入口,并不会占用电脑当前的8082的端口号,这意味着在电脑上还可以启动一个端口号为8082的程序。
  • 9、mvn package -P test docker:build
  • (编译镜像)通过mvn package命令将项目打包成jar包,放到docker上编译

 个人关于镜像和容器理解:首先通过mvn命令将springboot项目打成jar包,然后把jar包放到docker上编译,即上面的第9个命令,编译完成后就形成了一个镜像,通过docker images可以看到。然后再通过docker run命令启动这个镜像,就相当于把镜像放到了容器中进行启动。启动完成后可以通过 docker ps查看正在运行的容器。

3: 在docker上部署项目并且处理遇到的值得注意的点

让springboot项目在docker上运行,寿险需要在pom.xml文件中添加docker插件,再新建一个Dockerfile文件

   pom.xml :

<build>
        <plugins>
            <!-- Docker maven plugin -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                   <imageName>main-system</imageName><!--镜像名称,可自定义-->
                   <dockerDirectory>src/main/docker</dockerDirectory><!--Dockerfile文件路径,可自定义-->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
            <!-- Docker maven plugin -->
        </plugins>
    </build>

  Dockerfile :

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD main-system-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • 第一个点:执行docker run命令之后报错no such file or directory。这个报错多半是pom.xml文件中docker插件的dockerDirectory中指定的路径 与Dockerfile文件不在同一个路径下,改为一致即可。
  • 第二个点:执行启动命令后报driver failed programming external connectivity on endpoint affectionate_greider错误,这是因为当前已经有运行中的容器把启动命令中的端口占用了,需要先使用docker stop containerid 命令将正在运行的容器停掉
  • 第三个点:使用docekr run命令成功启动项目后,使用postman调用项目中的接口出现报错Unable to connect to 127.0.0.1:6379。这是因为redis的配置文件的问题,首先到redis的目录下找到文件redis.windows.conf,将文件中的bind 127.0.0.1注释掉,同时再将protected-mode yes改为protected-mode no,重启redis服务;接着在springboot的配置文件application.properties中将  spring.redis.host=127.0.0.1  中的127.0.0.1改为本机内网ip,编译新建镜像再运行就好了。
  • 第四个点:启动报错 ehcache.xml(No such file or directory)。这个问题着实看了好久,在通过mvn普通打包运行是没问题的,但是放到docker中运行就开始报这个错,最后发现是缓存配置文件ehcache.xml的文件路径有问题。需要把这个文件放到src/main/resources下,然后在shiro的配置中读取此文件路径时,需要使用 this.getClass().getClassLoader().getResource("ehcache.xml").getPath()来获取。最后再将ehcache.xml文件中的maxEntriesLocalHeap和maxElementsOnDisk属性注释掉。

以上为docker在windows上的部署。但是现在的程序大多是在windows上开发,在linux上部署。那么我们普通人部署的流程为

windows上开发-》windows上编译镜像-》windows上提交镜像-》linux上拉取镜像-》linux上运行镜像。

在windows上的编译在前面的文章中已经提到了,那么这个流程就涉及到docker的另一个重要概念,即:仓库。仓库很好理解,是存贮镜像的地方,类似于git仓库之于代码分支,maven仓库之于依赖包。像git仓库有github、coding、码云等众多托管平台一样,docker镜像仓库也有dockerhub,阿里云镜像仓库、网易镜像仓库。在下面的步骤中我们以阿里云镜像仓库为例

  • 第一步,到阿里云官网注册并登陆,然后搜索“容器镜像服务”,点击“管理控制台”。
  • 第二步:点击创建镜像仓库,填写自定义命名空间、仓库名称、摘要。点击下一步,选择 本地仓库。创建完成后 如下。
  • 第三步:在windows上提交镜像:先执行docker images,可以查看到本地仓库中编译完成的镜像。(下图中push的地址registry.cn-shanghai.aliyuncs.com/manage-system/staging:1.0.0,其中manage-system为命名空间,staging为仓库名称,1.0.0为版本号,这个可以自定义),上传完成后打开容器镜像服务的镜像版本可以看到刚刚上传的镜像。
    D:\Work\Project\baoji-system\webapps\manage-system>docker login --username=yourname registry.cn-shanghai.aliyuncs.com
    Password:
    Login Succeeded
    
    D:\Work\Project\baoji-system\webapps\manage-system>docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    manage-system       latest              291da7fabc50        About an hour ago   183MB
    openjdk             8-jdk-alpine        a3562aa0b991        15 months ago       105MB
    
    D:\Work\Project\baoji-system\webapps\manage-system>docker tag a3562aa0b991 registry.cn-shanghai.aliyuncs.com/manage-system/staging:1.0.0
    
    D:\Work\Project\baoji-system\webapps\manage-system>docker push registry.cn-shanghai.aliyuncs.com/manage-system/staging:1.0.0
    The push refers to repository [registry.cn-shanghai.aliyuncs.com/manage-system/staging]
    ceaf9e1ebef5: Pushed
    9b9b7f3d56a0: Pushed
    f1b5933fe4b5: Pushed
    1.0.0: digest: sha256:44b3cea369c947527e266275cee85c71a81f20fc5076f6ebb5a13f19015dce71 size: 947
    

  • 第四步:在linux上安装镜像,此处推荐一篇博客(侵删)https://blog.csdn.net/u014069688/article/details/100532774

  • 第五步:拉取镜像。先登录,输入 docker pull registry.cn-shanghai.aliyuncs.com/nameSpace/depository:version-num。跟上面的一样,nameSpace是命名空间,depository是仓库名称,version-num是版本号,这里都替换成咱们自己的。替换完成后输入pull命令如果出现报错:Error response from daemon: pull access denied for xxx.xxx, repository does not exist or may require 'docker login',这里就要注意了,如果拉取出现这个问题,咱们需要配置一个阿里云加速器(第六步),如果拉取没有出现问题就略过第六步

  • 第六步:配置阿里云加速器

    1:到docker的安装目录中去
    cd /etc/docker/
    2:编辑或创建docker配置文件daemon.json
    vi daemon.json
    输入i插入字符,将以下json配置粘贴进去
    {
      "registry-mirrors": ["https://brf9xytm.mirror.aliyuncs.com"]
    }
    
    按esc退出编辑模式,输入英文冒号: ,再输入wq保存文件
    3:重启docker服务
    systemctl daemon-reload
    systemctl restart docker

    配置重启完成后再次登录拉取就会拉取成功,如下

  • 第七步:运行镜像,这一步在本文的上阕已经讲过了。咱们输入以下命令就可以运行成功啦。其中-p参数有讲过,-d 参数表示我们将程序运行在后台,输入后会返回一串容器id,不影响我们输入其他的命令。

 到此为止,docker的三个要点 仓库、镜像、容器,以及安装和使用过程中遇到的坑,以及部署的流程,已经写的差不多了。但与docker紧密联系的另一个技术点 ,kubernetes(即 k8s集群部署),以后有精力再来更新。

文中若有错误欢迎指正....

猜你喜欢

转载自blog.csdn.net/nienianzhi1744/article/details/107953467
今日推荐