linux - 无法从在另一个 docker 容器中运行的服务器连接到在 docker 中运行的 Postgis

标签 linux docker postgis geoserver

我用了kartoza's Geoserver 和 Postgis 的 docker 图像,并使用提供的 docker-compose.yml 在两个 docker 容器中启动它们:

version: '2.1'

volumes:
   geoserver-data:
   geo-db-data:

services:
   db:
      image: kartoza/postgis:12.0
      volumes:
         - geo-db-data:/var/lib/postgresql
      ports:
        - "25434:5432"
      env_file:
      - docker-env/db.env
      restart: on-failure
      healthcheck:
        test: "exit 0"

   geoserver:
      image: kartoza/geoserver:2.17.0
      volumes:
        - geoserver-data:/opt/geoserver/data_dir
      ports:
        - "8600:8080"
      restart: on-failure
      env_file:
        - docker-env/geoserver.env
      depends_on:
        db:
          condition: service_healthy
      healthcheck:
        test: curl --fail -s http://localhost:8080/ || exit 1
        interval: 1m30s
        timeout: 10s
        retries: 3

引用的 .env 文件是:

数据库环境

POSTGRES_DB=gis,gwc
POSTGRES_USER=docker
POSTGRES_PASS=docker
ALLOW_IP_RANGE=0.0.0.0/0

geoserver.env

GEOSERVER_DATA_DIR=/opt/geoserver/data_dir
ENABLE_JSONP=true
MAX_FILTER_RULES=20
OPTIMIZE_LINE_WIDTH=false
FOOTPRINTS_DATA_DIR=/opt/footprints_dir
GEOWEBCACHE_CACHE_DIR=/opt/geoserver/data_dir/gwc
GEOSERVER_ADMIN_PASSWORD=myawesomegeoserver
INITIAL_MEMORY=2G
MAXIMUM_MEMORY=4G
XFRAME_OPTIONS='false'
STABLE_EXTENSIONS=''
SAMPLE_DATA=false
GEOSERVER_CSRF_DISABLED=true

docker-compose up 启动并运行两个容器,没有错误,给它们命名为 backend_db_1 (Postgis) 和 backend_geoserver_1 (Geoserver)。我可以按预期访问在 http://localhost:8600/geoserver/ 下的 backend_geoserver_1 中运行的 Geoserver。我可以将一个外部的、基于 AWS 的 Postgis 作为数据存储连接到我的基于 docker 的 Geoserver 实例,没有任何问题。我还可以从 PgAdmin 访问在 docker 容器 backend_db_1 中运行的 Postgis,从命令行和 Webstorm IDE 使用 psql

但是,如果我尝试使用在 backend_db_1 中运行的 Postgis 作为在 backend_geoserver_1 中运行的 Geoserver 的数据存储,我会收到以下错误:

> Error creating data store, check the parameters. Error message: Unable
> to obtain connection: Cannot create PoolableConnectionFactory
> (Connection to localhost:25434 refused. Check that the hostname and
> port are correct and that the postmaster is accepting TCP/IP
> connections.)

因此,我在 backend_geoserver_1 中的 Geoserver 可以连接到 AWS 上的 Postgis,但不能连接到在同一本地主机上的另一个 docker 容器中运行的 Geoserver。 backend_db_1 中的 Postgis 可以从许多其他本地应用程序和工具访问,但不能从运行在 docker 容器中的 Geoserver 访问。

知道我遗漏了什么吗?谢谢!

最佳答案

只需在 db 和 geoserver 的 YAML 中添加 network_mode 并将其设置为 host

network_mode: host

请注意,这将忽略公开选项并将使用主机网络和容器网络

关于linux - 无法从在另一个 docker 容器中运行的服务器连接到在 docker 中运行的 Postgis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64242453/

相关文章:

docker - 在本地环境中,我应该使用 docker-compose 还是 kubernetes (minikube)?

docker - container_run_and_commit_layer 失败并显示 : docker not found

Docker compose 不会在卷之前添加项目名称

algorithm - 如何智能地降级或平滑 GIS 数据(简化多边形)?

PHP 开发 : Which Operating System do you use?

linux - 在 bash 中比较整数和 float

linux - 我们可以检测 Xen 中 guest 操作系统的内存访问吗?

linux - 数学表达式结果分配给 Bash 变量

sql - 按地理距离过滤的简单 SQL 查询非常慢

database - 使用特殊格式的多段线将数据从 csv 文件复制到 postgres+postgis