zoukankan      html  css  js  c++  java
  • Docker 与 DevOps自动化部署实践

    利用Docker 实现自动热部署   

    简单的流程

    1. 开发人员在本地完成代码开发后,提交到本地分支,利用docker模拟生产环境进行测试,测试通过后合并到远端的主分支;
    2. master 主分支一旦更新后,触发持续集成软件进行打包集成(常见的集成工具: gitlab-vi,travis,或Jenkins)自动完成构建docker 镜像并push 推到远程仓库(docker cloud 或者企业自己的docker registry)
    3. 利用docker cloud,k8s等持续部署到web服务器。
    4. 配置发布服务器从仓库拉取镜像,run起来后,停止旧的版本。完成了一次自动集成部署。

    实验步骤

    搭建GitLab CI集成服务器

      不同的项目可能需要不同的测试环境,如果直接在CI服务器上面部署测试,多个项目可能会造成紊乱错误。

    利用docker 容器,将项目build 成docker 容器,再进行测试,测试成功再push到docker registry 服务器。即使在一个CI服务器,也可以部署多个测试环境,以供使用。大大精简测试和部署的流程。

    # 安装 gitlab ci runner
    
    curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh |sudo bash
     sudo yum install gitlab-ci-multi-runner -y
    
    sudo gitlab-ci-multi-runner status
    
    sudo usermod -aG docker gitlab-runner
     sudo service docker restart
    
    sudo gitlab-ci-multi-runner restart
    
    # 本地gitlab地址
    http://gitlab.example.com/
    
    安装 gitlab ci runner
    # 注册runner 
     sudo gitlab-ci-multi-runner register
    gitlab-ci 集成服务器注册runner(即不同的集成环境供gitlab调用)
    
    token 在项目的CI选项里面,可以找到
     一般不要把runner 绑定到一个项目,这样其他项目也可以调用。(除特殊项目需绑定以保护)
    
        [root@jenkins vagrant]# sudo gitlab-ci-multi-runner register
         Running in system-mode.
    
        Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
         http://gitlab.example.com
         Please enter the gitlab-ci token for this runner:
         gWCZZjwskFtS5n4XT6kV
         Please enter the gitlab-ci description for this runner:
         [jenkins]: gitlab-ci
         Please enter the gitlab-ci tags for this runner (comma separated):
         python3.4
         Whether to run untagged builds [true/false]:
         [false]:
         Whether to lock Runner to current project [true/false]:
         [false]:
         Registering runner... succeeded                     runner=gWCZZjws
         Please enter the executor: docker, shell, ssh, kubernetes, docker-ssh, parallels, virtualbox, docker+machine, docker-ssh+machine:
         docker
         Please enter the default Docker image (e.g. ruby:2.1):
         python:3.4
         Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
    
    注册runner
    查看
        [root@jenkins vagrant]# sudo gitlab-ci-multi-runner list
         Listing configured runners                          ConfigFile=/etc/gitlab-runner/config.toml
         jenkins                                             Executor=shell Token=d790b6db10f7f7d3b8547519818948 URL=http://10.0.0.190/
         gitlab-ci                                           Executor=shell Token=ad11a86454c6552424fbf0d6c8b029 URL=http://gitlab.example.com
         gitlab-ci                                           Executor=docker Token=0304db778d4e040d25234594dbe363 URL=http://gitlab.example.com
         gitlab-ci                                           Executor=docker Token=b57303fbaf1623a5d8c42723606aad URL=http://gitlab.example.com
         [root@jenkins vagrant]# sudo gitlab-ci-multi-runner verify
         Running in system-mode.
         Verifying runner... is alive                        runner=ad11a864
         Verifying runner... is alive                        runner=0304db77
         Verifying runner... is alive                        runner=b57303fb
    查看

       projects 的导入,可以通过github,url等导入到gitlab

    创建Pipeline

    在项目根目录下创建 .gitlab-ci.yml  并配置。 Python 的 tox 测试

     .gitlab-ci.yml
    
    stages:
      - style
      - test
      - deploy
      - release
    
    pep8:
      stage: style
      script:
        - pip install tox
        - tox -e pep8
      tags:
        - python2.7
      except:
        - tags
    
    unittest-py27:
      stage: test
      script:
        - pip install tox
        - tox -e py27
      tags:
        - python2.7
      except:
        - tags
    
    unittest-py34:
      stage: test
      script:
        - pip install tox
        - tox -e py34
      tags:
        - python3.4
      except:
        - tags
    
    docker-deploy:
      stage: deploy
      script:
        - docker build -t flask-demo .
        - if [ $(docker ps -aq --filter name=web)];then docker rm -f web;fi
        - docker run -d -p 5000:5000 --name web flask-demo
      tags:
        - demo
      only:
        - master
    
    docker-image-release:
      stage: release
      script:
        - docker build -t registry.example.com:5000/flask-demo:$CI_COMMIT_TAG .
        - docker push registry.example.com:5000/flask-demo:$CI_COMMIT_TAG
      tags:
        - demo
      only:
        - tags
    
    
    
    .gitlab-ci.yml
    项目根目录下的集成文件    .gitlab-ci.yml     配置集成和部署的步骤 (pipeline)
    
    
        tags:            # 执行环境
          - runner
    
        except:          # 排除,tags不触发
          - tags
    
        only:          # 只有master更改才触发
          - master
    
        stages:        # 流程,有哪些步骤
          - style
          - test
          - dploy
          - release
    
        job name:     #job名称 ,属于某一个流程   
    
    .gitlab-ci.yml配置语法 具体看帮助信息

        gitlab 可以 实现代码仓库托管,直接拉取仓库集成测试。这块比较好,而且天生支持分布式。

    CI的部署,但是runner公有的有限,还是得要有自己的测试runner,可以在本地自己搭建linux gitlab runner ,配置好环境,并注册,供gitlab CI 测试调度。然后发布到正式服务器。
         gitlab-ci 本身就支持分布式,可以再多台机器上执行runner 供gitlab 调用测试

    要注意保护 master 分支 ,不能被随意修改,
         在 CI 设置里有 master protect 选项 和 parallel 检查设置
         只有push-->merge request-->pipline 测试通过 --> commit

    .travis.yml # travis集成环境的环境配置文件 https://travis-ci.org/ 一个CI网站 ,开源项目免费,私有项目要钱。

    language: python
    env:
      - TOXENV=py27
      - TOXENV=py34
      - TOXENV=pep8
      - TOXENV=docs
    
    install:
      - pip install tox
      - pip install coveralls
    script:
      - tox
    
    after_success:
      coveralls --verbose
    
    .travis.yml

    提交触发后 pipeline 的执行流程,可以点不同job 进行查看执行情况

    6bac82cb-382c-496d-9a69-934598deb759

    注意要给项目分配 runner

    image

      当runner 环境为shell等非docker 时,要拉取自己搭建的gitlab 仓库,只需要配置hosts文件即可。

      可当用runner 是 docker 时,每次拉取代码时,docker并不知道宿主机上的host文件,又不可能手动加进去,那样太麻烦。所以会出现无法访问自己的gitlab仓库。

    这时候就需要,搭建DNS解析服务器,让docker能够解析到仓库。 

    搭建DNS 服务器

      配置一个DNS服务器,以便能让其他容器解析到集成服务器 gitlab.example.com

      首先,在gitlab ci服务器上把 gitlab.example.com 从/etc/hosts里删除

      这时候在gitlab ci服务器上是 ping 不通 gitlab.example.com的。
       找一台新的Linux host,装好Docker,创建一个dnsmasq的容器,并运行。

    docker-dns 服务器搭建
        docker-host
         docker run -d -p 53:53/tcp -p 53:53/udp --cap-add=NET_ADMIN --name dns-server andyshinn/dnsmasq
         docker exec -it dns-server /bin/sh
    首先配置上行的真正的dns服务器地址,创建文件:
      vi /etc/resolv.dnsmasq
    添加内容:
       nameserver 114.114.114.114
       nameserver 8.8.8.8
    # 置本地解析规则,这才是我们的真实目的。新建配置文件
    vi /etc/dnsmasqhosts
    # 加解析规则,其中192.168.205.160是本地 gitlab 服务器地址
      192.168.205.160 gitlab.example.com
    修改 dnsmasq 配置文件,指定使用上述我们自定义的配置文件
    
    vi /etc/dnsmasq.conf 修改下述两个配置
      resolv-file=/etc/resolv.dnsmasq
      addn-hosts=/etc/dnsmasqhosts
    
    回到宿主,重启dns-server容器服务。
      docker restart dns-server
    这时候这台docker host就是一个DNS服务器了,假如他的地址是192.168.205.15
    
    dns-server 配置

     搭建完dns服务器后,要修改为gitlab ci 服务器DNS服务器的ip ---> nameserver 192.168.205.15

    [vagrant@ci ~]$ more /etc/resolv.conf
    # Generated by NetworkManager
    #nameserver 10.0.2.3
    nameserver 192.168.205.15
    view

    这时候 docker 就能访问到gitlab服务器。

    搭建Docker registry 仓库服务器

      docker hub 上传的镜像,属于公开状态,docker cloud 有要钱,还好可以搭建自己的docker registry服务器。这样push pull就方便多了。

      这里将docker registry 服务器安装在dns同一台机器上。

    docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2

      配置 dns-server

    执行
    docker exec-it dns-server/bin/sh
    添加一条新的记录
    / # more /etc/dnsmasqhosts
    192.168.205.160 gitlab.example.com
    192.168.205.15 reqistry.example.com
    view

      docker restart dns-server

    ci 服务器 测试push 时 报错
        [root@jenkins vagrant]#  docker push registry.example.com:5000/flask-demo:V10
         The push refers to repository [registry.example.com:5000/flask-demo]
        Get https://registry.example.com:5000/v2/: http: server gave HTTP response to HTTPS client
    docker-registry 服务器为http协议
        客户端设置默认是HTTPS 协议取push
         所以要特别更改/etc/docker/daemon.json
         "insecure-registries":["http://registry.example.com:5000"]
    [root@jenkins vagrant]# more /etc/docker/daemon.json
        {
          "registry-mirrors": ["https://6qcpzbml.mirror.aliyuncs.com"],
          "insecure-registries":["http://registry.example.com:5000"]
         }

    查看push到registry的镜像版本

         http://registry.example.com:5000/v2/flask-demo/tags/list

    查看push的镜像 registry
         [root@docker-host ~]# ls /opt/registry/docker/registry/v2/repositories/
         flask-demo

    在测试通过需要将最新的image push 到仓库

    同时 部署容器时,要判断是否有旧的版本容器需要删除,然后再run新版本的容器

    image

    $CI_CONMMIT_TAG 是gitlab-ci 的环境变量。具体可以查看帮助文件

       一有版本发布或是提交时会自动测试,管理员检查合并到master分支后,就会触发pipeline执行集成构建,build的最新镜像会被push 到仓库。

       然后配置发布服务器从仓库拉取镜像,删除旧的版本,重新run新的版本。就完成了一次自动集成部署。

  • 相关阅读:
    .net 网站登录
    .net controller 跳转到 controller
    c# 访问Mysql
    C#去除字符串的最后一个字符
    try catch
    MySqlDataReader
    转:十六进制颜色与RGB颜色对照表
    js:Razor视图下服务器代码给Javascript变量赋值
    .netMVC:Web页面向后台提交数据的方式和选择
    jquery方法
  • 原文地址:https://www.cnblogs.com/wenyule/p/10049404.html
Copyright © 2011-2022 走看看