Docker刚刚启动后就退出了

时间:2017-07-20 13:45:39

标签: docker dockerfile

所以在开始提问之前,这是我对码头工作者的理解。

  1. Docker有3个组件
  2. 图片
  3. 容器
  4. Dockerfile
  5. 现在,图像是创建容器的图像,而Dockerfile就像流程一样。简单来说,图像是类容器是图像的对象。

    现在我不想采用Dockerfile的方法来指定创建容器时要执行的步骤。

    我想在Linux上安装一些基本实体,比如MongoDb,Redis等,并运行我的服务器。

    所以我开始这样:

    1. 我通过docker pull ubuntu从Docker Hub下载了Ubuntu映像 它返回了我18261df960118..7a16(big hex key)

    2. 现在我必须为这个图像创建一个容器,以实现我的目的:

      docker create -h abc.com --name abc.com 18261df960118..7a16

    3. 它返回了我的容器ID。

      1. 为了进入容器,我必须首先启动它,然后连接到它,所以这里的命令docker start containerId后跟docker attach containerId
      2. 但每次都说:

          

        您无法附加到已停止的容器,请先启动它。

        请帮助我做错的地方,对于很多人来说这可能是一个新手的问​​题,但是我被困在这里,请不要为此事做好投票。

        提前致谢。

4 个答案:

答案 0 :(得分:5)

修改 在我的原始帖子中,我提到:“尝试与VM一样思考”。我最近陷入了this,它说没有这样做:

  

停止 将容器视为迷你虚拟机,而是开始将其视为一个流程

还值得一读文章:Containers are not VMs

原帖:

Docker容器的逻辑是他们应该启动并运行服务。如果此服务停止,它们将退出并进入“已停止”状态。 (当您了解有关Docker的更多信息时,您将了解其工作原理,并且您将能够使用ENTRYPOINTCMD)。但是让我们暂时忽略这一点并试着像VM一样思考,运行一个新容器并进入内部键入一些命令......

这成功了:

docker container create -it --name test ubuntu
445cad0a3afea97494635361316e5869ad3b9ededdd6db46d2c86b4c1461fb75
$ docker container start test
test
$ docker container exec -it test bash
root@445cad0a3afe:/# your are inside, you can type your commands here!

为什么你的失败......

创建容器时,您没有使用有助-i的{​​{1}}标记。这实际上意味着当容器启动时,它使用官方ubuntu Dockerfile中的Keep STDIN open even if not attachedCMD,然后立即退出。

docker attach VS docker exec --it bash

您可以使用bash等图片对其进行测试。如果您运行一个新的nginx容器并尝试附加到它,您将看到来自nginx的日志正在打印出来,您无法在shell中键入任何命令。这是因为图像的CMD如下:

nginx

为了能够“附加”到这样的容器,但也能够使用shell(其他一些人也可能会提到这类似于对容器执行等同于# Define default command. CMD ["nginx"] 的操作),你将不得不运行:

ssh

我建议你也阅读:

答案 1 :(得分:3)

检查Docker容器是否正在运行,执行以下命令:

docker ps

如果是,您可以使用container-id进行附加,如下所示:

docker attach <docker-container-id>

未创建容器?

docker run -d -it <docker-image-name>

在您的情况下,它是:docker run -d -it ubuntu:latest

附加Docker容器

docker attach <docker-container-id>

将Docker容器转换为Docker镜像

获取您的docker容器ID,如下:

docker ps -a

然后提交:

docker commit <docker-container-id> abc-image

使用docker push

将其保存在本地或推送到远程

答案 2 :(得分:1)

Dockefile构建图像,因此Dockerfile中的指令仅在构建时运行。唯一的例外是CMD和/或ENTRYPOINT。那些指示容器在创建容器时要运行什么命令。

不使用Dockerfile来构建自己的图像,首先会破坏使用docker的目的。您当然可以将容器视为VM并手动安装,但为什么不直接使用virtualbox?

我还强烈建议您使用docker hub中的官方图片开始。通过扩展这些图像来修改它们。创造出色的图像需要做很多工作。

答案 3 :(得分:1)

你做错了事。要构建自己的图像,您需要使用Dockerfile。然后,您可以使用Dockerfile构建您的图像,如下所示:

FROM <your based image>
RUN <some commands to adapt the based image>
ENTRYPOINT (or CMD) <your command>

要了解ENTRYPOINTCMD指令之间的区别,请here

建议每个容器只运行一个进程。如果您需要运行多个流程,您应该查看Docker compose,然后让不同的容器一起工作。