如何启动docker容器作为服务器

时间:2014-07-11 21:18:56

标签: linux ubuntu docker lxc

我想运行一个托管容器来托管一个简单的Web应用程序,但我不明白如何设计/运行图像作为服务器。例如:

docker run -d -p 80:80 ubuntu:14.04 /bin/bash

这将启动并立即关闭容器。相反,我们可以以交互方式启动它:

docker run -i -p 80:80 ubuntu:14.04 /bin/bash

这有效,但现在我必须为每个正在运行的容器打开交互式shell吗?我宁愿启动它并让它在后台运行。黑客将使用永不返回的命令:

docker run -d -p 80:80 {image} tail -F /var/log/kern.log

但是现在我再也无法连接到shell,以检查应用程序正在执行的操作。

有没有办法在后台启动容器(就像我们为vm所做的那样),允许从主机附加/分离shell?还是我完全忽略了这一点?

3 个答案:

答案 0 :(得分:21)

docker run的最后一个参数是在容器中运行的命令。当您运行docker run -d -p 80:80 ubuntu:14.04 /bin/bash时,您正在容器中运行bash,仅此而已。实际上,您希望在容器中运行Web应用程序并使该容器保持活动状态,因此您应该docker run -d -p 80:80 ubuntu:14.04 /path/to/yourapp

但您的应用程序可能依赖于某些配置才能运行。如果它从环境变量中读取其配置,则可以将-e key=value参数与docker run一起使用。如果您的应用程序需要配置文件,您应该首先使用Dockerfile来设置配置。

This article提供了一个在容器中运行节点应用程序的完整示例。

答案 1 :(得分:7)

docker的用户倾向于假设一个容器是一个完整的VM,而docker设计概念更侧重于最佳的容器化,而不是模仿容器中的VM。

两者都是正确的,但是一些实现细节在开始时并不容易熟悉。我试图以一种更容易理解的方式总结一些实现差异。

  1. SSH
  2. SSH是进入Linux VM(或容器)的最直接方式,但是许多dockerized模板没有安装ssh服务器。我相信这是因为优化和容器的安全原因。

    1. docker attach
    2. 如果开箱即用,

      docker attach非常方便。但是在编写时它并不稳定 - https://github.com/docker/docker/issues/8521。可能与SSH设置相关联,但不确定何时完全修复。

      1. docker推荐做法(nsenter等)
      2. Docker在https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/

        推荐的一些替代方案(或某种意义上的最佳做法)

        这种做法基本上将可变元素从容器中分离出来并将它们映射到docker主机中的某些位置,以便可以从容器外部操作和/或持久化它们。在生产环境中可能是一个很好的做法,但现在当更多与docker相关的项目围绕开发和登台环境时,这不是现在。

        1. bash命令行
        2. " docker exec -it {container id} bash"云是进入机器的非常方便和实用的工具。

          1. 一些基础知识

            • " docker run"创建一个新容器,以便不保存以前的更改。
            • " docker start"将启动一个现有容器,以便之前的更改仍将在容器中,但是您需要在具有相同image-id的许多容器中找到正确的容器ID。需要" docker commit"如果需要,可以删除版本。
            • Ctrl-C将在退出时停止容器。你想要追加"&"在最后,所以容器可以运行背景,并在按下回车键时给你提示。

答案 2 :(得分:4)

对于原始问题,你可以像你提到的那样拖尾一些文件来保持进程运行。

要访问shell,而不是"附加",您有两个选择:

  1. docker exec -it <container_id> /bin/bash
  2. 或者

    1. 在容器中运行ssh守护程序,端口映射ssh,然后ssh到容器。