对就是系统配置,你干ETC干HOST里里面好像就没了,加的那个域名解析没了
1. 只是“重启”容器(docker restart)
如果你只是对正在运行的容器执行 docker restart 命令(或者在管理平台点击重启),容器并没有被真正删除。
● 结果: 你在容器内部修改的大部分配置文件(例如 Nginx 的 .conf 、应用的 .properties 等)通常会保留下来,不会丢失。
● 原因: 这种重启只是停止了进程再重新启动,容器底层的可写层文件系统依然存在。
2. “停止并删除”后再新建容器(最常见的情况)
如果你在部署平台(如K8s、云厂商控制台)上操作,或者执行了 docker stop 后 docker rm ,然后再拉取镜像重新运行一个新容器。
● 结果: 你在旧容器里修改的所有配置和数据都会全部丢失。
● 原因: Docker 容器的设计理念是“临时且可丢弃的”。容器在基础镜像之上有一个临时的可写层,当你把容器删掉时,这个可写层也会被彻底销毁。下次启动的是一个全新的、和原始镜像一模一样的干净容器。
3. 特殊的系统级配置(即使在容器内修改也会失效)
有些特殊的配置文件或参数,即使你只是 docker restart ,修改也会失效:
● 网络与主机配置: 比如容器内的 /etc/hosts 文件,它是 Docker 在每次启动时动态生成的临时文件,重启后会被重置。
● 内核参数: 比如通过 sysctl 修改的 /proc/sys/ 下的网络参数,重启后也会恢复默认值。
● 部分环境变量: 如果只在 /etc/profile 中配置而没有写入 shell 的启动脚本(如 .bashrc ),重启进入交互式终端时可能会失效。
/etc/hosts 里的域名解析记录确实是最典型的“一重启就消失”的配置。
这背后的原理其实很简单:
Docker 为了保证容器能正常联网和通信,每次启动容器时,都会自动重新生成一份全新的 /etc/hosts 文件。所以,无论你之前在容器里手动加了什么域名映射,只要容器一重启,这个文件就会被 Docker 的默认模板无情覆盖掉。
🛠️ 方案一:使用 Docker 原生的 --add-host 参数(最推荐)
这是 Docker 官方专门为了应对这种需求设计的参数。它会在容器启动时,自动帮你把指定的域名和 IP 写入到容器的 /etc/hosts 文件中。无论容器怎么重启、重建,这条记录永远都在。
● 命令示例:(多个域名可以写多个 --add-host )
docker run -d --name my-app \
--add-host "api.test.com:192.168.1.50" \
--add-host "db.local:10.0.0.8" \
nginx
● 如果你用的是 Docker Compose:
直接在 yaml 文件里加上 extra_hosts 字段即可:
🔧 方案二:挂载自定义的 hosts 文件
如果你在宿主机上已经维护了一份非常复杂的 hosts 列表,也可以直接把宿主机的 hosts 文件映射覆盖到容器里。
● 命令示例:注意:加上 :ro (只读)可以防止容器内意外修改宿主机文件,更安全。