我正在尝试使用 LXC。我的目标是在容器内运行单个进程,现在我专注于在容器内运行的进程。
当我在 ubuntu 12.04 上创建一个基本的 LXC 模板时,大约有十个进程正在运行(包括 cron、ttys、init...)。当我对 docker 或 Heroku dynos(使用ps -ef
)执行相同操作时,我仅获得了我启动的进程。这导致了 2 个问题:
Docker 不使用
lxc-create
命令。rootfs
容器(我猜)是下载的自定义图像。他们如何调整此图像以使其仅运行一个进程?Heroku 上的 Dynos 只有一个进程在运行(用户想要运行的进程),但支持在该进程崩溃时自动重启进程。我知道如果进程由
init
或监督,这是可能的upstart
,但这意味着 至少init
应该在 dyno 内运行(事实并非如此)。他们是如何实现这一点的?
这些问题相当复杂,我在这里并不是寻求详细的答案,而只是寻求关于其如何运作的一般想法。
答案1
您可以在以下位置找到有关创建基础映像的一些基本说明docker 文档并查看mkimage
脚本中的源代码的 contrib 目录。归根结底,您使用该debootstrap
工具创建一个 ubuntu/debian 根文件系统,将其打包并导入 docker。从头开始构建最小 ubuntu precise (12.04 LTS) 映像的一个示例是:
debootstrap --verbose --variant=minbase --include='iproute,iputils-ping' --arch=amd64 precise /tmp/precise/ `curl -s http://mirrors.ubuntu.com/mirrors.txt | head -1`
最后一个 curl 位将选择一个靠近你机器位置的 ubuntu 镜像,你也可以简单地传递一个标准的 ubuntu 镜像 url - 请注意,这个镜像现在将被硬编码到你的新图像中etc/apt/sources.list
,因此你可能希望在打包之前通过编辑它来修改它这
docker 容器内正在运行的进程的监督并不是容器本身的任务 - 它们只是负责在隔离环境中运行任何给定的命令。守护进程管理部分应该发生在你的 docker 主机上,即你可以为每个所需的容器编写一个 upstart 作业。