AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 889589
Accepted
Tom Klino
Tom Klino
Asked: 2017-12-26 12:10:37 +0800 CST2017-12-26 12:10:37 +0800 CST 2017-12-26 12:10:37 +0800 CST

来自主机的 Docker 服务发现(或 dns 解析)

  • 772

我有一个配方,它使用我为我的应用程序制作的特定 mysql 图像设置一个 docker 实例。作为该配方的一部分,我希望它在容器运行 mysql 后,从备份中恢复数据的过程将自动开始。

为此,我需要拥有容器的 IP(或从 DNS 获取它的方法)。但是,由于我从配方中自动启动容器,因此我无法知道该 IP 将是什么,因此我试图让 docker 为其设置一个稍后可以解析的主机名。

奇怪的是,如果我将一个容器链接到另一个容器,我将能够从链接到它的容器中解析另一个容器的主机。但是,我发现无法从主机解析该主机名。

这是我用来调出容器的食谱(厨师)的一部分:

docker_container 'imhere-mysql' do
  hostname mysqlHost
  repo 'lutraman/imhere'
  tag 'mysql'
  env ["MYSQL_ROOT_PASSWORD=#{mysql_password}"]
  volumes [ '/var/imhere/mysql:/var/lib/mysql' ]
  action :run
end

我想用来恢复数据的命令是这样的(根据配方构建):

"gunzip -c #{parent_data_dir}/#{db_restore_filename} | mysql -h #{mysqlHost} -u root -p'#{mysql_password}'"

仅从主机运行,mysqlHost(在手头的情况下 - imhere-mysql)中的名称不会从主机解析。

本文底部有一条说明,说应该有一个 docker dns 服务器在 127.0.0.11 上运行 - 但我担心这是容器内部的。

我希望我能够做的是查询 docker(在理想情况下,作为 DNS,但任何方式都可以)以获取名为“imhere-mysql”的容器的 ip。无论主机操作系统如何,最好的方法是什么?

docker
  • 2 2 个回答
  • 358 Views

2 个回答

  • Voted
  1. Best Answer
    Gnat
    2017-12-26T12:58:24+08:002017-12-26T12:58:24+08:00

    您可以使用带有过滤器的 docker inspect 命令获取容器的 IP 地址:

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container name>
    

    您的命令将是:

    "gunzip -c #{parent_data_dir}/#{db_restore_filename} | mysql -h $(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' #{mysqlHost}) -u root -p'#{mysql_password}'"
    

    您还可以为容器使用静态 IP 地址,声明自己的网络。

    • 3
  2. Andy Shinn
    2017-12-26T18:51:27+08:002017-12-26T18:51:27+08:00

    我对此的解决方案是在同一网络(或使用链接)上的容器中运行恢复命令。听起来您已经有了可用的文件夹信息,因此可以将这些信息作为卷传递给临时容器。

    使用遗留的 Docker 链接,它看起来像:

    docker run --link #{mysqlHost} --rm -v #{parent_data_dir}/#{db_restore_filename}:/tmp/dbrestore.sql lutraman/imhere bash -c "gunzip -c /tmp/dbrestore.sql | mysql -h #{mysqlHost} -u root -p'#{mysql_password}'"
    

    这将使用相同的图像(假设mysql和gunzip二进制文件可用,但没有ENTRYPOINT)将主机卷安装到容器中的临时位置,然后从该临时位置解压缩到mysql连接到链接的二进制文件。

    您可以通过创建自定义 Docker 网桥来避免遗留链接。在这种情况下,该自定义网络中的容器名称应该可以通过 DNS 获得,而无需链接。但这会给你的食谱增加额外的部分,这些部分可能比价值更多。

    • 0

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve