Featured image of post docker容器内部dns无法解析

docker容器内部dns无法解析

docker

基础环境

宿主机操作系统发行版本号如下:

1
2
$ cat /etc/openEuler-release
openEuler release 22.03 (LTS-SP1)

宿主机操作系统内核版本如下:

1
2
$ uname -r
5.10.0-136.17.0.93.oe2203sp1.x86_64

docker 版本如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$ docker info

Client:
 Context:    default
 Debug Mode: false

Server:
 Containers: 2
  Running: 2
  Paused: 0
  Stopped: 0
 Images: 2
 Server Version: 20.10.6
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.10.0-136.17.0.93.oe2203sp1.x86_64
 Operating System: openEuler 22.03 (LTS-SP1)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 3.331GiB
 Name: proxy-server
 ID: YH2T:BTWY:VXVM:CJB7:HYQC:CWJS:6JRT:ESMU:XTPW:N2GC:VDVE:T24C
 Docker Root Dir: /data/docker_dir/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  registry.gfstack.geo:5555
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine

问题

我发现当我使用kernel在5.10以上的容器基础镜像时,容器内dns解析会存在问题,具体的表现为:

  • docker daemon指定dns不生效

  • 启动容器时指定–dns也不生效

  • 在容器内修改域名解析服务不生效

  • 直接修改容器的/etc/hosts,解析还是不生效

但是当我使用centos8的镜像时这个问题会消失

排查过程

我最先想到的是升级runc,发现不奏效。然后索性把dockerd 升级到目前最新的24.0.2,重启以后问题消失了。当然问题到这肯定没完,我开始用二分法去卡,看看docker具体在哪个版本修复了这个问题,然后通过更新日志去反推可能是什么导致的。

经过漫长的反复尝试,我发现20.10.9 -> 20.10.10 这个过程就消失了,然后我去github查了一下那个版本的更新日志:

Runtime

  • Add support for clone3 syscall in the default seccomp policy to support running containers based on recent versions of Fedora and Ubuntu. moby/moby/#42836.

然后当然就是反复的求证,我发现了这个Red Hat Bugzilla – Bug 2034209 和这个 Privileges not correctly set for buildah · Issue #2168 · containers/buildah · GitHub

简而言之就是高版本seccomp使用clone3的方式进行系统调用,但是docker不支持(容器内调了这种方法就会报错,所有高版本发行版会报错,centos8版本低反而正常),在20.10.10版本docker官方解决了这个问题。