01-Docker 修改 host、resolv、hostname 文件

Docker 中的 host 等文件

/etc/hosts, /etc/resolv.conf, /etc/hostname 等文件其实并不是存储在 Docker 镜像,而是存在主机上的 /var/lib/docker/containers/(docker_id) 目录下,容器启动时是通过 mount 将这些文件挂载到容器内部的。

因此如果在容器中修改这些文件,修改部分不会存在于容器的 top layer,而是直接写入这 3个文件中。

容器重启后修改内容不存在的原因是 Docker 每次创建新容器时,会根据当前 docker0 下的所有节点的 IP 信息重新建立 hosts 文件。也就是说,你的修改会被 Docker 给自动覆盖掉。

简而言之:就是 openshift 的模式,/etc/resolv.conf 等文件是在 pod 生成的时候插入的,写入的是宿主机的 ip 作为 dns 的寻址,如果需要修改的化,需要在容器生成以后脚本启动以前进行修改。

修改 host 的方式

  • RUN 命令直接修改 host 文件(不行)
    在 dockerfile 中使用 run 命令直接修改 host 文件无任何效果,k8s 中地址解析会将修改的 hosts 进行覆盖

  • docker 启动时加 -add-host 参数(可行)

    1
    2
    # 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 中使用 sh 脚本修改。

    1
    2
    FROM docker-registry.default.svc:5000/myproject/tomcat:8-slim
    CMD ["/usr/local/tomcat/bin/startapp.sh"]

    其中 startapp.sh 为

    1
    2
    3
    4
    5
    6
    [root@master tomcat]# cat startapp.sh 
    #!/bin/bash
    echo "startup ...."

    sed -i "s/:5/:5 single-request/" /etc/resolv.conf
    echo "114.114.114.114" >> /etc/resolv.conf

01-Docker 修改 host、resolv、hostname 文件
https://flepeng.github.io/042-云原生-01-Docker-01-Docker-修改-host、resolv、hostname-文件/
作者
Lepeng
发布于
2023年3月9日
许可协议