idea连接docker,管理docker,一键部署springboot项目

0. 本章目标

   IDEA使用Docker插件实现springboot项目的一键部署

   安装环境

   CentOS764

   Docker19.03.13

   IDEA 2019.3.2

   openjdk:8-jdk-alpine

   registry:2.7

   要开两个虚拟机

   server1

   registry  

##server1上进行操作

1. Docker开启远程api端口(注意这种配置方式只适用于开发和学习,在公共网络中不要这样配置,容易引发安全问题)

    默认情况下dokcer是不支持远程访问的,需要修改配置,开启Docker的远程访问

   #1.修改Docker服务文件,需要先切换到root用户

   vim /lib/systemd/system/docker.service

   #2.注释掉"ExecStart"这一行,并添加下面这一行信息

   ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

   #3.重新加载配置文件

   systemctl daemon-reload

   #4.重启服务

   systemctl restart docker.service

   #5.查看配置的端口号(2375)是否开启(非必要)

   netstat -nlpt

   #6.修改防火墙添加2375端口(必需)

   firewall-cmd --zone=public --add-port=2375/tcp --permanent && \

   firewall-cmd --reload && \

   firewall-cmd --list-ports

2. IDEA连接docker

   1.下载idea docker插件

      Settings-->Plugins-->搜索“Docker”并安装,如已安装请略过

   2.idea配置并连接docker

     详情见:images/IDEA安装与配置Docker插件.png(01~04)

   注1:“Docker”插件仅仅是一个图形化管理工具,一键部署另有其人

3. 镜像的拉取(略)

   idea可以通过可视化的方式拉取镜像,不用自己去敲命令

   详情见:images/IDEA拉取Docker镜像.png(01~03)

   注1:有时候会出现拉取的时间超时的情况,可以配置一下国内的镜像获取阿里云的加速器

4. 容器的创建与运行(略)

##server1上进行操作

5. 综合案例:手动部署springboot项目

   0.调试命令   

      #停止并删除所有容器

      docker stop $(docker ps -aq) && docker rm $(docker ps -aq)

  1.创建springboot项目test1启动并测试

  2.将test1打成jar包

     版本指定为1.x.0

  3.上传test1jar到linux服务器

     mkdir /usr/local/mytools && cd /usr/local/mytools

     rz

     注:jar包在资料/test目录下,有3个版本:1.0.0/1.1.0/1.2.0

  4.创建并编辑dockerfile

     cd /usr/local/mytools

     vim Dockerfile

     注1:dockerfile内容见资料/Dockerfile-v1

  5.执行dockerfile创建对应版本的镜像(x换成对应版本即可)

     docker build -t test1:1.x.0 .

  6.使用test1:l.x.0镜像启动容器(x换成对应版本即可)

     docker run -d \

     -p 8080:8080 \

     --name test1 \

     --restart=always \

     test1:1.0

     docker stop test1 && docker rm test1

     注1:如果8080端口无法访问,请修改防火墙添加8080端口(必需)

              firewall-cmd --zone=public --add-port=8080/tcp --permanent && \

              firewall-cmd --reload && \

              firewall-cmd --list-ports   

  7.打开postman进行测试

    小结:传统的docker部署springboot项目,需要自己手动配置Dockerfile文件,还需要将生成的jar包跟Dockerfile文件一起上传到服务器,

              再创建镜像,然后启动容器,整个流程下来很麻烦,如果用idea的dockerfile-maven-plugin插件就可以实现一键部署springboot项目,简单方便

###  阿里云镜像仓库

6. 私有镜像仓库

    1.关键概念

       仓库(Repository):就是存放镜像的地方。类似于 Node 的 npm;  java 的 Maven。

       注册服务器(Registry):它的概念比较容易与仓库混淆。实际上注册服务器是用来管理仓库的服务器,一个服务器上可以存在多个仓库,而每个仓库下可以有多个镜像。

                                                例如对于仓库地址 hub.dockerpool.com/nginx 来说,hub.dockerpool.com 是注册服务器的地址,nginx 是仓库名。

       私有仓库:公司的项目一般不予许我们上传到 Docker Hub 这类的公共仓库中,所有学会创建一个私有仓库也是非常必要的

       

        

    2.私服搭建两种方案

       docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。

       Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,

       harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求

       注1:harbor翻译成中文就是码头的意思

    

    ##registry上进行操作

    3.docker官方提供的私有仓库registry的搭建与使用

       1).拉取Registry镜像(这里选择搭建2.7版本的registry)

       docker pull registry:2.7

       注:不使用最新版,有BUG

       2).创建并运行Registry容器

            docker run -d \

              --name myregistry \

              -p 5000:5000 \

              -v /usr/local/docker/registry:/var/lib/registry \

              --restart=always \

              registry:2.7

              

              注1:使用-v /usr/local/docker/registry:/var/lib/registry将宿主机/usr/local/docker/registry挂载到容器/var/lib/registry,即将上传的镜像放到本地的/usr/local/docker/registry目录下

       3).验证是否搭建成功

           #访问私有镜像仓库地址,仓库目前为空

           curl http://127.0.0.1:5000/v2/_catalog  

           curl http://192.168.106.128:5000/v2/_catalog

       ##server1上进行操作

       4).让docker信任私有镜像仓库地址

            # 1.vi编辑器打开/etc/docker/daemon.json

            vi /etc/docker/daemon.json

            

             # 2.在daemon.json中添加以下内容,其值为注册服务器(registry)的IP及端口(注:IP及端口改成自己机器上的相关IP及端口)

             "insecure-registries":["192.168.106.128:5000"]

            

             #3.daemon.json修改完成后结果如下,其中阿里云加速地址不要修改,IP要修改成docker registry的IP

             {

               "registry-mirrors":["https://oyi1xr7k.mirror.aliyuncs.com"],

               "insecure-registries":["192.168.183.165:5000"]

             }

            #4.然后重启Docker服务

            systemctl restart docker && systemctl status docker

             注1:这里有个巨坑,该配置是配置在访问注册服务器客户端

                      例如:A/B两台服务器,A想访问B上的注册服务器(registry),是在A上配置以上内容

                  The push refers to repository [192.168.183.165:5000/test1]

                  Get https://192.168.183.165:5000/v2/: http: server gave HTTP response to HTTPS client

       ##server1上操作

       5).在私有仓库的使用

           上传、下载镜像

            创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 127.0.0.1:5000

            #1.先在本机查看已有的镜像,选择其中一个进行上传

            docker images

            #2.镜像标记(push前必须先标记镜像)

            ##镜像标记语法,自定义repository 不能有大写字母

            docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

            docker tag 自定义镜像名[:版本] 私服IP:端口/仓库名[:版本]

            例如:

            docker tag test1:1.0 192.168.106.128:5000/test1:1.0

            #标记完后再执行查看所有镜像,会多出一个镜像

            docker images

            #3.镜像上传

            docker push 192.168.106.128:5000/test1:1.0

            #4.注册服务器查看命令

            #用curl 查看注册服务器的所有镜像

            curl 192.168.106.128:5000/v2/_catalog

            #列出指定镜像有哪些tag

            curl  192.168.217.143:5000/v2/test1/tags/list

            #5.删除本地的镜像(server1)

            #删除指定镜像

            docker rmi 192.168.217.143:5000/test1:v1.0

            #删除所有镜像

            docker rmi -f $(docker images -qa)

            注1:通过docker images命令可以看到,本地已经没有了192.168.217.143:5000/test1:1.0.0

            #6.再从registry下载镜像

            docker pull 192.168.116.130:5000/test1:1.0.0

6. idea中使用dockerfile-maven-plugin一键部署springboot项目

    1.插件使用注意事项

       1.该插件依赖一台装有Docker的Host完成镜像的构建(完成)   

       2.由于该插件需要访问Docker Host,因此要求Docker Host打开TCP管理端口,并允许访问(完成)

       3.使用该插件的机器需要配置DOCKER_HOST选项,指向Docker Host对应端口(未完成)

          即在windows下配置相关环境变量

          DOCKER_HOST=tcp://x.x.x.x:2375

          注:修改了系统变量需要重启开发工具才能生效,一开始提示上传镜像失败,看了错误是上传的ip还是默认的127.0.0.1,重启IDEA就可以了

       4.该插件构建和发布镜像依赖于镜像仓库,需要用户提供镜像仓库的登录信息,支持POM设置和Settings设置

          镜像创建可以使用阿里云镜像,或者是私有镜像仓库

       5.需在maven/conf/下的setting.xml配置

          这个文件在maven目录下,可以 cd $M2_HOME/conf 进入。在pluginGroups中增加一个com.spotify

         

             com.spotify

         

    

    2.在与pom.xml同目录创建Dockerfile文件

      详情见:资料/Dockerfile-v2

idea中添加MAVEN命令:clean package dockerfile:build -Dmaven.test.skip=true

附录一:使用openjdk:8-jdk-alpine镜像启动容器,并解决时区问题

附录二:dockerfile-maven-plugin和docker-maven-plugin的区别(重点)

在dockerfile-maven-plugin插件出现之前,还有一个maven插件是docker-maven-plugin,是由同一个作者创造,作者明确表示推荐使用dockerfile-maven-plugin,并会持续升级;

而docker-maven-plugin不在添加任何新功能,只接受修复bug。

两个插件的设计思想是有差别的,前者需要独立编写Dockerfile文件,后者允许没有Dockerfile文件,所有的docker相关配置都写在pom文件的plugin中,这样使maven插件显得很笨重,

并且如果脱离了这个maven插件还得重写编写Dockerfile,不够灵活。

因此,推荐使用maven插件:dockerfile-maven-plugin。

附录X:示例

  

                com.spotify

                dockerfile-maven-plugin

                ${dockerfile-maven-plugin.version}

                

                    ${docker.image.prefix}/${project.artifactId}

                    ${zuihou-project.version}

                    

                        target/${project.build.finalName}.jar

                    

                

            

1.4.12

zuihou

zuihou-order-server

c.2.0-SNAPSHOT

${project.artifactId}

zuihou-admin-cloud

  

                com.spotify

                dockerfile-maven-plugin

                1.4.12

                

                    zuihou/zuihou-order-server

                    c.2.0-SNAPSHOT

                    

                        target/zuihou-admin-cloud.jar

                    

                

            

Dockerfile-v1  配置文件

#1.指定基础镜像

FROM openjdk:8-jdk-alpine

#2.维护者信息

MAINTAINER xyz "[email protected]"

#3.创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录

VOLUME /tmp

#4.复制test1.jar到容器里

#此处与之后的idea中使用docker插件一键发布是不一样的

ADD test1.jar /test1.jar

#5.设置时区

ENV TZ=PRC

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

#6.声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务

EXPOSE 8080

#7.指定容器启动程序及参数(相当于在容器中用cmd命令执行jar包)

ENTRYPOINT ["java","-jar","/test1.jar"]

#下面的写法指定springboot项目启动时指定的额外参数

#ENTRYPOINT ["java","-jar","/test1.jar","--spring.config.location=/usr/local/project/docker/xxl-job/config/application.yml"]

使用harbor搭建私服

0.安装前提

   docker已安装

   docker-compose已安装

1.Harbor简介

  Harbor (港口,港湾)是一个用于存储和分发Docker镜像的企业级Registry服务器。

  除了Harbor这个私有镜像仓库之外,还有Docker官方提供的Registry。Registry安装部署容易,

  安装一个Registry容器就可以使用了,但是Registry有以下缺点

  a) 没有图形界面

  b) 没有项目管理

  c) 没有用户权限控制

  d) 看不到镜像操作记录

  Harbor的优势:

  a) 图形管理界面。

  b) 按项目管理镜像。

  c) 独立的用户管理,不同用户可以操作不同镜像,细粒度的权限控制,包含create、push 、pull、delete。

  d) 镜像管理。

  e) 标签管理。

  f) 操作日志管理

2.Harbor安装

  1.安装Docker并启动Docker(略)

  2.安装docker-compose(略)

  3.下载Harbor的离线安装压缩包

    注1:下载地址:Releases · goharbor/harbor · GitHub

    注2:请选择离线安装包harbor-offline-installer-v2.1.0.tgz大概500多M

  4.上传离线安装包

    mkdir /usr/local/mytools && cd /usr/local/mytools

    rz

  5.创建https证书(非常重要)

    harbor默认支持http,在推送或者拉取镜像的时需要https协议的,所以需要设置证书。如果不想用https,

    把https相关的注释掉即可,但是这样只能在页面访问,无法用docker命令推送或拉取

    最终需要的是三个文件,包括一个证书和一个秘钥,另外一个是客户端需要的证书

    服务器证书秘钥:harbor.key

    服务器证书:harbor.crt

    客户端证书:ca.crt(通信使用)

    1.创建证书目录,并赋予权限

      mkdir -p /cert/harbor && \

      chmod -R 777 /cert/harbor && \

      cd /cert/harbor

    2.检查是否有安装openssl,如果没有先安装openssl组件(centos7默认已安装,此步骤可跳过)

      whereis openssl

      yum install openssl

    3.创建服务器证书密钥harbor.key

      openssl genrsa -des3 -out harbor.key 2048

      #输入密码(123456),确认密码,随便定义,但是要记住,后面会用到。

    4.创建服务器证书的申请文件harbor.csr

      openssl req -new -key harbor.key -out harbor.csr

      #输入密钥文件的密码, 然后一路回车    

        

    5.备份一份服务器密钥文件

      cp harbor.key harbor.key.org

    6.去除文件口令

      openssl rsa -in harbor.key.org -out harbor.key

      # 输入密钥文件的密码

    7.创建一个自当前日期起为期十年的证书 harbor.crt

      openssl x509 -req -days 3650 -in harbor.csr -signkey harbor.key -out harbor.crt

  6.解压软件包,修改配置文件

    #先进入harbor离线包上传的目录,解压离线包到/usr/local/harbor下,然后进行查看操作

    cd /usr/local/mytools

    tar zxf harbor-offline-installer-v2.1.0.tgz  -C /usr/local/

    ls /usr/local/harbor

    #ls命令查看之后,其中harbor.yml.tmpl是harbor配置文件模板,进入/usr/local/harbor目录拷贝一份 -> harbor.yml再进行编辑

    cd /usr/local/harbor && cp harbor.yml.tmpl harbor.yml

    #对harbor.yml进行编辑

    vim harbor.yml

    #在宿主机中创建挂载目录,用于挂载harbor数据及日志,目录要先创建好并赋予777权限

    mkdir -p /data/harbor/{data,log}

    chmod -R 777 /data/harbor/data && chmod -R 777 /data/harbor/log

    注2:harbor.yml文件配置可参考如下两个文件

         资料/harbor.yml

         images/03 harbor.yml文件需要修改的7个位置.png   

  7.安装harbor

    cd /usr/local/harbor

    ./install.sh

    注1:安装的时候如果出现下面的异常,是因为关闭防火墙导致,需要重启docker

         ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-61f0da3c6876 -j RETURN: iptables: No chain/target/match by that name.

         出现上面这种错误,要重启docker,然后重新安装harbor

         systemctl daemon-reload

         systemctl restart docker.service

         cd /usr/local/harbor

         ./install.sh

    注2:控制台出现如下内容表示安装成功

         ----Harbor has been installed and started successfully.----  

     

  8.测试

    在浏览器地址输入:https://xxx.xxx.xxx.xxx:443,打开harbor登录页面

    用户名:admin,密码:harbor123 (帐号密码根据自己的harbor.yml修改)

    注1:将https://xxx.xxx.xxx.xxx:443修改成自己主机IP地址,例如:https://192.168.217.141:443

    注1:如何打不开网页,请检查防火墙443端口是否开放

         firewall-cmd --zone=public --add-port=443/tcp --permanent && \

         firewall-cmd --reload && \

         firewall-cmd --list-port

  9.docker信任配置

     要让docker可以访问harbor,需要将harbor域名或IP设置为docker的受信任仓库,修改配置文件 /etc/docker/daemon.json ,增加docker受信任IP或域名

     vi  /etc/docker/daemon.json

    追加内容:

    {

     "insecure-registries": ["192.168.0.101:10080"]

    }

   

  8.测试

  8.测试

  8.测试

  8.测试

  8.测试

  8.测试

附录x:maven配置

settings.xml增加如下节点:可使用find / -name settings.xml 查找所在位置

  com.spotify  

  192.168.186.129

  admin

  Harbor12345

  

    [email protected]

  

    

使用registry搭建私服

###  阿里云镜像仓库

1. 私有镜像仓库

    1.关键概念

       仓库(Repository):就是存放镜像的地方。类似于 Node 的 npm;  java 的 Maven。

       注册服务器(Registry):的概念比较容易与仓库混淆。实际上注册服务器是用来管理仓库的服务器,一个服务器上可以存在多个仓库,而每个仓库下可以有多个镜像。

                                                例如对于仓库地址 hub.dockerpool.com/nginx 来说,hub.dockerpool.com 是注册服务器的地址,nginx 是仓库名。

       私有仓库:公司的项目一般不予许我们上传到 Docker Hub 这类的公共仓库中,所有学会创建一个私有仓库也是非常必要的

    2.私库搭建方案

       docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,

       harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求

       推荐:harbor

       注1:因为harbor是基于docker-compose进行搭建,由于还未学习docker-compose因此无法使用 harbor搭建私服

   

    3.docker官方提供的私有仓库registry的搭建步骤

       #1.下载镜像

       docker pull registry:2

       注:不使用最新版,有BUG

       #2.运行registry容器

            docker run -d \

              -p 5000:5000 \

              -v /usr/local/docker/registry:/var/lib/registry \

              --restart=always \

              registry:2

              

              使用-v /usr/local/docker/registry:/var/lib/registry将宿主机/usr/local/docker/registry挂载到容器/var/lib/registry,即将上传的镜像放到本地的/usr/local/docker/registry目录下

       #3.在私有仓库上传、搜索、下载镜像

            创建好私有仓库之后,就可以使用 docker tag 来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 127.0.0.1:5000

            #1.先在本机查看已有的镜像,选择其中一个进行上传

            docker images

            #2.镜像标记(push前必须先标记镜像)

            ##镜像标记语法,自定义repository 不能有大写字母

            docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

            例如:

            docker tag centos:latest 127.0.0.1:5000/ct7:v1

            #标记完后再执行查看所有镜像,会多出一个镜像

            docker images

            #3.镜像上传

            docker push 127.0.0.1:5000/ct7:v1

            #4.注册服务器查看命令

            #用curl 查看注册服务器的所有镜像

            curl 127.0.0.1:5000/v2/_catalog

            #列出指定镜像有哪些tag

            curl  127.0.0.1:5000/v2/ct7/tags/list

            #5.删除本地的镜像ct7

            docker rmi 127.0.0.1:5000/ct7:v1

            注1:通过docker images命令可以看到,本地已经没有了127.0.0.1:5000/ct7:v1

            #6.再从Registry下载镜像

            docker pull 127.0.0.1:5000/ct7:v1

             #7.允许非HTTPS 方式推送镜像

             如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。

             你就得把例如 192.168.100.100:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。

             会报出类似于的如下错误:

             http: server gave HTTP response to HTTPS client

             http: server gave HTTP response to HTTPS client

             docker registry未采用https服务,而客户端docker使用https请求push所致

             ###巨坑:该配置是配置在docker客户端,让docker客户端以不安全的http请求访问docker registry,ip以及端口填写的是提供服务容器的ip以及端口。

             解决方案:编辑/etc/docker/daemon.json文件,添加insecure-registries配置项

             #1.编辑daemon.json

             vim /etc/docker/daemon.json

             #2.添加insecure-registries配置项,其中阿里云加速地址不要修改,IP要修改成docker registry的IP

             {

               "registry-mirrors":["https://oyi1xr7k.mirror.aliyuncs.com"],

               "insecure-registries":["192.168.217.133:5000"]

             }

      systemctl daemon-reload && systemctl restart docker

你可能感兴趣的:(ide,docker,linux)