2024-07-30
docker
00
请注意,本文编写于 114 天前,最后修改于 93 天前,其中某些信息可能已经过时。

目录

背景
静态应用场景
动态应用场景

背景

基于docker的设计原则,容器内部默认的/etc/hosts文件在容器重启后会重置, 即用户对该文件的修改并不能持久化。但可以持久化保存的/etc/hosts在一些场景下是必须得,尤其是dind(docker in docker). 本文探讨基于该背景的一些解决方案尝试。

静态应用场景

所谓'静态应用场景'就是指的在容器启动后不会再有hosts文件更新需求。所以就可以在创建容器的时候,将所有需要额外添加的hosts通过 --add-host的方式添加进去, 这也是官方给的解决方案和大多数的搜索引擎会给你返回的方案. 例如下面这个例子:

  1. 在创建一个容器的时候使用 --add-host 添加需要的解析记录
shell
docker run -itd --name mymongog2 --add-host=my-hostname:8.8.8.8 mongo
  1. 进入容器查看 /etc/hosts ,可以看到添加的解析记录
shell
root@docker:~# docker exec -it mymongog2 sh # 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 8.8.8.8 my-hostname 172.17.0.3 28b3d1102194
  1. 重启容器, 再次查看, 发现域名解析依然存在
shell
root@docker:~# docker restart mymongog2 mymongog2 root@docker:~# docker exec -it mymongog2 sh # 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 8.8.8.8 my-hostname 172.17.0.3 28b3d1102194
  1. 该方法在docker-compose 中的实现如下,不多赘述.
shell
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"

动态应用场景

所谓'动态用用场景'指的是容器启动后,仍然需要更新/etc/hosts 内容的场景。而按照背景的描述,即使添加了新的域名解析,重启之后 ,这些解析并不会保留。所以就催生出了以下几种可能得解决方案.

  1. 创建容器的时候挂载外部 /etc/hosts 到容器内部. 这种方案确实可以使得新添加的域名解析得以固化保存并在重启容器的时候得以恢复。但有一个问题,看2中出现的 容器 /etc/hosts 内容,可以看到一条 docker 自动添加的对于当前容器ip和容器id的解析记录,该记录对于docker-compose等应用场景非常重要的。但是外挂的/etc/hosts中并不会自动生成该条记录。所以该方案并不十分可行。

image.png

  1. 我在搜索的时候,看到过一条这样的解决方案实现。将需要动态添加的 域名解析以变量的形式写入 容器内部(或在宿主机上, 然后传入容器内部),然后通过另一个轮训任务将该变量加入/etc/hosts的解析之中.但这种方案仍然无法实现固化存储。容器重启(或宿主机重启),所有域名解析变量都会消失。
  2. 鉴于以上两种方案的优缺点。我们可以设计下面这个解决方案。外挂一个额外的hosts文件, 将所有hosts更新同步应用到外挂的文件中,然后在重新启动的时候将外挂hosts文件内容 append到 /etc/hosts文件。如下:
shell
# 创建容器 docker run -itd --name mymongog -v /root/myhosts:/etc/myhosts mongo # 在容器内部 更新 hosts 信息 echo "1.1.1.1 www.helloc.com" >> /etc/hosts echo "1.1.1.1 www.helloc.com" >> /etc/myhosts # 容器重新启动之后,恢复所有 hosts 信息 docker exec mymongog tac /etc/myhosts >> /etc/hosts

注意,这里是tac而不是cat,因为/etc/hosts文件中对于相同的域名映射,取第一个,所以需要逆序把我们的域名加入。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:王海生

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!