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

Jer*_*oen 21 linux ubuntu lxc docker

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

docker run -d -p 80:80 ubuntu:14.04 /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

docker run -i -p 80:80 ubuntu:14.04 /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

docker run -d -p 80:80 {image} tail -F /var/log/kern.log
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*ley 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.如果您的应用程序需要配置文件,则应该首先使用a Dockerfile来设置配置.

本文提供了在容器中运行节点应用程序的完整示例.


小智 8

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

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

  1. SSH

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

  1. 码头工人附加

如果开箱即用,docker attach可以很方便.但是在编写时它并不稳定 - https://github.com/docker/docker/issues/8521.可能与SSH设置相关联,但不确定何时完全修复.

  1. 码头推荐做法(nsenter等)

Docker在https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/推荐的一些替代方案(或某些意义上的最佳实践)

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

  1. bash命令行

"docker exec -it {container id} bash"cloud是非常方便实用的工具,可以进入机器.

  1. 一些基础知识

    • "docker run"会创建一个新容器,因此不会保存以前的更改.
    • "docker start"将启动一个现有容器,因此之前的更改仍将在容器中,但是您需要在具有相同image-id的许多容器中找到正确的容器ID.如果需要,需要"docker commit"来抑制版本.
    • 退出时Ctrl-C将停止容器.您将需要在末尾附加"&",以便容器可以运行背景并在按Enter键时提示您.