首页 > 解决方案 > 我可以在启动 docker 会话后增加共享内存吗

问题描述

如果我已经运行了一个 docker 会话,有没有办法增加共享内存?

  1. 我知道我们可以docker run -it --shm-size=13g dockertag /bin/bash 按照https://stackoverflow.com/a/35884597/3776827

或更改 docker-compose.yml 文件。

但是,如果我已经运行了一个 docker 会话,是否仍然可以这样做?(我有一个进程正在运行,不想停止它)

  1. 我把这个运行命令放在哪里?
docker build -f ./Dockerfile -t <tag> .
docker tag <tag> <repo>
docker push <repo>

如果我这样做docker run -it --shm-size=13g <tag> /bin/bash ,我会进入码头。在(退出泊坞窗)之后执行docker push此操作不会产生任何效果。

我正在尝试解决 pytorch 上的这些错误:

请原谅我对 docker 的理解。我是它的新手。

标签: docker

解决方案


  1. 但是,如果我已经运行了一个 docker 会话,是否仍然可以这样做

答案是否定的 的。

答案是肯定的,因为如果您在创建容器时创建了卷,这是可能的。然后您可以增加挂载的大小,/dev/shm这些更改将反映在容器中而无需重新启动

为了演示,在下面的示例中/dev/shm,我的机器安装/dev/shm在容器中。

首先,让我们检查一下/dev/shm我机器上的大小

anon@anon-VirtualBox:~$ df -h /dev/shm

Filesystem      Size  Used Avail Use% Mounted on
tmpfs           2.9G   48M  2.9G   2% /dev/shm

现在让我们创建一个 docker 容器/dev/shm作为卷安装在容器中并检查容器的大小/dev/shm

创建容器

anon@anon-VirtualBox: docker run -d -v /dev/shm:/dev/shm bash sleep 100000
bdc043c79cf8b1ba64ee8cfc026f8d62f0b609f63cbca3cae9f5d321fe47b0e0

检查容器中 /dev/shm 的大小

anon@anon-VirtualBox: docker exec -it bdc043c df -h /dev/shm

Filesystem                Size      Used Available Use% Mounted on
tmpfs                     2.9G     47.9M      2.8G   2% /dev/shm

您可以看到容器的大小与我的机器上的大小相匹配,从而验证我们已正确安装/dev/shm到容器中。

现在我将增加/dev/shm我机器上的大小

anon@anon-VirtualBox:~$ sudo mount -o remount,size=4G /dev/shm
anon@anon-VirtualBox:~$ df -h /dev/shm

Filesystem      Size  Used Avail Use% Mounted on
tmpfs           4.0G   56M  4.0G   2% /dev/shm

现在我们可以验证容器是否已调整(无需重新启动)

anon@anon-VirtualBox:~$ sudo docker exec -it bdc043c79cf8 df -h /dev/shm
Filesystem                Size      Used Available Use% Mounted on
tmpfs                     4.0G     55.9M      3.9G   1% /dev/shm

答案是否定的,因为您已经创建了一个容器。/var/lib/docker/containers/<container_id>/hostconfig.json可以通过调整来修改容器的配置ShmSize,但这需要重新启动容器才能生效。那时,创建新容器和使用指定新大小没有区别docker run..


  1. 我把这个运行命令放在哪里?

docker build -f ./Dockerfile -t <tag> .
docker tag <tag> <repo>
docker push <repo>

docker build:这将构建 docker 映像

docker tag:给图像一个可选的标签(注意——这是多余的,因为你在前面的命令中指定了一个标签)

docker push:这会将图像推送到远程注册表(图像存储库,即https://hub.docker.com/

这些步骤都是相互独立的,并在需要用于其目的时使用。标记图像是可选的,就像将图像推送到注册表是可选的一样。运行 docker 容器的唯一要求是存在运行容器的镜像,因此您在docker run命令中指定镜像名称。因此,为了满足您的回答, docker run 命令将在您构建映像之后执行。值得注意的是,默认情况下,例如,当您运行时,docker run bash它会在本地查找该图像,如果它不存在(默认情况下),它将尝试从 docker hub 中提取该图像,即https://hub.docker.com /_/bash . 这就是为什么您可以从全新安装的 docker 运行docker run bash它无需先构建 bash 映像即可工作。您的输出看起来类似于

docker run bash

Unable to find image 'bash:latest' locally
latest: Pulling from library/bash
050382585609: Pull complete 
7bf5420b55e6: Pull complete 
1beb2aaf8cf9: Pull complete 
Digest: sha256:845d500de4879819b189934ec07de15e8ff8de94b3fd16d2744cbe7eb5ca3323
Status: Downloaded newer image for bash:latest
e4c594907b986af923afe089bdbbac057712b3e27589d12618b3d568df21d533

推荐阅读