Fedora 33上docker-compose搭配Podman部署Mastodon出现主机名解析失败
Podman环境下部署Mastodon的容器网络解析故障
基础运行环境
- 部署目标:官方Mastodon开源社交平台
- 服务器系统:Fedora 33 Server
- 容器栈版本验证输出:
$ docker-compose --version docker-compose version 1.27.4, build unknown $ docker --version podman version 3.0.1 $ cat /etc/fedora-release Fedora release 33 (Thirty Three)
适配Podman环境的配置修改
针对官方docker-compose.yml的调整项:
- 为所有服务的健康检查补充
timeout、interval、retries参数,避免Podman环境下健康检查判定异常 - 为PostgreSQL服务新增
POSTGRES_HOST_AUTH_METHOD=trust环境变量,配置数据库免密本地访问 - 注释所有服务的本地镜像构建逻辑,直接使用官方发布的预构建镜像(原本地构建流程在当前环境下持续失败)
完整调整后的docker-compose.yml配置:
version: '3' services: db: restart: always image: postgres:9.6-alpine shm_size: 256mb networks: - internal_network healthcheck: test: ["CMD", "pg_isready", "-U", "postgres"] timeout: 45s interval: 10s retries: 10 volumes: - ./postgres:/var/lib/postgresql/data environment: - POSTGRES_HOST_AUTH_METHOD=trust redis: restart: always image: redis:6.0-alpine networks: - internal_network healthcheck: test: ["CMD", "redis-cli", "ping"] timeout: 45s interval: 10s retries: 10 volumes: - ./redis:/data # es: # restart: always # image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10 # environment: # - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # - "cluster.name=es-mastodon" # - "discovery.type=single-node" # - "bootstrap.memory_lock=true" # networks: # - internal_network # healthcheck: # test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"] # volumes: # - ./elasticsearch:/usr/share/elasticsearch/data # ulimits: # memlock: # soft: -1 # hard: -1 web: # build: . image: tootsuite/mastodon restart: always env_file: .env.production command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000" networks: - external_network - internal_network healthcheck: test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:3000/health || exit 1"] timeout: 45s interval: 10s retries: 10 ports: - "127.0.0.1:3000:3000" depends_on: - db - redis # - es volumes: - ./public/system:/mastodon/public/system streaming: build: . image: tootsuite/mastodon restart: always env_file: .env.production command: node ./streaming networks: - external_network - internal_network healthcheck: test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1"] timeout: 45s interval: 10s retries: 10 ports: - "127.0.0.1:4000:4000" depends_on: - db - redis sidekiq: build: . image: tootsuite/mastodon restart: always env_file: .env.production command: bundle exec sidekiq depends_on: - db - redis networks: - external_network - internal_network volumes: - ./public/system:/mastodon/public/system ## 取消注释即可启用与Tor实例的联邦访问,同时需添加以下环境变量 ## http_proxy=http://privoxy:8118 ## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true # tor: # image: sirboops/tor # networks: # - external_network # - internal_network # # privoxy: # image: sirboops/privoxy # volumes: # - ./priv-config:/opt/config # networks: # - external_network # - internal_network networks: external_network: internal_network: internal: true
与官方默认配置的diff对比结果:
$ git diff docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml index 52eea7a74..a8e047ec7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,8 +9,13 @@ services: - internal_network healthcheck: test: ["CMD", "pg_isready", "-U", "postgres"] + timeout: 45s + interval: 10s + retries: 10 volumes: - ./postgres:/var/lib/postgresql/data + environment: + - POSTGRES_HOST_AUTH_METHOD=trust redis: restart: always @@ -19,6 +24,9 @@ services: - internal_network healthcheck: test: ["CMD", "redis-cli", "ping"] + timeout: 45s + interval: 10s + retries: 10 volumes: - ./redis:/data @@ -42,7 +50,7 @@ services: # hard: -1 web: - build: . + # build: . image: tootsuite/mastodon restart: always env_file: .env.production @@ -52,6 +60,9 @@ services: - internal_network healthcheck: test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:3000/health || exit 1"] + timeout: 45s + interval: 10s + retries: 10 ports: - "127.0.0.1:3000:3000" depends_on: @@ -72,6 +83,9 @@ services: - internal_network healthcheck: test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1"] + timeout: 45s + interval: 10s + retries: 10 ports: - "127.0.0.1:4000:4000" depends_on:
故障详情
密钥生成流程可正常完成,执行数据库迁移命令时流程中断:
$ sudo docker-compose run --rm web bundle exec rails db:migrate Creating network "mastodon_internal_network" with the default driver Creating network "mastodon_external_network" with the default driver Creating mastodon_db_1 ... done Creating mastodon_redis_1 ... done Creating mastodon_web_run ... done rails aborted! PG::ConnectionBad: could not translate host name "db" to address: Name or service not known
补充排查结果:PostgreSQL容器运行状态正常,日志确认服务已进入可接受连接状态:
$ sudo docker logs -f mastodon_db_1 PostgreSQL Database directory appears to contain a database; Skipping initialization LOG: database system was shut down at 2021-04-01 07:02:04 UTC LOG: MultiXact member wraparound protections are now enabled LOG: database system is ready to accept connections LOG: autovacuum launcher started
待验证的排查方向
- 此前在其他项目中使用相同的Docker-Compose+Podman 3.0组合,未遇到过容器内部主机名解析异常问题,当前场景不确定是否需要为自定义网络手动指定网络驱动
- 需要可落地的验证方法,确认web类容器内部能否通过
db主机名正常访问数据库服务,排除应用代码逻辑层面的故障可能
内容的提问来源于stack exchange,提问作者Coukaratcha
相关产品推荐
相关产品推荐

