Docker 中 Bitmagnet 连接宿主机 PostgreSQL 的配置方法
摘要:本文介绍了如何在 Docker 容器中使用 Bitmagnet 连接宿主机上的 PostgreSQL 数据库,重点讲解了如何正确设置 host 地址,并解决常见的连接问题。
1. 问题背景
你正在使用 Docker 部署 Bitmagnet,并希望它连接宿主机上的 PostgreSQL 数据库。默认情况下,在 Docker Compose 中通过 depends_on
和服务名(如 postgres
)可以访问其他容器内的数据库服务。但如果你想让 Bitmagnet 连接宿主机的 PostgreSQL,则需要进行一些配置调整。
2. 解决方案一:使用 host.docker.internal
在 Linux 上的 Docker 环境中,Docker 提供了一个特殊的 DNS 名称 host.docker.internal
,它指向宿主机本身。因此,你可以将环境变量中的 POSTGRES_HOST
改为:
environment:
- POSTGRES_HOST=host.docker.internal
如果你的 PostgreSQL 用户是 postgres
,并且允许从外部连接,这样就可以成功连接宿主机的数据库了。
3. 解决方案二:使用宿主机 IP 地址
如果你不想依赖 host.docker.internal
,也可以手动指定宿主机的 IP 地址。
步骤如下:
- 获取宿主机在 Docker 网络中的 IP:
- 输出示例:
- 修改环境变量:
ip route | grep default
default via 172.17.0.1 dev eth0
environment:
- POSTGRES_HOST=172.17.0.1
- POSTGRES_PASSWORD=你的密码
4. PostgreSQL 配置要求
要确保宿主机上的 PostgreSQL 允许外部连接:
1. 修改 pg_hba.conf
文件:
host all all 0.0.0.0/0 md5
2. 修改 postgresql.conf
:
listen_addresses = '*'
3. 重启 PostgreSQL:
sudo systemctl restart postgresql
5. 最终建议的 docker-compose.yml 片段
services:
bitmagnet:
image: ghcr.io/bitmagnet-io/bitmagnet:latest
container_name: bitmagnet
ports:
- "3333:3333"
- "3334:3334/tcp"
- "3334:3334/udp"
restart: unless-stopped
environment:
- POSTGRES_HOST=host.docker.internal
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=你的密码
- TMDB_API_KEY=398f82347b713c19d21d43a913bb4fbd
volumes:
- /root/dockerdata/bitmagnet:/root/.config/bitmagnet
command:
- worker
- run
- --keys=http_server
- --keys=queue_server
- --keys=dht_crawler
6. 补充说明
- 如果使用的是 Docker Compose 的
network_mode: host
模式,可以直接用localhost
; - 否则,推荐使用
host.docker.internal
; - 如果连接失败,请检查防火墙设置(比如
ufw
、iptables
)是否阻止了 PostgreSQL 端口(通常是5432
)。
7. 无法连接到服务器的问题排查
遇到错误:
[Errno -2] Name does not resolve
说明容器无法解析你配置的 PostgreSQL 主机名(例如 host.docker.internal
或其他自定义 host 名),这通常是因为 DNS 配置问题、Docker 网络设置不对,或者使用了在当前环境下不可用的主机名。
8. 使用宿主机在 Docker 中的 IP 地址(推荐)
这是最稳定的方法。
步骤如下:
- 获取宿主机在 Docker 容器网络中的 IP:
- 输出类似这样:
- 修改你的环境变量,使用这个 IP 地址:
ip route | grep default
default via 172.17.0.1 dev eth0
environment:
- POSTGRES_HOST=172.17.0.1
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=your_password
9. 检查 PostgreSQL 是否允许远程连接
修改 pg_hba.conf
,添加允许来自 Docker 子网的连接:
host all all 172.17.0.0/16 md5
修改 postgresql.conf
:
listen_addresses = '*'
重启 PostgreSQL:
sudo systemctl restart postgresql
10. 检查防火墙是否放行端口 5432
sudo ufw allow 5432/tcp
11. 测试连接是否成功
进入容器内部测试数据库连接:
docker exec -it bitmagnet sh
安装 psql
工具:
apk add postgresql-client
再尝试连接:
psql -h 172.17.0.1 -U postgres -d your_database_name
如果提示密码错误或连接失败,请继续检查 PostgreSQL 配置和防火墙。
12. 总结
方法 | 是否推荐 | 使用场景 |
---|---|---|
使用 172.17.0.1 |
✅ 推荐 | Linux 宿主机部署 PostgreSQL |
使用 host.docker.internal + extra_hosts |
⚠️ 可选 | Linux,需额外配置 |
使用 host.docker.internal |
✅ macOS / Windows Docker Desktop |