Dockerfile修改hosts

Dockerfile修改hosts

[toc]

[toc]

在很多场景中,比如我们需要搭建一个集群,这时候容器要识别集群内的节点,就需要添加相应的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给自动覆盖掉。

解决办法

OPT 1 开启时加参数

开启容器时候添加参数 --add-host machine:ip 可以实现hosts修改,在容器中可以识别machine主机。

docker run --name nginx nginx:latest --add-host='server:127.0.0.1' --add-host='server2:127.0.0.2'

OPT 2 修改容器hosts查找目录

让容器开启时候,不去找/etc/hosts文件,而是去找自定义的hosts文件,下面是一个Dockerfile实例

FROM ubuntu:14.04
RUN cp /etc/hosts /tmp/hosts #路径长度最好保持一致
RUN mkdir -p -- /lib-override && cp /lib/x86_64-linux-gnu/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
RUN echo "192.168.0.1 node1" >> /tmp/hosts

OPT 3 在 一个 RUN 中 设置 /etc/hosts 的同时,运行需要dns服务的安装

由于在不同的 RUN 层中,/etc/hosts 会被docker重写覆盖掉,所以必须在同一个 RUN 层中同时设置并使用对应的域名映射

RUN echo "111.8.8.111 mirror.npm.com" >> /etc/hosts && npm install 
Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计