[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