当前位置: 首页>>技术教程>>正文


linux – 如何启动Docker容器作为服务器

, , ,

问题描述

我想运行一个托管简单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。

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

  1. SSH协议

SSH是进入Linux VM(或容器)的最straight-forward方式,但是许多dockerized模板没有安装ssh服务器。我认为这是由于优化和容器的安全原因。

  1. 码头工人附加

如果用作out-of-the-box,则可以使用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 {容器ID} bash”云是进入计算机的非常方便实用的工具。

  1. 一些基础

    • “docker run”创建一个新容器,因此以前的更改将不会保存。

    • “docker start”将启动现有容器,因此以前的更改仍将在容器中,但是您需要在许多具有相同image-id的容器中找到正确的container-id。如果需要,需要”docker commit”取消显示版本。

    • Ctrl-C退出时将停止容器。您将需要在末尾附加”&”,以便容器可以在后台运行,并在按Enter键时提示您。

第三种思路

对于原始问题,您可以像上面提到的那样尾随一些文件,以保持进程运行。

要到达 shell ,您有两个选择,而不是”attach”:

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

要么

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/10270.html,未经允许,请勿转载。