【问题标题】:knife container workflow clarification刀箱工作流程说明
【发布时间】:2015-03-15 12:03:42
【问题描述】:

我最近开始尝试学习如何使用 Chef 来管理 Docker 容器。目前,我正在尝试弄清楚如何使用刀容器 gem 引导 Docker 容器,但我对这种场景的工作流程有点困惑。以下是我迄今为止为此所采取的步骤的高级描述:

  • 首先,为了了解这些技术如何协同工作,我配置了三个 Ubuntu 14.04 Virtualbox VM,一个用于 Chef 服务器,一个用于托管我的容器的节点,以及一个用于开发的工作站。这些机器的网络配置允许使用 NAT 网络接口和 Host-Only 接口连接到 Internet 和相互连接。
  • 我已使用工作站 VM 中的刀命令成功地自行引导 Chef 节点,并且可以使用浏览器中的 Chef 管理控制台验证这一点。

我的困惑是接下来要做什么才能引导我希望在上述 Chef 节点上运行的容器。目前,我正在尝试从我从工作站启动的节点引导过程中运行的几个配方中进行 docker 安装和容器设置。以下是引导期间在节点上运行的配方之一的相关命令:

dockerfile = data_bag_item('dockerfiles', 'ubuntu-dockerfile')["script"].join()

...

execute "knife container docker init test_app -f chef/ubuntu-14.04"

file "/var/chef/dockerfiles/test_app/Dockerfile" do
    content dockerfile
    action :create
end

...

execute "knife container build test_app -d /var/chef/dockerfiles"

execute "docker run -d -p 80:8000 -v /etc/chef /etc/chef/secure test_app python test_app/manage.py runserver 0.0.0.0:8000"

这是加入数据包字符串数组后 Dockerfile 的样子:

FROM chef/ubuntu-14.04
RUN chef-init --bootstrap
RUN rm -rf /etc/chef/secure/*
RUN apt-get -qq update
RUN apt-get -qq install build-essential python-django
RUN apt-get clean
ENV DJANGO_PATH /usr/lib/python2.7/dist-packages/django/bin
RUN chmod u+x $DJANGO_PATH/django-admin.py
RUN $DJANGO_PATH/django-admin.py startproject test
RUN chmod u+x test/manage.py
EXPOSE 8000
ENTRYPOINT ["chef-init", "--onboot"]

第一个问题是,即使我在配方中对 Dockerfile 所做的更改已成功写入 /var/chef/dockerfiles/test_app/Dockerfile 中的文件,但这些更改并没有应用于图像新的 Docker 映像已构建,从我收到的错误消息中可以明显看出 python 不在 PATH 上。我从刀容器的文档中看到,可以提供一个食谱路径和配方运行列表,以便在容器本身上运行。我认为与我的 Dockerfile 执行相同任务的配方可能是一个更好的解决方案,但我不确定说明书路径应该是什么,因为我的说明书与 Chef 服务器而不是容器主机同步。

任何关于我在这里遗漏的见解或建议将不胜感激。

【问题讨论】:

    标签: docker chef-infra knife


    【解决方案1】:

    据我所知,与 Chef 容器一起使用的典型工作流程是从您的工作站生成 Dockerfile、配置 chef-server、运行列表...这将生成构建 Dockerimage 所需的文件(Dockerfile 来自带有 Chef-client 的基本映像以及与服务器同步所需的文件),然后您可以构建该容器。这不是假装将 Docker 安装到节点并在其中运行容器,而是假装 Chef 容器使用资源(厨师食谱和厨师服务器)构建 docker 映像。我建议您观看 Chef 容器作者 Tom Duffield 的演讲 Managing your container workflow with Chef,以阐明它的工作流程。 我认为这不是假装管理厨师节点中容器的执行。为此,您可以查看一些Docker orchestration tools

    【讨论】:

    • 感谢您的信息。我现在有两个问题:1)在您链接到的视频中,演示者仅展示了如何使用带有“-z”选项的本地模式使用刀容器。我对如何使用独立的厨师服务器而不是使用厨师零更感兴趣。有什么想法可以让我找到更多相关信息吗? 2)我现在有一个新的设置来尝试只使用一个厨师服务器和一个节点来托管容器。问题是,现在当我从容器主机运行“knife container build ...”时,我遇到了 SSL 验证失败。知道为什么会发生这种情况吗?
    • 我没有使用过它,但从文档中我了解到,knife 将连接到您在默认刀配置 (~/.chef/knife.rb) 中配置的厨师服务器。关于 SSL,也许您正在安装 Chef Client 12,它默认具有 SSL 通信。检查此链接以了解如何解决此问题:jtimberman.housepub.org/blog/2014/12/11/…
    • 嗯,即使在 docker 主机上运行“knife ssl fetch”后,我仍然遇到问题。通过在 /etc/chef/secure/trusted_certs 上的 Dockerfile 中运行“ls”,我可以看到我的trusted_certs 目录正在被复制到容器中并包含厨师服务器生成的证书,但我仍然得到相同的SSL 验证错误。我正在使用与成功引导独立 Ubuntu VM(使用 Knife bootstrap ...)时使用的相同的 Knife.rb 配置,所以我不确定是什么导致了问题。错误消息的原因不是很具体。
    • 我发现了问题所在。默认情况下,容器中的 /etc/hosts 不包含主厨服务器的主机名/IP,因此我能够通过使用“--add-host=...”标志和“码头工人运行...”。这意味着我必须从 Dockerfile 中完全删除“chef-init --bootstrap”命令,而是在已经构建并运行的容器中运行该命令。我仍在试图弄清楚如何以非交互方式执行此操作,但由于 /etc/hosts 在构建过程中似乎无法动态修改,因此看起来并不乐观。
    • 您可以使用 dns 服务器(如果是,请搜索 dnsmasq 或 skydns+skydock)。还有一个工具(nim-mungehosts)我没有尝试过,但它似乎可以帮助你:github.com/hiteshjasani/nim-mungehosts
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多