Docker刚刚启动后退出
所以在开始这个问题之前,我是对docker的理解。
- Docker有3个组件
- 图片
- 集装箱
- Dockerfile
现在图像是容器被创build的,Dockerfile就像是一个stream动的东西。 简单地说, 图像是类 , 容器是图像的对象。
现在我不想采用Dockerfile
的方法,在那里指定在创build容器时要执行的步骤。
我想在Linux上安装一些基本实体,比如MongoDb,Redis等,并通过它们运行我的服务器。
所以我开始像这样:
-
我从Docker Hub通过
18261df960118..7a16(big hex key)
docker pull ubuntu
下载了Ubuntu映像,它返回了我的18261df960118..7a16(big hex key)
-
现在我必须为这个图像创build一个容器,以实现我所做的:
docker create -h abc.com --name abc.com 18261df960118..7a16
它返回了我的容器的id。
- 为了进入容器,我必须首先启动它,然后连接到它,所以这里是命令
docker start containerId
后面的docker attach containerId
。
但每一次它都在说:
您不能附加到停止的容器,首先启动它。
请帮助我在哪里做错了,这可能是许多新手的问题,但我在这里卡住,请不要downvote相同。
提前致谢。
编辑:在我原来的职位,我提到: “尝试像虚拟机一样思考” 。 我最近陷入了这个 ,说不这样做:
不要 把容器当成一个小型的虚拟机,而应该把它看成是一个过程 。
值得一读的文章: 容器不是虚拟机
原文:
Docker容器的逻辑是它们应该有一个服务启动和运行。 如果该服务停止,则退出并进入“停止”状态。 (当您了解更多关于Docker的信息时,您将会明白这是如何工作的,您将能够使用ENTRYPOINT
和CMD
)。 但是让我们暂时跳过这一步,尝试像使用虚拟机一样思考,运行一个新的容器并进入一些命令。
这成功了:
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>
要理解ENTRYPOINT
和CMD
指令之间的ENTRYPOINT
,请点击这里
build议每个容器只运行一个进程。 如果您需要运行多个进程,您应该看看Docker组合 ,然后使不同的容器一起工作。