根据我目前阅读的教程,使用"docker run -d"将从image启动一个容器,并且容器将在后台运行。这就是它的样子,我们已经有了container id。

root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d

但如果我运行“docker ps”,什么都没有返回。

所以我尝试了“docker ps -a”,我可以看到容器已经退出:

root@docker:/home/root# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                         PORTS               NAMES
605e3928cddd        centos:latest         "/bin/bash"         31 minutes ago      Exited (0) 31 minutes ago                          kickass_swartz

我做错什么了吗?如何解决此问题?


当前回答

首先,您需要检查是否有容器正在运行 输入命令,

Docker ps -all

如果有任何容器正在运行,那么停止它们 输入命令,

docker stop容器Id

现在,最后使用以下命令..........运行docker docker运行-t -p 2020:3000 dockerImageName

因此,打开你的谷歌chrome浏览器,并访问localhost:2020

恭喜:)

其他回答

根据这个答案,添加-t标志将防止容器在后台运行时退出。然后使用docker exec -i -t <image> /bin/bash进入shell提示符。

docker run -t -d <image> <command>

-t选项似乎没有很好地记录,尽管帮助说它“分配了一个伪tty”。

如果你在Dockerfile的末尾使用CMD,你所能做的就是在末尾添加代码。只有当你的docker构建在ubuntu上,或者任何可以使用bash的操作系统上时,这才会起作用。

&& /bin/bash

简单地说,Dockerfile的结尾看起来像这样。

...

CMD ls && ... && /bin/bash

因此,如果您在运行docker映像后自动运行任何内容,并且当任务完成时,bash终端将在docker中处于活动状态。因此,您可以输入shell命令。

我已经在下面的帖子中解释了这个问题。

使用“exit”后如何保留docker alpine容器?

在交互模式下运行docker可能会解决这个问题。

下面是使用和不使用交互模式运行映像的示例

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker运行-d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker ps

容器id镜像命令创建状态端口名称

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5

chaitra@RSK-IND-BLR-L06:~/dockers$ sudo docker ps

容器id镜像命令创建状态端口名称 “bash”2 seconds ago Up 1秒

也许这只是我的问题,但在CentOS 7.3.1611和Docker 1.12.6上,我最终不得不使用@VonC和@Christopher Simon发布的答案的组合来可靠地工作。在此之前我所做的任何事情都不会阻止容器在成功运行CMD后退出。我正在启动oracle-xe-11Gr2和sshd。

Dockerfile

...
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && systemctl enable sshd
...
CMD /etc/init.d/oracle-xe start && /sbin/sshd && tail -f /dev/null

然后添加-d -t和-i运行

docker run --shm-size=2g --name oracle-db -d -t -i -p 5022:22 -p 5080:8080 -p 1521:1521 centos-oracle:7.3.1611 

在我用头撞墙几个小时后终于

ssh -v root@127.0.0.1 -p 5022
...
root@127.0.0.1's password: 
debug1: Authentication succeeded (password).

不管出于什么原因,如果末尾的-f被删除,或者省略了任何-t -d -i选项,上述命令将在执行CMD后退出。