Docker容器无法启动,显示为“n秒前退出”

我想了解Docker在启动/进入容器时的工作方式。 我是新来的,所以忍受着我。 我尝试在SO中find我需要的答案,但目前为止还没有。

我正在努力实现3个基本的东西:

  • 启动一个容器
  • 确保所有的端口映射到我的容器(即我可以从我的容器外看到我的容器的Apache)
  • SSH或让控制台进入我的容器

这是我用来启动一个容器的:

caldav@caldav:~/docker/caldav-server$ sudo docker run -it -d -P caldav-server service apache2 start 

48fbea1865e302768a863767bf01b08f35f0221a4b29e5f2208d57e54660ef42

但是当我运行ps时,我认为它是“在n秒前退出”的:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 48fbea1865e3 caldav-server "service apache2 sta 2 seconds ago Exited (0) 1 seconds ago 

这甚至意味着什么? 显然,当我转到http:// [IP_ADDRESS]时,我不会看到它并运行

更新:好吧,当我删除Apache启动命令,似乎熬夜:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 20d5daca6237 caldav-server "/bin/bash" 10 seconds ago Up 9 seconds thirsty_ritchie 

但是,我似乎没有能够把控制台。 这是我试过的:

 docker attach 20d5daca6237 

这是好的(给我bash访问)。 但是,当我尝试通过键入退出它

 $ exit 

然后在ps中将容器显示为“退出”状态。 我做错了吗?

一个Docker容器只要运行初始命令就可以运行。 在这种情况下,该命令是service apache2 start ,在不超过几秒钟之后退出,此时容器也停止。 如果你想在一个容器中运行一个守护进程,你需要使守护进程成为主程序, 使其在前台运行,或者使用一个可以处理守护进程的命令(如phusion/baseimage

当你连接到一个容器,然后退出,你的shell被杀死,然后你的容器停止,因为这是你的init进程。

试试这些想法:

如果你需要获得一个控制台到任何docker图像,你只需要使用“docker exec”

docker exec -ti [containername / hash] / bin / bash

或者安装Jpetazzo的nsenter / docker-enter工具

https://github.com/jpetazzo/nsenter

他们比docker执行人员容易得多

跑完之后

docker run –rm -v / usr / local / bin:/ target jpetazzo / nsenter

只是使用

docker-enter [containername]