Docker刚刚启动后退出

所以在开始这个问题之前,我是对docker的理解。

  1. Docker有3个组件
  2. 图片
  3. 集装箱
  4. Dockerfile

现在图像是容器被创build的,Dockerfile就像是一个stream动的东西。 简单地说, 图像是类容器是图像的对象。

现在我不想采用Dockerfile的方法,在那里指定在创build容器时要执行的步骤。

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

所以我开始像这样:

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

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

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

它返回了我的容器的id。

  1. 为了进入容器,我必须首先启动它,然后连接到它,所以这里是命令docker start containerId后面的docker attach containerId

但每一次它都在说:

您不能附加到停止的容器,首先启动它。

请帮助我在哪里做错了,这可能是许多新手的问题,但我在这里卡住,请不要downvote相同。

提前致谢。

编辑:在我原来的职位,我提到: “尝试像虚拟机一样思考” 。 我最近陷入了这个 ,说不这样做:

不要 把容器当成一个小型的虚拟机,而应该把它看成是一个过程

值得一读的文章: 容器不是虚拟机


原文:

Docker容器的逻辑是它们应该有一个服务启动和运行。 如果该服务停止,则退出并进入“停止”状态。 (当您了解更多关于Docker的信息时,您将会明白这是如何工作的,您将能够使用ENTRYPOINTCMD )。 但是让我们暂时跳过这一步,尝试像使用虚拟机一样思考,运行一个新的容器并进入一些命令。

这成功了:

 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! 

为什么你失败了…

当你创build容器时,你没有使用-i标志,这有助于Keep STDIN open even if not attached 。 这实际上意味着当容器启动时,它使用官方的Ubuntu Dockerfile中设置的CMD ,这是bash ,然后立即退出。

docker附加VSdocker执行 – 它bash

你可以用像nginx这样的图像来testing它。 如果你运行一个新的nginx容器并试着连接它,你会看到nginx的日志正在被打印出来,你不能在shell中input任何命令。 发生这种情况是因为图像的CMD如下所示:

 # Define default command. CMD ["nginx"] 

为了能够“附加”到像这样的容器,但也能够使用shell(一些其他人可能也提到这样做做一些等同于ssh的容器),你将不得不运行:

 docker container exec -it your_container_name bash 

我build议你也读一下:

  • 是否有可能在正在运行的容器中启动一个shell会话(不使用ssh)

  • Docker – input新的TTY运行容器

  • 你如何附加和脱离Docker的过程?

  • 为什么docker集装箱立即退出

  • 〜jpetazzo:如果你在你的Docker容器中运行SSHD,你做错了!

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

 docker ps 

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

 docker attach <docker-container-id> 

容器没有创build?

 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推送到远程

Dockefile构build映像,所以Dockerfile的指令只能在构build时运行。 唯一的例外是CMD和/或ENTRYPOINT 。 这些指示容器创build容器时运行的命令。

不使用Dockerfile来构build自己的图像会首先破坏使用Dockerfile的目的。 你当然可以把容器当作虚拟机来手动安装,但为什么不使用virtualbox呢?

我也强烈推荐使用docker集线器的官方图片。 通过扩展这些图像来修改它们。 创造伟大的图像是很多工作。

你做错了事情 要构build自己的图像,您需要使用Dockerfile 。 然后你可以用一个Dockerfile来构build你的图像,看起来像这样:

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

要理解ENTRYPOINTCMD指令之间的ENTRYPOINT ,请点击这里

build议每个容器只运行一个进程。 如果您需要运行多个进程,您应该看看Docker组合 ,然后使不同的容器一起工作。