Docker容器无法启动(docker start)

82

我用以下命令创建了容器:

docker run -d -p 52022:22 basickarl/docker-git-test

以下是命令:

root@basickarl:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
root@basickarl:~# docker ps -a
CONTAINER ID        IMAGE                              COMMAND             CREATED             STATUS                           PORTS               NAMES
e4ac54468455        basickarl/docker-git-test:latest   "/bin/bash"         7 minutes ago       Exited (0) 26 seconds ago                            adoring_lumiere     
22d7c5d83871        basickarl/docker-git-test:latest   "/bin/bash"         2 hours ago         Exited (127) About an hour ago                       thirsty_wright      
root@basickarl:~# docker attach --sig-proxy=false e4
FATA[0000] You cannot attach to a stopped container, start it first 
root@basickarl:~# docker start e4
e4
root@basickarl:~# docker attach --sig-proxy=false e4
FATA[0000] You cannot attach to a stopped container, start it first 
root@basickarl:~# 

其实没什么可说的,我希望容器启动并保持运行。这是日志:

root@basickarl:~# docker logs e4
root@basickarl:~# 

4
docker logs e4 说了什么? - kojiro
@kojiro 更新了问题,似乎不想给我任何东西。 - basickarl
当然,你不能真正附加到已退出的 shell。即使在这种情况下使用 docker start -ia $(docker ps -ql) 也会失败。你最好将该容器提交并启动一个新镜像。 - kojiro
3个回答

108

您正在尝试运行交互式 shell bash,该 shell 需要 tty 才能操作。使用 -d 在“分离”模式下运行它并没有太多意义,但您可以通过在命令行中添加 -it 来实现这一点,这将确保容器具有与之关联的有效 tty,以及保持连接的 stdin

docker run -it -d -p 52022:22 basickarl/docker-git-test

当启动分离式容器时,您通常会运行某种长时间运行的非交互式进程(例如 sshd、Web 服务器、数据库服务器或进程管理器,如 systemdsupervisor)。

如果您想运行类似于 sshd 的服务,则不能简单地运行 service ssh start。这将根据您在容器内部运行的发行版而执行以下两个操作之一:

  • 尝试联系进程管理器,如 systemdupstart,以启动服务。因为没有运行服务管理器,所以这将失败。

  • 实际上会启动 sshd,但它将在后台启动。这意味着 (a) service sshd start 命令退出,从而意味着 (b) Docker 认为您的容器已失败,因此会清理一切。

如果您想在容器中仅运行 ssh,请考虑使用类似这个的示例。

如果您想在容器内运行 sshd 和其他进程,则需要调查某种进程管理器。


4
好的,但需要确认一下,这将会创建一个新的容器,而不是启动现有的容器。 - kojiro
2
这就是为什么现有的程序无法启动。Bash立即失败,因为它没有附加tty。这也是为什么没有日志的原因(因为进程立即退出而不生成任何输出)。 - larsks
1
啊,你刚刚让我明白了,如果我不运行某个进程的话,它当然是不存在的。 - basickarl
很有趣,你提到了 ssh,因为这正是我正在尝试让它工作的东西。我运行了 docker run -d -p 52022:22 basickarl/docker-git-test service ssh start,但它无法保持运行状态。日志显示 OpenSSH 已经启动了。 - basickarl
好的信息!现在通过 docker run -d -p 52022:22 basickarl/docker-git-test /usr/sbin/sshd -D 已经运行成功了。 - basickarl

3
我需要在我的Ubuntu机器上使用不同端口/3301/的MariaDb和Docker,因为我已经安装并运行了3306上的MySql。
经过半天的搜索,我用以下方法实现了这个目标:
docker run -it -d -p 3301:3306 -v ~/mdbdata/mariaDb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mariaDb mariadb

这个命令会拉取最新版本的MariaDb镜像,创建名为mariaDb的容器,并在3301端口上运行mysql。所有数据都位于/home目录下的/mdbdata/mariaDb文件夹中。

登录mysql可以使用以下命令:

mysql -u root -proot -h 127.0.0.1 -P3301

使用的资料来源:

Iarks在这篇文章 /using -it -d中的回答是关键 :) /

如何在Ubuntu 16.04上安装和使用Docker

通过Docker安装和使用MariaDB

MariaDB和Docker使用案例-第一部分

祝大家好运!


0
您可以查看日志并检查Dockerfile或其他问题是否存在。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接