我想运行一个托管容器来托管一个简单的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?还是我完全忽略了这一点?
答案 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。
两者都是正确的,但是一些实现细节在开始时并不容易熟悉。我试图以一种更容易理解的方式总结一些实现差异。
SSH是进入Linux VM(或容器)的最直接方式,但是许多dockerized模板没有安装ssh服务器。我相信这是因为优化和容器的安全原因。
docker attach非常方便。但是在编写时它并不稳定 - https://github.com/docker/docker/issues/8521。可能与SSH设置相关联,但不确定何时完全修复。
Docker在https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/
推荐的一些替代方案(或某种意义上的最佳做法)这种做法基本上将可变元素从容器中分离出来并将它们映射到docker主机中的某些位置,以便可以从容器外部操作和/或持久化它们。在生产环境中可能是一个很好的做法,但现在当更多与docker相关的项目围绕开发和登台环境时,这不是现在。
" docker exec -it {container id} bash"云是进入机器的非常方便和实用的工具。
一些基础知识
答案 2 :(得分:4)
对于原始问题,你可以像你提到的那样拖尾一些文件来保持进程运行。
要访问shell,而不是"附加",您有两个选择:
docker exec -it <container_id> /bin/bash
或者