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

如何在容器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文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容