• 学成在线(第20天)DevOps


    DevOps 介绍

    什么是DevOps

    DevOps是一种方法或理念,它涵盖开发、测试、运维的整个过程。DevOps是提高软件开发、测试、运维、运营
    等各部门的沟通与协作质量的方法和过程,DevOps强调软件开发人员与软件测试、软件运维、质量保障(QA)部
    门之间有效的沟通与协作,强调通过自动化的方法去管理软件变更、软件集成,使软件从构建到测试、发布更加快
    捷、可靠,最终按时交付软件。

     Git/GitLab

    Git是一个版本控制系统,GitLab是一个远程的Git仓库,GitLab与GitHub及国内的码云类似,用户在GitLab上注
    册账号,上传项目到GitLab,通过GitLab对项目进行版本控制。通常企业使用GitLab在局域网搭建自己的Git代码
    管理仓库,不过随着云计算的发展,很多企业也开始使用提供Git仓库管理公共服务的平台,比如:码云、GitHub
    等。

     安装GitLab

    在Linux服务器上安装GitLab,首先先安装docker

    安装Docker

    查看centos系统内核版本 uname -r  内核版本>=3.1

    升级软件包及内核 

    yum update

    在Centos7上安装Docker

    yum install -y docker

    启动,开机启动

    docker systemctl start docker
    docker systemctl enable docker

    若docker拉取镜像超时,配置一下国内镜像路径

     可以通过修改daemon配置文件

    vi /etc/docker/daemon.json

    添加

    {
      "registry-mirrors": ["https://1l3yp2sl.mirror.aliyuncs.com"]
    }

    将本机dns改成阿里家的dns解决

    vim /etc/resolv.conf 

    接着拉取gitlab、redis、postgresql,gitlab依赖redis和postgresql。

    docker pull sameersbn/redis
    docker pull sameersbn/postgresql
    docker pull beginor/gitlab-ce:11.0.1-ce.0

    创建postgresql、redis容器:

    docker run --name redis -d -p 6379:6379 sameersbn/redis
    docker run --name postgresql -d -p 5432:5432 sameersbn/postgresql
    

    创建GitLab 的配置 (etc) 、 日志 (log) 、数据 (data) 放到容器之外, 便于日后升级, 因此我们先准备这三个目录。

    mkdir -p /mnt/gitlab/etc
    mkdir -p /mnt/gitlab/log
    mkdir -p /mnt/gitlab/data
    

    创建gitlab容器:

    docker run --detach --hostname 192.168.183.133 -p 10022:22 -p 8899:80 --name gitlab --restart unless-stopped -v /mnt/gitlab/etc:/etc/gitlab -v /mnt/gitlab/log:/var/log/gitlab -v /mnt/gitlab/data:/var/opt/gitlab  gitlab/gitlab-ce:11.5.4-ce.0

    可以看到镜像都启动了

     浏览器访问:http://192.168.183.133:8899

     无语,访问不了,明明启动了。我这里卡了好久,反复尝试。我看别人都行,最后我选择github好了。

    在GitLab创建项目

    点击 “New Project”创建新项目

    输入项目信息,提交。
    项目新建成功,进入项目主页,通过项目主页即可访问项目内容,并得到项目的Git项目仓库地址:

     使用Git管理项目

    设置Git

    在开发电脑安装Git,并在Idea中设置Git

     从GitLab检出项目

    打开idea,按下图菜单指示从GitLab克隆项目:

     输入项目的Git仓库地址进行克隆:

     提交代码到GitLab

    1、在工程根目录创建 .gitignore
    此文件中记录了在提交代码时哪些文件或目录被忽略

    .idea/
    target/
    *.iml

    2、提交代码

    首先执行添加文件到暂存区:

     再执行commit 提交文件到本地仓库

     最终代码确认无误可以提交到远程仓库

     Docker

    虚拟化技术

    虚拟化技术是对软件基础设施、操作系统、软件等IT资源进行有效的管理,使用户不再受物理资源的限制,
    提高计算机资源的利用率。虚拟化技术是云计算的基础,例如阿里云的云主机、腾讯云等都应用了虚拟化技术。
    虚拟化技术整体上包括两个方面:硬件虚拟化和软件虚拟化,具体分为:网络虚拟化、存储虚拟化、桌面虚拟化、
    服务器虚拟化等,我们平常说的最多的是服务器虚拟化。
    服务器虚拟化就是在同一个物理服务器上运行多个虚拟机,让服务器的cpu、内存、磁盘、I/O等硬件设施为每个
    虚拟机服务,在每个虚拟机中运行不同的软件,虚拟机之间是隔离状态。

    服务器虚拟化主要有两种技术:
    1、Hypervisor也叫VMM(virtual machine monitor)即虚拟机监视器
    Hypervisor是一种将操作系统与硬件抽象分离的方法,实现在宿主机(host machine)上能同时运行多个客户机
    (guest machine),每个客户机就是一个虚拟机,这些虚拟机高效地分享宿主机的硬件资源。

    在服务器(宿主机)上安装操作系统,并安装hypervisor虚拟机管理软件,如VMware、VirtualBox等,由
    hypervisor管理多个虚拟机,每个虚拟机上需要安装客户操作系统、依赖库、应用软件。

    2、Containers容器化技术

    容器技术中 docker引擎取代了hypervisor,docker引擎是运行在住宿操作系统上的一个进程,该进程管理了多个
    docker容器,每个docker容器集成了应用软件、依赖库,容器之间相互隔离。

    3、技术对比:
    资源占用:
    虚拟机由于是独立的操作系统,占用资源比docker多。
    启动速度:
    虚拟机包括操作系统,启动虚拟机相当于启动一个操作系统,容器则不一样,容器中只包括操作系统的内核,启动
    一个容器实例相当于启动一个进程,容器的启动速度比虚拟机快。
    体积:
    容器包括操作系统内核、软件及依赖库,虚拟机不仅包括软件和依赖库还将完整的操作系统打包进去,虚拟机的体
    积比容器大的多。

    部署微服务到Docker

    部署流程

    本项目微服务采用SpringBoot开发,将每个微服务工程打成Jar包,最终在Docker容器中运行jar,部署流程如下:
    1、SpringBoot工程最终打成 Jar包
    2、创建Docker镜像
    3、创建容器
    4、启动容器

    打包

    1、使用maven的打包插件:
    将下边的插件依赖拷贝到微服务工程中,本例子将学成在线的Eureka工程打包:

    <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring‐boot‐maven‐plugin</artifactId>
                </plugin>
            </plugins>
        </build>

    2、maven打包
    在工程目录运行:mvn clear package
    或通过IDEA执行clear package打包命令。

    打包成功,如下图:

     创建镜像

    将上一步的 jar包拷贝到Linux服务器,准备创建镜像。
    测试jar包是否可以运行,执行:java -jar xc-govern-center-1.0-SNAPSHOT.jar
    在xc-govern-center-1.0-SNAPSHOT.jar 位置编写Dockerfile文件

    FROM java:8
    ENV ARTIFACTID xc‐govern‐center
    ENV ARTIFACTVERSION 1.0‐SNAPSHOT
    ENV HOME_PATH /home
    WORKDIR $HOME_PATH
    ADD /$ARTIFACTID-$ARTIFACTVERSION.jar $HOME_PATH/$ARTIFACTID.jar
    ENTRYPOINT ["java", "‐jar", "xc‐govern‐center.jar"]
    

    在Dockerfile文件所在目录执行:

    docker build -t xc-govern-center:1.0-SNAPSHOT .

    创建容器

    基于xc-govern-center:1.0-SNAPSHOT镜像创建容器,容器名称为xc-govern-center-test

    docker create ‐‐name xc‐govern‐center‐test ‐t ‐p 50101:50101 ‐e PORT=50101 ‐e EUREKA_SERVER=http://192.168.101.64:50101/eureka/,http://192.168.101.64:50102/eureka/  xc‐
    govern‐center:1.0‐SNAPSHOT

    停止与删除

    1 、停止正在运行的容器
    docker stop 容器名/id

    2、删除容器
    docker rm 容器名/id

    3、删除镜像
    docker rmi 镜像名或镜像Id

    maven构建镜像

    上边构建的过程是通过手工一步一步完成,maven提供docker-maven-plugin插件可完成从打包到构建镜像、构建
    容器等过程。

    1、编写pom_docker.xml

     1 <?xml version="1.0" encoding="UTF‐8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
     5 http://maven.apache.org/xsd/maven‐4.0.0.xsd">
     6     <parent>
     7         <artifactId>xc‐framework‐parent</artifactId>
     8         <groupId>com.xuecheng</groupId>
     9         <version>1.0‐SNAPSHOT</version>
    10         <relativePath>../xc‐framework‐parent/pom.xml</relativePath>
    11     </parent>
    12     <modelVersion>4.0.0</modelVersion>
    13     <artifactId>xc‐govern‐center</artifactId>
    14     <version>1.0‐SNAPSHOT</version>
    15     <dependencies>
    16         <!‐‐ 导入Eureka服务的依赖 ‐‐>
    17         <dependency>
    18             <groupId>org.springframework.cloud</groupId>
    19             <artifactId>spring‐cloud‐starter‐netflix‐eureka‐server</artifactId>
    20         </dependency>
    21     </dependencies>
    22     <build>
    23         <finalName>${project.artifactId}‐${project.version}</finalName>
    24         <plugins>
    25             <plugin>
    26                 <groupId>org.springframework.boot</groupId>
    27                 <artifactId>spring‐boot‐maven‐plugin</artifactId>
    28             </plugin>
    29  <plugin>
    30                 <groupId>com.spotify</groupId>
    31                 <artifactId>docker‐maven‐plugin</artifactId>
    32                 <version>1.0.0</version>
    33                 <!‐‐docker镜像相关的配置信息‐‐>
    34                 <configuration>
    35                     <!‐‐镜像名,这里用工程名‐‐>
    36                     <imageName>${project.artifactId}‐${project.version}</imageName>
    37                     <!‐‐Dockerfile文件所在目录‐‐>
    38                     <dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
    39                     <!‐‐TAG,这里用工程版本号‐‐>
    40                     <imageTags>
    41                         <imageTag>${project.version}</imageTag>
    42                     </imageTags>
    43                     <imageName>${project.artifactId}:${project.version}</imageName>
    44                     <!‐‐构建镜像的配置信息‐‐>
    45                     <resources>
    46                         <resource>
    47                             <targetPath>/</targetPath>
    48                             <directory>${project.build.directory}</directory>
    49                             <include>${project.artifactId}‐${project.version}.jar</include>
    50                         </resource>
    51                     </resources>
    52                 </configuration>
    53             </plugin>
    54         </plugins>
    55     </build>
    56 </project>
    View Code

    2 、将Dockerfile文件拷贝到src/main/resource下
    3、删除之前创建的xc-govern-center镜像
    4、进入工程根目录(pom_docker.xml所在目录)执行

    mvn ‐f pom_docker.xml clean package ‐DskipTests docker:build

    创建镜像成功,结果如下:

    Successfully built 64682c9ba311
    [INFO] Built xc‐govern‐center:1.0‐SNAPSHOT
    [INFO] Tagging xc‐govern‐center:1.0‐SNAPSHOT with 1.0‐SNAPSHOT
    [INFO] ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
    [INFO] BUILD SUCCESS
    [INFO] ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
    [INFO] Total time: 7.409 s
    [INFO] Finished at: 2018‐07‐19T14:21:16+08:00
    [INFO] Final Memory: 52M/414M
    [INFO] ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
    

    持续集成

    什么是持续集成

    持续集成(Continuous integration)简称CI,持续集成的思想是每天要多次将代码合并到主干,并进行集成、测
    试,这样就可以提早发现错误,进行修正。持久集成也属于DevOps
    持续集成的好处:
    1、自动化集成部署,提高了集成效率。
    2、更快的修复问题。
    3、更快的进行交付。
    4、提高了产品质量。

    本项目持续集成流程

      搭建环境

    搭建Docker私有仓库

    微服务的镜像会上传到Docker仓库保存,常用的公网Docker仓库有阿里云,网易云等,在企业局域网也可以搭建
    自己的Docker私有仓库,本教程使用Docker提供的私有仓库 registry。
    进入Docker私有仓库所在服务器执行:

    1、安装Docker
    2、创建私有仓库容器

    docker run --name docker-registry -d -p 5000:5000 registry

    访问:http://192.168.183.133:5000/v2/_catalog

    响应结果如下:

    {"repositories":[]}

    上边的响应结果说明在docker私有仓库中还没有镜像。

    默认docker-registry只允许https提交镜像,如下配置使docker-registry支持http
    在/etc/docker下,创建daemon.json文件,写入:

    { "insecure‐registries":["192.168.101.64:5000"]}

    重启docker:

    systemctl restart docker.service

    启动docker-registry

    docker start docker‐registry

    基于docker搭建Jenkins

    Jenkins是一个领先的开源自动化服务器,可用于自动化构建,测试,部署软件等相关任务。

    ⒈下载镜像,要使用最新的LTS:

    docker pull jenkins/jenkins:lts
    docker pull jenkins/jenkins
    

    ⒉运行

    docker run --name jenkins -p 8889:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home --restart always -d jenkins/jenkins:lts

    ⒊访问Jenkins实例

      1.访问http://192.168.183.133:8889

      2.获取初始登录密码

    docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

    从输出结果中获得的一串 Jenkins 初始密码,复制密码,填入密码

    3.定制 Jenkins

      选择默认的 Install suggested plugins(安装推荐的插件) 来安装插件。

    编写Pom.xml

    本例子将xc-govern-center工程使用Jenkins进行构建。
    在xc-govern-center工程根目录编写pom_docker_registry.xml
    此文件相比工程原有pom.xml增加了docker-maven-plugin插件,其作用是构建docker镜像并将镜像推送到
    Docker私有仓库(192.168.183.133:5000)。

     1 <?xml version="1.0" encoding="UTF‐8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"
     4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
     5 http://maven.apache.org/xsd/maven‐4.0.0.xsd">
     6     <parent>
     7         <artifactId>xc‐framework‐parent</artifactId>
     8         <groupId>com.xuecheng</groupId>
     9         <version>1.0‐SNAPSHOT</version>
    10         <relativePath>../xc‐framework‐parent/pom.xml</relativePath>
    11 </parent>
    12     <modelVersion>4.0.0</modelVersion>
    13     <artifactId>xc‐govern‐center</artifactId>
    14     <version>1.0‐SNAPSHOT</version>
    15     <dependencies>
    16         <!‐‐ 导入Eureka服务的依赖 ‐‐>
    17         <dependency>
    18             <groupId>org.springframework.cloud</groupId>
    19             <artifactId>spring‐cloud‐starter‐netflix‐eureka‐server</artifactId>
    20         </dependency>
    21     </dependencies>
    22     <build>
    23         <finalName>${project.artifactId}‐${project.version}</finalName>
    24         <plugins>
    25             <plugin>
    26                 <groupId>org.springframework.boot</groupId>
    27                 <artifactId>spring‐boot‐maven‐plugin</artifactId>
    28             </plugin>
    29             <plugin>
    30                 <groupId>com.spotify</groupId>
    31                 <artifactId>docker‐maven‐plugin</artifactId>
    32                 <version>1.0.0</version>
    33                 <!‐‐docker镜像相关的配置信息‐‐>
    34                 <configuration>
    35                     <!‐‐镜像名,这里用工程名‐‐>
    36                     <imageName>${project.artifactId}‐${project.version}</imageName>
    37                     <!‐‐Dockerfile文件所在目录‐‐>
    38                     <dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
    39                     <!‐‐TAG,这里用工程版本号‐‐>
    40                     <imageTags>
    41                         <imageTag>${project.version}</imageTag>
    42                     </imageTags>
    43                     <registryUrl>192.168.101.64:5000</registryUrl>
    44                     <pushImage>true</pushImage>
    45                     <imageName>192.168.101.64:5000/${project.artifactId}:${project.version}
    46 </imageName>
    47                     <!‐‐构建镜像的配置信息‐‐>
    48                     <resources>
    49                         <resource>
    50                             <targetPath>/</targetPath>
    51                             <directory>${project.build.directory}</directory>
    52                             <include>${project.artifactId}‐${project.version}.jar</include>
    53                         </resource>
    54                     </resources>
    55                 </configuration>
    56             </plugin>
    57         </plugins>
    58     </build>
    59 </project>
    View Code

     创建持续集成任务

    创建学成在线的构建任务:

     配置git仓库

    1、配置git凭证
    此凭证用于远程从git仓库克隆工程源代码
    输入git仓库的账号和密码,这里如果使用码云,下边需要配置码云的账号和密码。

     2、配置git仓库地址,此地址即xc-edu项目的地址

     maven构建配置

    目标:
    使用jenkins重复构建不要产生重复镜像
    使用jekins停止容器、删除容器、删除镜像之间进行判断

    shell脚本如下:

    #!/bin/bash
    result=$(docker ps | grep "192.168.101.64:5000/xc‐govern‐center")
    if [[ "$result" != "" ]]
    then
    echo "stop xc‐govern‐center"
    docker stop xc‐govern‐center
    fi
    result1=$(docker ps ‐a | grep "192.168.101.64:5000/xc‐govern‐center")
    if [[ "$result1" != "" ]]
    then
    echo "rm xc‐govern‐center"
    docker rm xc‐govern‐center
    fi
    result2=$(docker images | grep "192.168.101.64:5000/xc‐govern‐center")
    if [[ "$result2" != "" ]]
    then
    echo "192.168.101.64:5000/xc‐govern‐center:1.0‐SNAPSHOT"
    docker rmi 192.168.101.64:5000/xc‐govern‐center:1.0‐SNAPSHOT
    fi
    

      

     2、执行maven构建:

     执行如下maven指令:

    clean package ‐f xc‐govern‐center/pom_docker_registry.xml  ‐DskipTests docker:build

    3、拉取镜像,创建容器,启动容器
    从docker私有仓库拉取镜像并创建容器,启动容器
    显示容器运行日志

    docker run ‐‐name xc‐govern‐center ‐p 50101:50101 ‐idt 192.168.101.64:5000/xc‐govern‐center:1.0‐
    SNAPSHOT
    docker logs ‐f xc‐govern‐center

    执行任务

    1、进入任务页面,点击“立即构建”

     2、开始构建,查看日志

  • 相关阅读:
    Elasticsearch安装中文分词器IK
    Docker安装ElasticSearch
    Docker安装
    Docker安装EOS
    Docker更改容器端口映射
    BoltDB 一个简单的纯 Go key/value 存储
    go语言 robfig/cron包 实现定时 调用
    GitHub 添加 SSH keys
    Android 端外推送到底有多烦?
    Nats的消息通信模型
  • 原文地址:https://www.cnblogs.com/anan-java/p/12335191.html
Copyright © 2020-2023  润新知