所以在开始提问之前,这是我对码头工作者的理解。
现在,图像是创建容器的图像,而Dockerfile就像流程一样。简单来说,图像是类,容器是图像的对象。
现在我不想采用Dockerfile
的方法来指定创建容器时要执行的步骤。
我想在Linux上安装一些基本实体,比如MongoDb,Redis等,并运行我的服务器。
所以我开始这样:
我通过docker pull ubuntu
从Docker Hub下载了Ubuntu映像
它返回了我18261df960118..7a16(big hex key)
现在我必须为这个图像创建一个容器,以实现我的目的:
docker create -h abc.com --name abc.com 18261df960118..7a16
它返回了我的容器ID。
docker start containerId
后跟docker attach containerId
。 但每次都说:
您无法附加到已停止的容器,请先启动它。
请帮助我做错的地方,对于很多人来说这可能是一个新手的问题,但是我被困在这里,请不要为此事做好投票。
提前致谢。
答案 0 :(得分:5)
修改强> 在我的原始帖子中,我提到:“尝试与VM一样思考”。我最近陷入了this,它说没有这样做:
停止 将容器视为迷你虚拟机,而是开始将其视为一个流程。
还值得一读文章:Containers are not VMs
原帖:
Docker容器的逻辑是他们应该启动并运行服务。如果此服务停止,它们将退出并进入“已停止”状态。 (当您了解有关Docker的更多信息时,您将了解其工作原理,并且您将能够使用ENTRYPOINT
和CMD
)。但是让我们暂时忽略这一点并试着像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 attached
集CMD
,然后立即退出。
您可以使用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
将其保存在本地或推送到远程
答案 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>
要了解ENTRYPOINT
和CMD
指令之间的区别,请here
建议每个容器只运行一个进程。如果您需要运行多个流程,您应该查看Docker compose,然后让不同的容器一起工作。