对于 devops 来说,容器技术绝对是我们笑傲江湖的法宝。本文通过一个小 demo 来介绍如何使用容器技术来改进我们的 devops 工作流。

devops 的日常工作中难免会有一些繁琐的重复性劳动。比如管理 Azure 上的各种资源,我们会使用 Azure CLI 工具。同时我们也会使用 Ansible 完成一些自动化的任务。当我们同时使用二者的时候就会碰到一些尴尬的事情:Azure CLI 依赖的 python 版本为 3.x,而 Ansible 的主流版本还在依赖 python 2.x。如果我们要同时使用二者,就需要在环境中搞一些飞机。如果团队中的每个成员都需要使用这样的工具,那么每个人的环境中都需要这些飞机!下面是一些比较类似的问题:

  • 一些工作流在陌生的环境中不能正确的工作
  • 在工作流中加入新的工具时,整个团队都需要获取并安装这些新的工具
  • 运行 devops 工作流不能对当前的环境产生影响(应该允许在 build 环境中运行 devops 工作流)
  • 工作流的变化不会对运行环境产生任何的影响

实现这些需求的最好方式就是容器技术!通过容器把我们的 devops 工作流和运行环境隔离开就可以了。文本的 demo 会演示一个非常简单的使用 Azure CLI 的工作流,我们的目标是为整个团队打造一个满足以上需求的工具集(容器镜像)。其大体步骤如下:

  • 创建构造容器镜像的 Dockerfile 文件
  • 在本地构建容器镜像并进行测试
  • 对容器镜像不断的升级完善
  • 把容器镜像分享给整个团队

构建容器镜像

让我们使用 Dockerfile 来创建自己的容器镜像。先创建目录 cazurecli,并在目录下创建 Dockerfile 文件:

$ mkdir cazurecli
$ cd cazurecli
$ touch Dockerfile

编辑 Dockerfile 文件的内容如下:

FROM microsoft/azure-cli:latest
CMD bash

其中的 FROM 指令用来指定 base 镜像,这里我们直接使用了微软提供的 azrue-cli 镜像,只是把容器启动时执行的命令通过 CMD 指令设置为 bash。

然后执行下面的命令构建容器:

$ docker build -t azcli .

上图的输出显示容器镜像构建成功,我们可以通过 azcli:latest 来引用新构建的容器镜像。那就让我们启动容器并执行 azure cli 命令:

$ docker run --rm -it azcli:latest

进入容器中的命令行后,尝试通过 az account list 查看 azure 账号信息:

bash-4.3# az account list

红框中的信息是提示我们先通过 az login 命令登录才能查看账号信息:

bash-4.3# az login

然后按照提示信息打开浏览器,输入验证码进行登录。在浏览器中登录完成后命令行上的登录过程也随之完成,然后重新执行 az account list 命令:

这样就可以输出你的账号信息了。

解决 Azure CLI 的登录问题

如果你实验了 az login 命令,就会发现登录的过程还是挺繁琐的,如果每次启动容器都需要执行登录操作你会怎么想呢?肯定是弱爆了!
好在我们可以通过 bind mount 的方式把 azure 的登录信息保存在 host 的文件中。以后启动容器时挂载这些登录信息就可以了。下面是具体的步骤。
先在用户的家目录中创建 .azure 目录:

$ mkdir ${HOME}/.zaure

然后启动一个容器并以 bind 的模式挂载 .azure 目录:

$ docker run --rm -it --mount type=bind,source=${HOME}/.azure,target=/root/.azure azcli

在容器中进行一次登录操作:

# az login

登录完成后,登录的信息被保存到了 /root/.azure 目录中:

退出当前的容器,执行下面的命令创建一个新的容器:

$ docker run --rm -it --mount type=bind,source=${HOME}/.azure,target=/root/.azure azcli

然后再执行一次 az account list 命令试试,这次就不需要登录了!
注意:即便这样也不是一劳永逸的,默认的登录信息过期时间为两周,到时候你需要再次进行登录。

添加自定义的工作流

对于一名 devops 工程师来说,我们在 azure 上的操作多是一些枯燥的重复动作。
比如:

  • Start/Stop/Deallocate/Restart 数量众多的虚机
  • 检查大量的虚机状态
  • 拿到 IP 地址后查出对应的主机名称等等

其实我们可以把这样的功能进行封装,从而简化具体的操作。下面我们举个简单的例子,就是把查询 ResourceGroup 和虚机的操作封装成 bash 中的函数。先在 cazurecli 目录下创建 scripts 目录:

$ mkdir scripts

然后在 scripts 目录下创建 search.sh 文件:

$ touch scripts/search.sh

编辑 search.sh 文件的内容如下:

#!/bin/bash

# search for Resource Group by name
function search-group () {
query=$
az group list --query "[?name | contains(@,'$query')].{ResourceGroup:name}" -o table
} # search for VM by name
function search-vms () {
query=$
az vm list --query "[?name | contains(@,'$query')].{ResourceGroup:resourceGroup,Name:name}" -o table
}

在这段脚本中我们定义了两个函数,分别是通过名称来查询 ResourceGroup 和虚机(要了解相关的查询语法,请参考 az 命令)。
下面我们把 search.sh 脚本集成到容器的镜像中,并把脚本中的函数导入到 bash,编辑 Dockerfile 如下:

FROM microsoft/azure-cli:latest
COPY scripts/ scripts/
RUN echo -e "\
; for f in /scripts/*; \
do chmod a+x \${f}; source \${f}; \
done;" >> ~/.bashrc CMD bash

用新的 Dockerfile 重新构建容器镜像:

$ docker build -t azcli .

创建容器并尝试使用 search-group 和 search-vms 函数:

$ docker run --rm -it --mount type=bind,source=${HOME}/.azure,target=/root/.azure azcli
bash-4.3# search-group learnrg
bash-4.3# search-vms testdesktop

这样用起来是不是简便很多了!如果我们把常用的操作都写成脚本封装起来,是不是就能够打造一系列的自动化工作流了!

把镜像放在 docker hub 上进行共享

demo 虽小,但我们还是要完成一个完整的用例的最后一步,就是在整个团队中分享上面创建的容器化工作流。具体的做法大概有两种:

  • 通过 dockerhub 等第三方平台分享容器镜像
  • 在公司内搭建内部使用的镜像管理平台

两种方式都很方便,喜欢第二种方式的朋友可以参考笔者的博文《局域网内部署 Docker Registry》。这里只简单的介绍一下 dockerhub 的用法。首先你需要去 dockerhub 的官网注册一个账号,注册后创建一个 repository,比如笔者的用户名为 ljfpower,新创建的 repository 名称为 azcli。然后需要在本地通过 docker login 命令进行登录。登录后为本地的容器镜像创建一个 tag,比如:

$ docker tag azcli ljfpower/azcli

最后一步便是把这个 tag 标识的容器镜像推送到 dockerhub 上去:

$ docker push ljfpower/azcli:latest

推送完成后你会在 dockerhub 上看到你的镜像:

简单起见笔者使用的是公有镜像,也就是任何人都可以下载使用该镜像。所以你只需要一条 pull 命令就可以享受别人分享的工作流了:

$ docker pull ljfpower/azcli

总结

我们打造了一个工具包,并把它容器化了。因此任何的团队成员都可以通过容器在自己的环境中无差别的运行这些工作流。
这就是生产力呀!因为没人会再抱怨:"这个工具配置起来好恶心","为什么在我的机器上运行不了 xxx" ...
同时,如果需要,你可以在任何环境中运行这些工作流,比如构建产品的服务器上,因为运行这些工作流并不需要安装额外的工具(python、azure cli 等)。
本文的名字起的很大而 demo 很小,权当抛砖引玉了!

参考:
Dockerize DevOps Workflows

容器化的 DevOps 工作流的更多相关文章

  1. 【转帖】使用容器化和 Docker 实现 DevOps 的基础知识

    使用容器化和 Docker 实现 DevOps 的基础知识 https://www.kubernetes.org.cn/6730.html 2020-02-24 15:20 灵雀云 分类:容器 阅读( ...

  2. 2019 DevOps 必备面试题——容器化和虚拟化

    原文地址:https://medium.com/edureka/devops-interview-questions-e91a4e6ecbf3 原文作者:Saurabh Kulshrestha 翻译君 ...

  3. Azure Devops实践(5)- 构建springboot项目打包docker镜像及容器化部署

    使用Azure Devops构建java springboot项目,创建镜像并容器化部署 1.创建一个springboot项目,我用现有的项目 目录结构如下,使用provider项目 在根目录下添加D ...

  4. 4 个场景揭秘,如何低成本让容器化应用 Serverless 化?

    作者 | changshuai FaaS 的门槛 Serverless 形态的云服务帮助开发者承担了大量复杂的扩缩容.运维.容量规划.云产品打通集成等责任,使得开发者可以专注业务逻辑.提高交付速度 ( ...

  5. docker4dotnet #2 容器化主机

    .NET 猿自从认识了小鲸鱼,感觉功力大增.上篇<docker4dotnet #1 前世今生&世界你好>中给大家介绍了如何在Windows上面配置Docker for Window ...

  6. .NET微服务 容器化.NET应用架构指南(支持.NET Core2)

    介绍 企业通过使用容器,日益实现成本节约.解决部署问题并改进 DevOps 和生产操作. 通过创建 Azure 容器服务.Azure Service Fabric 等产品,同时与 Docker.Mes ...

  7. 通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署

    通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署 Intro Azure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的 ...

  8. 容器技术与DevOps

    容器技术的使用支撑了目前 DevOps 三大主要实践:工作流.及时反馈.持续学习. 有人说容器技术与 DevOps 二者在发展的过程中是互相促进的关系.得益于 DevOps 设计理念的流行,容器生态系 ...

  9. Docker---大型项目容器化改造

           虚拟化和容器化是项目云化不可避免的两个问题.虚拟化由于是纯平台操作,一个运行于linux操作系统的项目几乎不需要做任何改造就可以支持虚拟化.而项目如果要支持容器化则需要做许多细致的改造工 ...

随机推荐

  1. 部署用于生产的Exceptionlees(一个强大易用的日志收集服务)

    Exceptionless是一个非常优秀的事件记录服务,目前我们的自部署的Exceptionless已经稳定运行了近一年的时间,收集了千万条事件信息.但Exceptionless官方自宿主部署的文档不 ...

  2. java的枚举2

    首先先理解一下java中枚举的本质. java的世界中一切皆是类,下面通过一个例子解释一下enum的本质: package cn.xnchall.enumeration; public class G ...

  3. Linux shell 脚本(一)

    一.初识脚本 shell:一类介于系统内核与用户之间的解释程序.脚本:一类使用特定语言,按预设顺序执行的文件批处理.宏.解释型程序创建shell脚本:理清任务过程--整理执行语句--完善文件结构1.任 ...

  4. Java环境变量,真的还有必要配吗?

    作为年龄上堪称老鸟而技术上却是菜鸟的老菜鸟,为了祖国的编程事业,不惜拿出一个月工资,淘了一台配置稍高的二手笔记本,打算与老笔记本中的撸啊撸片彻底说再见,誓要在新机种开启一番撸啊撸的新事业.当然,撸代码 ...

  5. Qt中QComboBox中自定义界面使用stylesheet实现下拉按钮独立效果

    使用QSS自定义控件界面时,QT中控件QCombobox含有两个子控件drop-down和down-arrow.一般而言,当改变QCombox时,很多效果都会出来,但是,针对下拉按钮和下拉图标的自定义 ...

  6. FineUI控件集合

    FineUI(开源版)基于 ExtJS 的开源 ASP.NET 控件库. using System; using System.Collections.Generic; using System.Te ...

  7. 功能性AI术语表

    算法:一套计算机要遵循的指令.一个算法可以是一个简单的单步程序也可以是一个复杂的神经网络,但是通常被用来指一个模型. 人工智能:这是一个统称.广义上说,软件意味着模仿或取代人类智能的各个方面.人工智能 ...

  8. C语言第八次博客作业--字符数组

    一.PTA实验作业 题目1:查验身份证 1. 本题PTA提交列表 2. 设计思路 定义i,flag=1,z,m[11],a[19] 输入次数n for i=1 to n+1 gets(a) 加权求和在 ...

  9. Go实现海量日志收集系统(一)

    项目背景 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 当系统机器比较少时,登陆到服务器上查看即可满足 当系统机器规模巨大,登陆到机器上查看几乎不现实 当然即使是机器规模不大,一个系统通常 ...

  10. execCommand的复制

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...