基于docker的设计原则,容器内部默认的/etc/hosts文件在容器重启后会重置, 即用户对该文件的修改并不能持久化。但可以持久化保存的/etc/hosts在一些场景下是必须得,尤其是dind(docker in docker). 本文探讨基于该背景的一些解决方案尝试。
所谓'静态应用场景'就是指的在容器启动后不会再有hosts文件更新需求。所以就可以在创建容器的时候,将所有需要额外添加的hosts通过 --add-host的方式添加进去, 这也是官方给的解决方案和大多数的搜索引擎会给你返回的方案. 例如下面这个例子:
shelldocker run -itd --name mymongog2 --add-host=my-hostname:8.8.8.8 mongo
shellroot@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
shellroot@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
shellextra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
所谓'动态用用场景'指的是容器启动后,仍然需要更新/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文件中对于相同的域名映射,取第一个,所以需要逆序把我们的域名加入。
本文作者:王海生
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!