假设我有一个带有lotta数据的MongoDb
或Sql Server
容器,并且突然(非常可能)我需要更改端口!可能是由于突然的安全问题!我需要停止容器并在另一个端口上再次启动它。为什么docker不允许我这样做,如果我再次运行图像,将创建一个没有数据的新容器,这会导致很多混乱。
是否有适当的内置解决方案?正确的我指的是一种解决方案,它不需要我备份数据库,将它们移出容器卷并再次恢复它们。可以允许我更改转发端口的命令之类的逻辑,例如-p 1433:1234 to 27017:1234
。
答案 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?