使用 LXD 容器时如何自动化应用程序部署?

How to automate application deployment when using LXD containers?

在 LXD 容器中应如何 scripted/automatically 部署应用程序?

例如,在 LXD 容器中部署应用程序的最佳方式是使用 bash 脚本(部署应用程序)?如何通过在主机上执行命令在容器内执行这个bash脚本?

是否有任何 tools/methods 以类似于 Docker 食谱的方式做到这一点?

就我而言,我使用 Ansible 来:

  1. 构建 LXD 容器(例如 Web、数据库、redis)。
  2. 连接到容器并部署所需的服务和代码。

例如,您可以使用已部署的服务 and/or 代码构建自己的镜像,并从该镜像构建特定的容器。

我在 LXD 有 Ansible 支持(Ansible 2.2)之前就开始这样做了,当我连接到容器进行部署时,我更喜欢使用 ssh 而不是 lxd 连接 services/code。他们附带了一个配置文件,我在其中设置了我的 ssh public 密钥(通过密钥直接进行 ssh 连接......没有密码)

看看我在 bitbucket 上的开源项目 devops_lxd_containers 它包括:

  • 用于构建 lxd 图像模板的脚本,包括 Apache、tomcat、haproxy。
  • 用于演示自定义应用程序映像构建的脚本,例如 Apache 托管和 key/value 内容以及配置为路由器的 haproxy。
  • 启动容器和映射端口的代码,以便更大的网络可以访问它们
  • 将 haproxy 配置为第 7 层代理以根据 uri 前缀路由在框和容器之间路由 http 请求的代码。基于之前部署和映射端口的位置。
  • 在更高级别,它接受数据驱动器规范,并将部署由分布在许多主机上的许多容器组成的整个环境,并通过第 7 层代理将它们连接起来充当一个整体。
  • 大量文档显示 how I accomplished each major step 在自动化之前使用代码片段。
  • 支持零中断升级的代码,使用 layer7 能力优雅地释放旧连接,同时在新层接受新连接。

整个系统建立在图像构建最好分层进行的前提下。我们构建更新的 Ubuntu 图像。我们从中构建了一个强化的 Ubuntu 图像。我们从中构建了一个基本的 Apache 映像。我们从中构建一个特定于应用程序的映像,例如我们的 apacheKV 示例。目标是永远不会重建超过一次,并重新使用基本 JDK 等通用功能作为所有 JDK 依赖图像的来源,这样我们就可以避免在任何位置出现重复代码。我努力将图像或模板创建与部署和端口映射完全分开。唯一的例外是,在我们了解其他映像的映射方式之前,我无法完成第 7 层路由映像的创建。

我一直在使用 Hashicorp Packer 和 ansible provisioner 使用 ansible_connection = lxd

  • 此处针对 constructing a template

    的一些注释
  • 当遍历主机系统上的 local 文件时,您 可能 需要使用 ansible_connection = local(例如 stat & 朋友)

  • 在 ansible 中使用 local_actionlxd 连接仍然是 使用 stat 时容器内的操作(​​但不使用文件的 include_varslookup 函数)

  • 在 Ansible 中使用大量 debug 消息有助于了解 ansible 实际在哪个 local 环境中运行。