问题描述
我想运行一个托管简单Web应用程序的Docker容器,但是我不了解如何设计/运行作为服务器的映像。例如:
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 ?还是我完全忘记了要点?
最佳思路
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提供了一个在容器中运行节点应用程序的很好的完整示例。
次佳思路
docker用户倾向于将容器视为完整的VM,而docker设计概念更侧重于最佳容器化,而不是模仿容器中的VM。
两者都是正确的,但是一开始的一些实现细节并不容易熟悉。我试图以一种易于理解的方式来总结一些实现上的差异。
-
SSH协议
SSH是进入Linux VM(或容器)的最straight-forward方式,但是许多dockerized模板没有安装ssh服务器。我认为这是由于优化和容器的安全原因。
-
码头工人附加
如果用作out-of-the-box,则可以使用docker attach。但是,在编写时,它并不稳定-https://github.com/docker/docker/issues/8521。可能与SSH设置相关联,但不确定何时将其完全修复。
-
码头工人推荐的做法(nsenter等)
Docker在https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/推荐的一些替代方法(或某种意义上的最佳实践)
这种做法基本上将可变元素从容器中分离出来,并将它们映射到docker主机中的某些位置,以便可以从容器外部对其进行操作和/或持久化。在生产环境中可能是一个好习惯,但现在不是这样,因为与开发人员和暂存环境有关的更多Docker相关项目都没有。
-
bash命令行
“ docker exec -it {容器ID} bash”云是进入计算机的非常方便实用的工具。
-
一些基础
-
“docker run”创建一个新容器,因此以前的更改将不会保存。
-
“docker start”将启动现有容器,因此以前的更改仍将在容器中,但是您需要在许多具有相同image-id的容器中找到正确的container-id。如果需要,需要”docker commit”取消显示版本。
-
Ctrl-C退出时将停止容器。您将需要在末尾附加”&”,以便容器可以在后台运行,并在按Enter键时提示您。
-
第三种思路
对于原始问题,您可以像上面提到的那样尾随一些文件,以保持进程运行。
要到达 shell ,您有两个选择,而不是”attach”:
-
docker exec -it <container_id> /bin/bash
要么
-
在容器中运行ssh守护进程,将ssh映射到端口,然后将ssh映射到容器。