docker中的host
hosts文件其实并不是存储在Docker镜像中的,/etc/hosts, /etc/resolv.conf和/etc/hostname,是存在主机上的/var/lib/docker/containers/(docker_id)目录下,容器启动时是通过mount将这些文件挂载到容器内部的。因此如果在容器中修改这些文件,修改部分不会存在于容器的top layer,而是直接写入这3个文件中。容器重启后修改内容不存在的原因是Docker每次创建新容器时,会根据当前docker0下的所有节点的IP信息重新建立hosts文件。也就是说,你的修改会被Docker给自动覆盖掉。
修改host的方式
-
RUN命令直接修改host文件 ---------- 不行
在dockerfile中使用run命令直接修改host文件无任何效果,k8s中地址解析会将修改的hosts进行覆盖 -
docker启动时加–add-host参数 ---------- 可行
docker启动时修改多个hosts指向
docker run --add-host='www.baidu.com:127.0.0.1' --add-host='server2:127.0.0.2' 容器id -it /bin/bash
- dockerfile中修改hosts文件 ---------- 可行
在dockerfile中执行以下命令
#路径长度最好保持一致
RUN cp /etc/hosts /tmp/hosts
RUN mkdir -p -- /lib-override && cp /usr/lib64/libnss_files.so.2 /lib-override
RUN sed -i 's:/etc/hosts:/tmp/hosts:g' /lib-override/libnss_files.so.2
ENV LD_LIBRARY_PATH /lib-override
#可以随意修改/tmp/hosts了
RUN echo "127.0.0.1 www.baidu.com" >> /tmp/hosts
注意:
libnss_files.so.2文件可能不在上图路径下,需要使用find / -name ‘libnss_files.so.2’命令进行搜索,上图红框根据实际位置进行填写
- 通过 docker-compose.yaml 文件启动
这种方式未进行过实践,有需要可参考以下文章 docker容器如何配置hosts文件