解决Podman网络DNS不可用问题

时间:2024-10-25 10:15:19

英文版本:/2023/02/28/solve-podman-network-dns-unavailable-issue/

前言

这篇文章是我的问题笔记,主要记录了我遇到的问题、调试的过程、解决方案以及结论,这将有助于为研究类似问题提供思路。如果你只关心这个问题如何得到解决,请参考“解决方案”部分。

环境介绍

调试环境:

  • OCI .
  • Oracle Linux Server 8.6
  • 5.4.17-2136.314.6.2.el8uek.aarch64
  • podman-4.2.0-6.0.+el8.7.0+20907+ea30c68a.aarch64
  • podman-compose==1.0.3

对比环境:

  • OCI .E2.
  • Oracle Linux Server 9.0
  • 5.15.0-5.76.5.1.el9uek.x86_64
  • podman-4.2.0-9.0.1.el9_1.x86_64
  • podman-compose==1.0.3

Compose文件:

# 

services:
  db:
    image: mariadb:10.6.4-focal
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - ./db_data:/var/lib/mysql:Z
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060
  wordpress:
    image: wordpress:latest
    volumes:
      - ./wp_data:/var/www/html:Z
    ports:
      - 0.0.0.0:8080:80
      - 0.0.0.0:8443:443
    restart: unless-stopped
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
  • 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

问题描述

Wordpress启动后页面显示Error Establishing a Database Connection错误。

调试过程

因为这个文件在我另一台服务器(对比环境)上是没有遇到这个问题的。所以我对比了两台机器上的podman-compose logs,然而并没有什么发现。后来我从问题本身入手,打算手动连接数据库。于是我在pod中加入了新的container用于调试目的。

  centos:
    image: centos:8
    volumes:
      - ./centos_data:/mnt:Z
    restart: unless-stopped
    command: sleep infinity
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

容器启动后,我通过下面的命令进入了调试用的容器,并尝试连接数据库所在的容器,就发现了问题。

$ podman exec -it wordpresstry_centos_1 /bin/bash
[root@d58215e3442c /]# ping db
ping: db: Name or service not known
  • 1
  • 2
  • 3

备注: 这里使用db作为主机名是因为podman-compose将service name用作了主机别名,这点在启动日志中可以看到,它向podman run命令传递了--net wordpress_default --network-alias db参数。

既然是Name Service有问题,这就属于podman本身的范畴了,于是我通过podman network inspect wordpress_default命令检查了容器网络,输出如下:

[
     {
          "name": "wordpress_default",
          "id": "b089aa3ab1f227a5a0126f4b6ab9b192e29c5def5c77046b8cd765678a9d904b",
          "driver": "bridge",
          "network_interface": "cni-podman2",
          "created": "2023-02-27T21:16:32.002843796Z",
          "subnets": [
               {
                    "subnet": "10.89.1.0/24",
                    "gateway": "10.89.1.1"
               }
          ],
          "ipv6_enabled": false,
          "internal": false,
          "dns_enabled": false,
          "labels": {
               "": "wordpress",
               "": "wordpress"
          },
          "ipam_options": {
               "driver": "host-local"
          }
     }
]
  • 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

我看到dns_enabled值为false,这说明DNS由于某种原因没有开启。我在另一台主机(对比环境)上查看了wordpress_default的情况,它的DNS是正常开启的。这让我有些疑惑,不知道是不是podman近期做了修改,抑或是系统架构不同导致的?

为了最终确定我找到了问题的根源,我写了下面的脚本,在两台服务器上的运行结果印证了我的推测。

podman network create mynetwork_default
podman run -d --rm --name centos_server --net mynetwork_default --network-alias centos_s centos:8 sleep infinity
podman run -d --rm --name centos_client --net mynetwork_default --network-alias centos_c centos:8 sleep infinity
podman exec centos_client ping -c 2 centos_server
podman exec centos_client ping -c 2 centos_s
podman inspect mynetwork_default
podman rm -f -t 1 centos_client centos_server
podman network rm mynetwork_default
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

解决方案

找到原因后,我就上网搜索如何开启Podman容器网络上的DNS功能,最终找到了可行的解决方案。

我将我了解到的大致总结如下:

  1. 目前Podman的DNS功能只能在bridge类型网络上开启,而不能在macvlan类型网络上开启。
  2. 如果你的Podman没有自动为你新创建的bridge类型网络开启DNS功能,你需要安装podman-plugins软件包。
    dnf install podman-plugins -y
    
    • 1
  3. 在另一台服务器(对比环境)上,并没有安装podman-plugins软件包,但它依然自动开启了DNS功能。

参考文献

  1. Configuring Podman for Inter-container Communication