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]