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】:我找到了答案。哦,顺便说一句,我不知道为什么这个问题被否决了,这是一个完全合法的问题(该死......)
-
找到容器的ID
docker 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 和 postgres 服务器之间连接 [重复]