Docker:将正在运行的容器公开给主机[重复]

Posted

技术标签:

【中文标题】Docker:将正在运行的容器公开给主机[重复]【英文标题】:Docker: Expose running container to host [duplicate] 【发布时间】:2021-02-03 01:20:21 【问题描述】:

我有一个正在运行的 mysql 容器,我在其中导入了大量数据(花了我几个小时)。

现在我想在我的主机上使用一个 GUI 应用程序 (DBeaver) 从这个容器中查询数据。有没有办法可以将正在运行的容器的网络公开给主机,以便我可以连接到它?

我一直在环顾四周,到目前为止,最有希望的选择是运行 docker run 一个带有 -p 标签 3306:3306 的新容器,但是当我这样做时,所有导入的数据都消失了。

谢谢!

【问题讨论】:

【参考方案1】:

我找到了答案。哦,顺便说一句,我不知道为什么这个问题被否决了,这是一个完全合法的问题(该死......)

    找到容器的IDdocker ps 获取该 ID,运行 docker inspect -f ' .Mounts ' <container-id> 从结果中,我知道那个容器的体积位于这里:/var/lib/docker/volumes/simple_wiki_container_devcontainer_my-datavolume/_data docker run -p 3306:3306 --name new_mysql_with_data -e MYSQL_ROOT_PASSWORD=a_strong_password -v /var/lib/docker/volumes/simple_wiki_container_devcontainer_my-datavolume/_data:/var/lib/mysql -d mysql:lateset

现在我可以在端口3306 上连接主机0.0.0.0 上的mysql-client

【讨论】:

【参考方案2】:

从正在运行的容器创建一个新的 mysql 镜像并使用暴露的端口运行新镜像。您可以使用docker commit 来做到这一点。使用暴露的端口运行新图像,您的数据将被保存。使用

 docker commit <CONTAINER_ID> mysql-with-data:latest

在提交完成之前不要停止运行容器——

【讨论】:

谢谢!上面命令中暴露端口3306 的部分在哪里? 我试过这个。但是数据不存在... docker commit 几乎从来都不是最佳实践,我不会在这里推荐它。值得注意的是,标准 Docker Hub 数据库映像的构建方式是提交映像永远不会保留其数据(即使您没有包含 docker run -v 选项,它也始终在卷中,并且卷永远不会提交)。

以上是关于Docker:将正在运行的容器公开给主机[重复]的主要内容,如果未能解决你的问题,请参考以下文章

似乎无法将 docker 容器端口暴露给主机

如何自动缩放 Docker 容器主机?

在主机上的客户端 docker 和 postgres 服务器之间连接 [重复]

Postgres 9.1 的 Docker 容器未将端口 5432 暴露给主机

Docker 容器使用

将文件从本地文件系统添加到正在运行的 Docker 容器 [重复]