添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

2 resolv.conf文件被还原的现象:

容器中的/etc/resolv.conf文件,是由宿主机/var/lib/docker/containers/xxxx/resolv.conf文件挂载。在docker restart容器之前,手动修改了/var/lib/docker/containers/xxxx/resolv.conf文件,却发现变更的内容并没有出现在容器中的/etc/resolv.conf文件中。原因是/var/lib/docker/containers/xxxx/resolv.conf文件的内容会被覆盖,而后挂载进容器中。
在这里插入图片描述

3 源码简析:

3.1 containerStart

initializeNetworking( )是本文章的重点,/var/lib/docker/containers/xxxx/resolv.conf文件的内容就是在此处被覆盖。

func (daemon *Daemon) containerStart(container *container.Container, checkpoint string, checkpointDir string, resetRestartManager bool) (err error) {
	// 初始化网络
	if err := daemon.initializeNetworking(container); err != nil {
		return err
	// 创建容器
	err = daemon.containerd.Create(context.Background(), container.ID, spec, createOptions)
	// 启动容器
	pid, err := daemon.containerd.Start(context.Background(), container.ID, checkpointDir,
		container.StreamConfig.Stdin() != nil || container.Config.Tty,
		container.InitializeStdio)
	return nil

3.2 initializeNetworking

func (daemon *Daemon) initializeNetworking(container *container.Container) error {
	if err := daemon.allocateNetwork(container); err != nil {
		return err
	return container.BuildHostnameFile()

3.3 allocateNetwork

func (daemon *Daemon) allocateNetwork(container *container.Container) error {
	defaultNetName := runconfig.DefaultDaemonNetworkMode().NetworkName()
	if nConf, ok := container.NetworkSettings.Networks[defaultNetName]; ok {
		if err := daemon.connectToNetwork(container, defaultNetName, nConf.EndpointSettings, updateSettings); err != nil {
			return err
	return nil

3.4 connectToNetwork

func (daemon *Daemon) connectToNetwork(container *container.Container, idOrName string, endpointConfig *networktypes.EndpointSettings, updateSettings bool) (err error) {
	if sb == nil {
		// 创建sanbox
		sb, err = controller.NewSandbox(container.ID, options...)
	return nil

3.5 NewSandbox

func (c *controller) NewSandbox(containerID string, options ...SandboxOption) (Sandbox, error) {
	var sb *sandbox
	sb = &sandbox{
			id:                 sandboxID,
			containerID:        containerID,
			endpoints:          []*endpoint{},
			epPriority:         map[string]int{},
			populatedEndpoints: map[string]struct{}{},
			config:             containerConfig{},
			controller:         c,
			extDNS:             []extDNSEntry{},
	// setupResolutionFiles(  )会初始化DNS相关的设置
	if err = sb.setupResolutionFiles(); err != nil {
		return nil, err
	return sb, nil

3.6 setupResolutionFiles

func (sb *sandbox) setupResolutionFiles() error {
	return sb.setupDNS()

3.7 setupDNS

func (sb *sandbox) setupDNS() error {
	// newRC.Content是宿主机/etc/resolv.conf文件的内容(可能过滤部分内容)
	// 将newRC.Content写到/var/lib/docker/containers/xxxx/resolv.conf文件
	if err := ioutil.WriteFile(sb.config.resolvConfPath, newRC.Content, filePerm); err != nil {
	return nil

4 总结:

修改/var/lib/docker/containers/xxxx/resolv.conf文件的内容后重启容器,并不能起到变更容器/etc/resolv.conf文件的目的,因为将其挂载进容器之前,内容会被覆盖。

Docker Engine适用于linux/centos 7 x86_64系统,文件包括内容: docker-ce-20.10.13-3.el7.x86_64.rpm containerd.io-1.5.10-3.1.el7.x86_64.rpm docker-ce-cli-20.10.13-3.el7.x86_64.rpm docker-ce-rootless-extras-20.10.13-3.el7.x86_64.rpm docker-ce-selinux-17.03.3.ce-1.el7.noarch.rpm docker-compose-plugin-2.3.3-3.el7.x86_64.rpm docker-scan-plugin-0.17.0-3.el7.x86_64.rpm
# 常见的坑 docker 容器使用后台运行 就必须要有一个前台进程, docker 发现没有应用了 就会自动停止 # nginx, 容器启动后, 发现自己没有提供服务, 就会立刻停止 ,就是没有程序了 二、 查看日志 docker logs -f -t --tail 容器,没有日志
上一篇文章学习了overlay2的基本知识, 分享时候发现有个问题。就是2cda8c39e97b6157f8599f83c50c4591da423a2c3c0abd20302140c515a876a9-init这种xxx-init文件是干什么用的。 搜了几篇文章都说这个是系统初始化时候,解决host问题的。但是具体过程都没有说明。 为此做了一些尝试。 首先看看host 中的resolve.conf...
# This file is managed by man:systemd-resolved(8). Do not edit. 故修改/etc/systemd/resolved.conf [Resolve] DNS=8.8.8.8 114.114.114.114 当然,错误的时钟也会给网络带来问题: sudo ntpdate edu.ntp.org.cn # ntp同步时钟 方法二、 使用un
这篇的灵感来自于。vsftpd的文章。如果容器的/etc目录无法外部挂载,或者映射的话,我们只能进入到容器内部,手动vi修改配置,然后source 这个文件。容器重启过后,还需要再修改,source一遍,麻烦。 解决方案就是修改容器内/etc/bashrc文件,把要操作的命令写在这个文件的最后,例如: : > /etc/resolv.conf true > /etc/resolv.conf 这是我要删除resolv.conf的内容。具体的要根据你项目的问题,修改参数,做一些其他的配置。(去查询
新装一台机器环境为服务器主板,双网卡,系统为CentOS5.4 ,eth0为内网ip,eth1为公网ip。但是由于在本地测试,设置的内网ip,域名服务器同样使用的是上海本地的域名解析,没有问题,可以上网,可以解析。 放到外地公网上去,ip地址已经设好了。使用setup更改了一下外地公网的dns,保存退出。重启service network restart后发现不能解析了。用ip地址可以连,但
docker-ce-20.10.7.tar.gz是Docker的一个版本文件,这是一个开源的容器开发平台。下载这个文件可以让你配置和使用Docker的最新版本。 Docker是一个非常有用的工具,可以用来开发,测试,部署和管理应用程序。Docker可以让你把应用程序打包成容器,然后在不同的环境中运行,这样可以让你的应用程序更加方便快速地部署和管理。 docker-ce-20.10.7.tar.gz是Docker的一个安装文件,可以让你在不同的操作系统中安装和使用Docker。如果你想在自己的电脑上安装Docker来进行开发或测试应用程序,或者想在服务器上部署和管理应用程序,那么下载这个文件是非常必要的。 如果你已经熟悉了Docker的基本概念和操作,那么下载并安装docker-ce-20.10.7.tar.gz是非常简单的。你只需要下载这个文件,然后按照Docker官方文档的指示安装即可。 总之,docker-ce-20.10.7.tar.gz是一个非常有用的Docker安装文件,可以让你轻松地使用和管理Docker容器开发平台。如果你想学习和使用Docker,那么下载这个文件是一个不错的选择。