美文网首页
【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