当前位置: 首页 > 知识库问答 >
问题:

Docker:在已创建的容器上更改端口绑定而不丢失数据

孔华池
2023-03-14

假设我有一个带有大量数据的MongoDbSql Server容器,突然(这是非常有可能的)我需要更改端口!也许是因为突然的安全问题!我需要停止容器,并在不同的端口上再次启动它。为什么docker不允许我这样做,如果我再次运行映像,一个新的容器将被创建,里面没有数据,这会导致很多混乱。

是否有合适的内置解决方案?我所说的“适当”是指一种解决方案,它不需要我备份数据库,将它们移出容器卷并再次恢复它们。一些逻辑性的东西,例如允许我更改转发端口的命令,例如-p 1433:1234到27017:1234

共有3个答案

纪畅
2023-03-14

您可以通过直接在 /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json编辑hostconfig.json文件来更改端口映射

您可以通过docker检查命令确定[hash_of_the_container],并且“id”字段的值是散列。

1) stop the container 
2) change the file
3) restart your docker engine (to flush/clear config caches)
4) start the container

参考:如何将端口映射分配到现有的Docker容器?

慕容成文
2023-03-14

容器是图像的实例化。

端口号是容器的实例化状态,因此只能在创建容器时更改。

白云
2023-03-14

BLUF:启动您的MongoDB容器与一个卷映射,以保持数据持久使用这种格式:docker run--name thum-mongo-v /my/own/datadir:/data/db-d mongo

虽然我同意,但如果Docker能够在运行的容器中切换端口号,那就太好了。正如其他人所说,每个容器都是一个进程,我不知道如何在正在运行的进程上更改端口。

如果已正确设置卷,则无需导入数据。我这样做所有的时间MySQL数据库。如果正确映射卷,MyQSL映像只是独立于数据库的数据库引擎。码头工人就是这样设计的。

在“存储数据的位置”一节中,它给出了将卷装入主机上的文件夹以保存数据的示例。这应该允许您使用相同的数据启动新容器,而无需重新导入。但我对NoSQL中的MongoDB不太熟悉。

https://hub.docker.com/_/mongo/#!

您可能需要使用以下转储命令备份数据库:

docker exec some mongo sh-c'exec mongodump-d

使用映射的卷启动新容器并还原数据。

docker run——命名一些mongo-v/my/own/datadir:/data/db-v/some/path/on/your/host/all集合。存档:/data/db/collections。存档-d mongo

你需要恢复备份。

######################################################################################################

从那时起,您应该能够简单地停止并启动一个具有映射的卷的新容器。您的数据应该保持持久性。您应该不再需要转储和还原(显然是为了正常的备份目的)。

 类似资料:
  • 问题内容: 我正在使用SQL数据库,我有一列名为“价格”。创建数据库后,将“价格”列设置为“我”,需要将其类型更改为不丢失数据库中的数据。这应该通过SQL脚本来完成 我想到了创建一个新列,将数据移到其中,删除旧列,然后重命名新创建的列。 有人可以帮我举个例子吗?在SQL中也有一个函数可以将字符串解析为十进制? 谢谢 问题答案: 您无需添加新列两次,只需在更新新列后删除旧列即可: 请注意,如果不是数

  • 我正在使用Docker容器执行自动化测试。我必须在同一台服务器上为多个应用程序运行测试套件。但是,如果每个selenium hub docker容器具有相同的端口,则无法同时运行所有这些套件。因此,我想为每个selenium/hub docker容器分配不同的端口。有什么办法可以改变集线器集装箱的港口吗?或者我需要编写自己的dockerfile而不使用selenium/hub docker图像吗?

  • 问题内容: 我正在尝试使用Docker compose在远程服务器上部署第二个数据库容器。该postgresql服务器在端口5433上运行,而不是第一个postgresql容器使用的5432。 设置应用程序时,出现以下错误输出: 我的泊坞窗撰写文件是: 我觉得问题一定是服务器实例上的postgresql.conf文件将端口设置为5432导致我的应用尝试与其连接时导致错误。有没有一种简单的方法可以使

  • 问题内容: 我在Windows Home上使用docker-toolbox。我能够运行jekyll-serv Web服务器图像来查看浏览器上的默认页面,但是当我尝试在VS Code上编辑文件时,刷新浏览器后看不到更改。 知道为什么刷新后看不到更改吗? 复制步骤: 首先,我将git将此存储库克隆到了我的库中(可以在“ cmder”控制台上查看文件)。 然后,我可以使用以下命令运行该图像: 而且我可以

  • 为主机绑定容器端口 默认情况下,Docker容器可以连接到外部区域,但外部区域不能连接到容器。在Docker启动时,由于它在主机上创建了一个iptables伪装规则,使得每一个输出连接看起来都是由主机IP地址建立起来的。 # You can see that the Docker server creates a # masquerade rule that let containers conn

  • 我已经设置了一个在Docker中运行的基本MariaDB实例——基本上是从使用Kitematic UI启动容器开始,更改设置,然后让它运行。 今天,我想做一个备份,所以我用Kitematic更改了端口,这样我就可以从机器上访问它来进行自动备份。在Kitematic中更改端口后,它似乎启动了一个新的MariaDB容器(即,我的所有数据似乎都被删除)。 这是预期的行为吗?而且,更重要的是,是否有任何方