为什么 Podman 无法识别主机名,如何解决?

这是我的podman-compose 配置文件

 php8: 
    hostname: php8
    container_name: php8
    image: php8:latest
    volumes:
      - ./www:/var/www
      - ./config/php8:/usr/local/etc/php/conf.d
    restart: always
  caddy:
    container_name: caddy
    hostname: caddy
    image: caddy:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./config/caddy/Caddyfile:/etc/caddy/Caddyfile
      - ./www:/srv
      - ./config/caddy/data:/data
      - ./config/caddy/config:/config

错误提示:

{"level":"error",
"ts":1737361804.6081245,
"logger":"http.log.error",
"msg":"dialing backend: dial tcp: lookup php8 on 114.114.114.114:53: no such host",
"request":{"remote_ip":"192.168.8.166","remote_port":"55861","client_ip":"192.168.8.166","proto":"HTTP/1.1","method":"GET","host":"www.hszh.com","

这里提示:这个主机名php8 找不到。

我的caddyfile 的配置是

http://www.hszh.com {
……
    php_fastcgi * php8:9000 {
       …………
  }
……
}

这里的php8 是容器名称。

我不知道是怎么会事!我的 debian 就是正常的,但是我现在是用的是openEuler系统,debian同样的配置都是没有问题的,现在就出现了这样的问题。

请问这个情况如何处理 openeuler 需要配置?podman 需要配置?

无效的方法(尝试过添加自定义网络)

  php8: 
    hostname: php8
    container_name: php8
    image: php8:latest
    volumes:
      - ./www:/var/www
      - ./config/php8:/usr/local/etc/php/conf.d
    restart: always
    networks:
      - my_network
  caddy:
    container_name: caddy
    hostname: caddy
    image: caddy:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./config/caddy/Caddyfile:/etc/caddy/Caddyfile
      - ./www:/srv
      - ./config/caddy/data:/data
      - ./config/caddy/config:/config
    networks:
      - my_network
networks:
  my_network:
    name: my_custom_network
    driver: bridge
阅读 1.8k
4 个回答

排查思路:

检查DNS配置

nslookup php8
dig php8

1.安装 dnsmasq

sudo dnf install -y dnsmasq

2.安装 podman-dnsname 插件

sudo dnf install -y podman-dnsname

3.配置 CNI 网络: 创建或修改网络配置文件,例如 /etc/cni/net.d/87-podman-bridge.conflist,添加 dnsname 插件配置:

{
  "cniVersion": "0.4.0",
  "name": "podman",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "cni-podman0",
      "isGateway": true,
      "ipMasq": true,
      "ipam": {
        "type": "host-local",
        "ranges": [
          [{"subnet": "10.88.0.0/16"}]
        ],
        "routes": [{"dst": "0.0.0.0/0"}]
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true}
    },
    {
      "type": "dnsname",
      "domainName": "dns.podman"
    }
  ]
}

4.重启 Podman 服务: 保存配置文件后,重启 Podman 服务:

sudo systemctl restart podman

5.创建网络: 使用 podman network create 命令创建网络:

podman network create my_custom_network

6.更新 podman-compose 文件

php8:
  hostname: php8
  container_name: php8
  image: php8:latest
  volumes:
    - ./www:/var/www
    - ./config/php8:/usr/local/etc/php/conf.d
  restart: always
  networks:
    - my_custom_network
caddy:
  container_name: caddy
  hostname: caddy
  image: caddy:latest
  restart: always
  ports:
    - "80:80"
    - "443:443"
    - "443:443/udp"
  volumes:
    - ./config/caddy/Caddyfile:/etc/caddy/Caddyfile
    - ./www:/srv
    - ./config/caddy/data:/data
    - ./config/caddy/config:/config
  networks:
    - my_custom_network
networks:
  my_custom_network:
    external: true

在 OpenEuler 系统上使用 Podman 时出现无法识别主机名的问题,这可能由多种原因导致,以下是详细的分析和解决办法:

问题分析

从错误提示 dial tcp: lookup php8 on 114.114.114.114:53: no such host 可知,Caddy 容器在尝试通过 DNS 解析 php8 主机名时失败,它向公共 DNS 服务器 114.114.114.114 发起查询,然而该服务器并不知晓 php8 这个主机名,因为 php8 是 Podman 容器内的主机名,并非公共域名。

解决办法

1. 检查 Podman 网络配置

尽管你已经尝试添加自定义网络但未成功,不过仍需确保网络配置正确。首先要保证自定义网络已成功创建,并且容器都正确连接到该网络。

  • 查看网络列表:使用以下命令查看 Podman 中的网络列表:

    podman network ls

    确认 my_custom_network 网络是否存在。

  • 检查容器连接情况:使用以下命令查看容器是否连接到了正确的网络:

    podman inspect -f '{{json .NetworkSettings.Networks}}' <容器名或 ID>

    分别替换 <容器名或 ID>php8caddy,确保它们都连接到了 my_custom_network

2. 配置 Podman 网络插件

OpenEuler 系统上的 Podman 网络插件可能需要额外配置。可以尝试更新网络插件配置文件。

  • 编辑网络配置文件:编辑 /etc/cni/net.d 目录下的网络配置文件,确保其中包含正确的网络信息。例如,对于自定义网络 my_custom_network,可能有类似以下的配置:

    {
      "cniVersion": "0.4.0",
      "name": "my_custom_network",
      "type": "bridge",
      "bridge": "cni0",
      "isGateway": true,
      "ipMasq": true,
      "ipam": {
          "type": "host-local",
          "subnet": "10.88.0.0/16",
          "routes": [
              { "dst": "0.0.0.0/0" }
          ]
      }
    }
  • 重启 Podman 服务:更新配置后,重启 Podman 服务:

    sudo systemctl restart podman

3. 检查 DNS 配置

Podman 容器默认使用宿主机的 DNS 配置,但在某些情况下,可能需要为容器指定特定的 DNS 服务器。

  • 为容器指定 DNS 服务器:在 podman-compose.yml 文件中为容器添加 dns 配置:

    php8: 
      hostname: php8
      container_name: php8
      image: php8:latest
      volumes:
        - ./www:/var/www
        - ./config/php8:/usr/local/etc/php/conf.d
      restart: always
      networks:
        - my_network
      dns:
        - 127.0.0.11  # 使用 Podman 内置的 DNS 服务器
    
    caddy:
      container_name: caddy
      hostname: caddy
      image: caddy:latest
      restart: always
      ports:
        - "80:80"
        - "443:443"
        - "443:443/udp"
      volumes:
        - ./config/caddy/Caddyfile:/etc/caddy/Caddyfile
        - ./www:/srv
        - ./config/caddy/data:/data
        - ./config/caddy/config:/config
      networks:
        - my_network
      dns:
        - 127.0.0.11  # 使用 Podman 内置的 DNS 服务器
    
    networks:
    my_network:
      name: my_custom_network
      driver: bridge

    127.0.0.11 是 Podman 内置的 DNS 服务器,它可以解析容器内的主机名。

4. 检查防火墙设置

OpenEuler 系统的防火墙可能会阻止容器之间的网络通信,需要确保防火墙允许容器之间的流量。

  • 查看防火墙状态:使用以下命令查看防火墙状态:

    sudo systemctl status firewalld
  • 开放相应端口:如果防火墙处于开启状态,需要开放容器使用的端口,例如 80、443、9000 等:

    sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
    sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
    sudo firewall-cmd --zone=public --add-port=443/udp --permanent
    sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
    sudo firewall-cmd --reload

5. 检查容器内的 /etc/hosts 文件

在某些情况下,容器内的 /etc/hosts 文件可能没有正确配置主机名解析。可以手动检查并添加相应的主机名解析。

  • 进入容器:使用以下命令进入 caddy 容器:

    podman exec -it caddy bash
  • 查看 /etc/hosts 文件:在容器内使用以下命令查看 /etc/hosts 文件:

    cat /etc/hosts

    确保其中包含 php8 主机名的正确解析信息。如果没有,可以手动添加:

    echo "<php8容器的 IP 地址> php8" >> /etc/hosts

    退出容器,重新启动 caddy 容器:

    podman restart caddy

通过以上步骤,应该可以解决 Podman 无法识别主机名的问题。如果问题仍然存在,建议查看 Podman 和容器的详细日志,以获取更多的调试信息。

version: '3'
services:
  php8: 
    hostname: php8
    container_name: php8
    image: php8:latest
    volumes:
      - ./www:/var/www
      - ./config/php8:/usr/local/etc/php/conf.d
    restart: always
    networks:
      default:
        aliases:
          - php8
  caddy:
    container_name: caddy
    hostname: caddy
    image: caddy:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./config/caddy/Caddyfile:/etc/caddy/Caddyfile
      - ./www:/srv
      - ./config/caddy/data:/data
      - ./config/caddy/config:/config
    networks:
      default:
        aliases:
          - caddy

networks:
  default:
    name: podman_default
    driver: bridge

注:这个是 openEuler

出现主机名无法识别,同网络无法访问就是这个 dnsname 的问题

我的解决办法是:

dnf install podman-plugins -y

然后销毁容器重新运行

podman compose down && podman compose up
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏