美文网首页
【docker】容器/etc/hosts文件中添加域名解析条目

【docker】容器/etc/hosts文件中添加域名解析条目

作者: Bogon | 来源:发表于2024-09-02 10:41 被阅读0次

如何在容器hosts文件中添加解析条目,用于临时测试?

docker ps -q > crt

docker ps --format '{{.ID}}' > crt

while read ctr;do  ResolvConfPath=`docker inspect $ctr --format "{{ .HostsPath }}" `; echo '172.16.111.92  www.example.com' >> $ResolvConfPath; done < <(docker ps --format '{{.ID}}' )

docker exec -it 033bf5013226   cat /etc/hosts

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      033bf5013226
172.16.111.92  www.example.com

这几条命令涉及到 Docker 容器的操作和文件系统的修改。我们逐条解析它们:

  1. docker ps -q > crt

    这个命令的作用是列出所有正在运行的 Docker 容器的 ID,并将这些 ID 存储到一个名为 crt 的文件中。

    • docker ps -q: docker ps 命令列出正在运行的容器。-q 选项表示只输出容器 ID。
    • > crt: 将 docker ps -q 的输出重定向到名为 crt 的文件中。这样,所有容器 ID 都会被保存到 crt 文件中,每个 ID 一行。
  2. while read ctr; do ResolvConfPath=$(docker inspect $ctr --format "{{ .HostsPath }}"); echo '172.16.111.92 www.example.com' >> $ResolvConfPath; done < <(docker ps --format '{{.ID}}')

    这条命令是一个循环,读取每一个容器的 ID,然后对每个容器执行一些操作。具体步骤如下:

    • while read ctr; do ... done < <(docker ps --format '{{.ID}}'):

      • docker ps --format '{{.ID}}': 列出所有正在运行的容器的 ID,并以每个 ID 一行的格式输出。这些 ID 被传递给 while read ctr 循环。
      • while read ctr; do ... done: 读取每个容器 ID,并将其赋值给变量 ctr,然后执行循环体内的命令。
    • ResolvConfPath=$(docker inspect $ctr --format "{{ .HostsPath }}"):

      • docker inspect $ctr --format "{{ .HostsPath }}": 通过 docker inspect 命令获取指定容器 ctr 的配置。--format "{{ .HostsPath }}" 选项用来提取容器的 HostsPath。这个路径是容器内的 /etc/hosts 文件的路径,通常是 /var/lib/docker/containers/<container-id>/hosts
      • ResolvConfPath=$(...): 将提取到的路径存储在变量 ResolvConfPath 中。
    • echo '172.16.111.92 www.example.com' >> $ResolvConfPath:

      • 172.16.111.92 www.example.com 这行文本追加到 ResolvConfPath 指定的文件中,即容器的 /etc/hosts 文件中。

总结

这些命令的总体功能是:

  1. 列出所有正在运行的 Docker 容器的 ID 并保存到 crt 文件中。
  2. 对每个正在运行的容器,获取其 /etc/hosts 文件的路径。
  3. 向每个容器的 /etc/hosts 文件中追加一行 172.16.111.92 www.example.com

这种操作通常用于在容器内动态添加 DNS 记录。需要注意的是,这种直接操作容器文件系统的做法可能会有一定的风险,可能会导致容器的不稳定或数据损坏,尤其是在容器重启后更改可能会丢失。

# docker ps --format '{{.ID}}'
033bf5013226
7a28788b0947
1a26fb4e808d
81baca76c094
4b7ccbf15559


# docker ps -q
033bf5013226
7a28788b0947
1a26fb4e808d
81baca76c094
4b7ccbf15559


# docker inspect 033bf5013226  --format "{{ .HostsPath }}"
/var/lib/docker/containers/033bf5013226aca0f75115fc702053109f872293cd5d18facded74b026907bb0/hosts

# cat /var/lib/docker/containers/033bf5013226aca0f75115fc702053109f872293cd5d18facded74b026907bb0/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3      033bf5013226

这些输出展示了如何通过 Docker 命令获取容器的 /etc/hosts 文件路径,并查看其内容。具体解读如下:

  1. docker ps -q

    输出了正在运行的 Docker 容器的 ID 列表:

    033bf5013226
    7a28788b0947
    

    这些 ID 表示两个正在运行的容器。

  2. docker inspect 033bf5013226 --format "{{ .HostsPath }}"

    通过 docker inspect 命令获取容器 ID 为 033bf5013226 的容器的 HostsPath,即容器内部 /etc/hosts 文件的路径:

    /var/lib/docker/containers/033bf5013226aca0f75115fc702053109f872293cd5d18facded74b026907bb0/hosts
    

    这个路径指向 Docker 主机上存储该容器 /etc/hosts 文件的实际位置。

  3. cat /var/lib/docker/containers/033bf5013226aca0f75115fc702053109f872293cd5d18facded74b026907bb0/hosts

    显示了容器 033bf5013226/etc/hosts 文件内容:

    127.0.0.1       localhost
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.3      033bf5013226
    

    这个文件包括:

    • 127.0.0.1 localhost: 将 127.0.0.1 映射到 localhost,表示本地回环地址。
    • ::1 localhost ip6-localhost ip6-loopback: IPv6 的回环地址和 localhost 的映射。
    • fe00::0 ip6-localnet, ff00::0 ip6-mcastprefix, ff02::1 ip6-allnodes, ff02::2 ip6-allrouters: IPv6 地址的特殊目的地。
    • 172.17.0.3 033bf5013226: 容器的内部 IP 地址 172.17.0.3 与容器 ID 033bf5013226 的映射。

这些信息显示了容器内部的 DNS 和主机名映射。

容器中的 /etc/hosts 不是一个只读文件吗?

你实际上是向容器的/etc/hosts文件中添加条目,因为/etc/hosts是一个容器内部的文件,容器运行时会用它来解析主机名。Docker容器的/etc/hosts文件位于主机系统中,与容器文件系统相隔离,但Docker允许在运行时直接操作这些文件。通过这种方式,容器可以即时更新DNS解析记录,适用于临时修改网络配置。

在运行的容器中,/etc/hosts文件是可读写的,不是只读的。虽然Docker容器的/etc/hosts文件是由Docker管理和自动生成的,但在运行时可以对其进行写操作。

你的脚本通过主机的文件路径将内容追加到该文件中,这种方法可以实现动态修改容器内部的/etc/hosts文件。

相关文章

网友评论

      本文标题:【docker】容器/etc/hosts文件中添加域名解析条目

      本文链接:https://www.haomeiwen.com/subject/urshljtx.html