英文版本:/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功能,最终找到了可行的解决方案。
我将我了解到的大致总结如下:
- 目前Podman的DNS功能只能在
bridge
类型网络上开启,而不能在macvlan
类型网络上开启。 - 如果你的Podman没有自动为你新创建的
bridge
类型网络开启DNS功能,你需要安装podman-plugins
软件包。dnf install podman-plugins -y
- 1
- 在另一台服务器(对比环境)上,并没有安装
podman-plugins
软件包,但它依然自动开启了DNS功能。
参考文献
- Configuring Podman for Inter-container Communication