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

时间:2018-06-05 10:43:28

标签: docker

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

是否有适当的内置解决方案?正确的我指的是一种解决方案,它不需要我备份数据库,将它们移出容器卷并再次恢复它们。可以允许我更改转发端口的命令之类的逻辑,例如-p 1433:1234 to 27017:1234

3 个答案:

答案 0 :(得分:3)

BLUF:使用映射的卷启动MongoDB容器,以使用以下格式保持数据持久性:docker run --name some-mongo -v /my/own/datadir:/data/db -d mongo

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

如果已正确设置卷,则无需导入数据。我一直在为MySQL数据库执行此操作。如果正确映射卷,则MyQSL映像只是与数据库分离的数据库引擎。这就是Docker的设计方式。

在查看“数据存储位置”部分时,给出了将卷安装到主机上的文件夹以保留数据的示例。这应该允许您使用相同的数据启动新容器,而不必重新导入。但是我对NoSQL的MongoDB不太熟悉。

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

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

docker exec some-mongo sh -c 'exec mongodump -d <database_name> --archive' > /some/path/on/your/host/all-collections.archive

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

docker run --name some-mongo -v /my/own/datadir:/data/db -v /some/path/on/your/host/all-collections.archive:/data/db/collections.archive -d mongo

您需要还原该备份。

docker exec some-mongo sh -c 'exec mongorestore --db <database_name> --archive=/data/db/collections.archive

从那时起,您应该能够简单地停止并启动一个新容器,并在其中映射卷。您的数据应保持持久性。您无需再转储和还原(显然,出于正常备份目的)。

答案 1 :(得分:2)

Container是图像的实例化。

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

答案 2 :(得分:-2)

您可以通过直接编辑/ var / lib / docker / containers / [hash_of_the_container] /hostconfig.json

中的hostconfig.json文件来更改端口映射

您可以通过docker inspect命令以及&#34; Id&#34;的值来确定[hash_of_the_container]。字段是哈希。

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

参考:How do I assign a port mapping to an existing Docker container?