我第一次尝试Docker,还没有建立起"心智模型"。完全是初学者。
我正在查看的所有示例都包含--rm
标志来运行,例如
docker run -it --rm ...
docker container run -it --rm ...
问题:
为什么这些命令包括--rm
标志?我认为如果我费力地设置或下载一个包含好东西的容器,为什么要删除它?我想保留它以便再次使用。
所以,我知道我对Docker的理解是错误的。
我第一次尝试Docker,还没有建立起"心智模型"。完全是初学者。
我正在查看的所有示例都包含--rm
标志来运行,例如
docker run -it --rm ...
docker container run -it --rm ...
问题:
为什么这些命令包括--rm
标志?我认为如果我费力地设置或下载一个包含好东西的容器,为什么要删除它?我想保留它以便再次使用。
所以,我知道我对Docker的理解是错误的。
容器仅是您用来运行它们的镜像的实例。 创建容器应该不只是使用一个干净的Ubuntu容器,然后下载您想要的应用程序和配置,让它运行。
您应该将容器视为应用程序的实例,但是您的应用程序嵌入到镜像中。正确的做法是创建自定义镜像,在其中嵌入所有文件、配置、环境变量等。有关Dockerfile以及如何完成此操作的更多信息,请单击此处。
一旦完成了上述步骤,您就会拥有一个包含所有内容的镜像。要使用您的应用程序,只需使用适当的端口设置或其他动态变量运行镜像,使用docker run <your-image>
。
对于那些您只是短时间内使用的容器(例如在容器中编译应用程序或测试某些功能),使用--rm
标志非常合适。这时您可以告诉Docker守护程序,在容器完成任务并且不再需要时删除所有相关内容,从而节省磁盘空间。
--rm
启动的容器,而不是在容器 shell 中故意运行 exit
,我注意到在这种情况下容器不会被删除。 - venkrao当您需要容器在完成任务后被删除时,可以使用标记--rm
。
这适用于小型测试或POC目的,并为维护带来方便。
来自https://docs.docker.com/engine/reference/run/#clean-up---rm
默认情况下,容器的文件系统会在容器退出后保留。这使得调试变得更加容易(因为您可以检查最终状态),并且默认情况下保留所有数据。但是,如果您正在运行短期前台进程,则这些容器文件系统可能会真正堆积。如果您希望Docker在容器退出时自动清理容器并删除文件系统,则可以添加
--rm
标志。
简而言之,保持主机不受停止和未使用的容器的影响很有用。
当你使用简单的命令(docker run -it ubuntu
)从镜像中运行容器时,它会创建一个容器。你可以使用 docker attach container-name
(或者使用 exec
命令打开不同的会话)来连接到容器。
所以,当你在容器内部工作并且输入 exit
或 ctrl+z
或任何其他方式退出容器时,容器将停止。这意味着你的容器已经停止了,但是它仍然保存在你的磁盘上,并且你可以使用 docker start container-name/ID
命令重新启动它。
但是,如果你使用了 --rm
标签运行容器,在退出容器后,容器将被永久删除。
当我需要连接到正在运行的容器执行某些操作(如数据库备份或文件复制)时,我会使用--rm
。以下是一个例子:
docker run -v $(pwd):/mnt --link app_postgres_1:pg --rm postgres:9.5 pg_dump -U postgres -h pg -f /mnt/docker_pg.dump1 app_db
以上命令将连接到名为'app_postgres_1'的运行中的容器并创建一个备份。备份完成后,容器将被完全删除。
“docker run rm”命令使我们运行一个新容器,当工作完成后,通过删除它来节省磁盘空间。
需要注意的重要事项是,容器就像类实例一样,并不适用于数据存储。我们最好在工作完成后将它们删除。当我们重新启动时,它会重新开始。
那么问题就来了,如果容器被删除,容器中的数据怎么办?数据实际上保存在本地系统中,并在启动容器时链接到本地系统。这个概念被称为“卷或共享卷”。
--rm
选项会删除已停止的容器(由docker run
命令创建的容器),而不是其所基于的镜像(你下载的那个镜像)。 - Ry-docker run --help
应该很有用。如果您不想删除容器,可以传递它。 - indapublic