当前位置: 首页 > 知识库问答 >
问题:

如何从外部/应用程序访问容器化postgresql数据库

霍锦
2023-03-14

我一直在努力从本地主机和外部连接到postgresql容器。

这是一个非常好的演示,它在https://linuxhint.com/postgresql_docker/.下面是docker compose。yml,postgres:12.2和pgadmin通过它进行集装箱化和运行。事实上,在运行docker compose之后。yml文件(由docker compose up-d编写)它们可以工作。

然后,您可以在浏览器中访问http://localhost:8080/并具有直接访问权限(使用给定的凭据,即。,admin@linuxhint.com,secret),然后开始在docker上安装postgres:12.2。

然而,我的困难开始时,我试图找到连接到这个postgres: 12.2数据库直接从localhost或外部/一些应用程序/ip(如JavaSpring Boot)。

诚然,我不是docker的专家,只是个学生——所以,我请求帮助。希望有人能告诉我应该怎么做,才能从外部/app连接到(这个)容器化的postgres数据库。我用的是Win 10。

更新:

>

  • 有人能说出为什么一个web应用程序(下面添加到docker.compose.yml,见下文)在启动后会持续关闭吗?

    docker logs提供以下错误:

    原因:org。springframework。豆。工厂BeanCreationException:创建名为“dataSource”的bean时出错,该bean在类路径资源[org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]中定义:初始化bean失败;嵌套的异常是org。springframework。豆。工厂BeanCreationException:创建名为“org”的bean时出错。springframework。靴子自动配置。jdbc。DataSourceInitializeInvoker':调用init方法失败;嵌套的异常是org。springframework。jdbc。数据源。初始化。UncategorizedScriptException:无法执行数据库脚本;嵌套的异常是org。springframework。jdbc。CannotGetJdbcConnectionException:获取JDBC连接失败;嵌套的异常是org。postgresql。util。PSQLException:与本地主机的连接:5433被拒绝。检查主机名和端口是否正确,邮政局长是否接受TCP/IP连接。

    这里是Dockerfile的应用程序:

    来自Maven: 3-JDK-11

    音量/tmp

    曝光8095

    添加/target/spring-boot-demo-0.0.1-SNAPSHOT。jar应用程序。罐子

    运行ls-ls

    入口点["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

    下面是应用程序中的连接详细信息。属性文件:

    Spring数据源。url=jdbc:postgresql://db:5432/postgres

    Spring数据源。用户名=管理员

    spring.datasource.password=秘密

    另外两项服务(db和pgadmin正常启动)

    docker撰写。yml

    version: "3.7"
    
    services:
    
    # ========== ADDED APP ===============
     web:
       #restart: on-failure
       image: app-springboot-postgresql
       build: ./
       ports:
         - "8095:8095"
       environment:
         WAIT_HOSTS: postgres:5432
       depends_on:
        - db  
    # ========== ADDED APP ===============
    
      db:
        image: postgres:12.2
        restart: always
        environment:
          POSTGRES_DB: postgres
          POSTGRES_USER: admin
          POSTGRES_PASSWORD: secret
          PGDATA: /var/lib/postgresql/data
        volumes:
          - db-data:/var/lib/postgresql/data
        ports:
          - "5432:5432"
     
      pgadmin:
        image: dpage/pgadmin4:4.18
        restart: always
        environment:
          PGADMIN_DEFAULT_EMAIL: admin@linuxhint.com
          PGADMIN_DEFAULT_PASSWORD: secret
          PGADMIN_LISTEN_PORT: 80
        ports:
          - "8080:80"
        volumes:
          - pgadmin-data:/var/lib/pgadmin
        links:
          - "db:pgsql-server"
    
    volumes:
      db-data:
      pgadmin-data:
    
  • 共有2个答案

    蒋华美
    2023-03-14

    检查它们是否在同一网络中:

    docker network ls
    
    # Output
    
    NETWORK ID          NAME                DRIVER              SCOPE
    e094bb99be32        bridge              bridge              local
    cde9fb0d3fef        django              bridge              local
    1aeb83753889        host                host                local
    f152a346ca96        none                null                local
    348c59c37462        web                 bridge              local
    

    然后检查网络:

    docker network inspect django
    
    # Output
    
    [
        {
            "Name": "django",
            "Id": "6f5fd395946d1bff8583a4ddbe4fb8ea1204875124679f878d24a57f3601b0e6",
            "Created": "2020-10-11T13:16:42.750571609+02:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": null,
                "Config": [
                    {
                        "Subnet": "172.20.0.0/16",
                        "Gateway": "172.20.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": true,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {
                "079d303b3c2d17196e7cb49056ec7cfc7385c480c3cbf225dc51e53ebeb43f10": {
                    "Name": "pgadmin",
                    "EndpointID": "10e1f181f18e751ce0b3521f537e30948433e62b454fb9707b96333395f5ba36",
                    "MacAddress": "02:42:ac:14:00:04",
                    "IPv4Address": "172.20.0.4/16",
                    "IPv6Address": ""
                },
                "bff75ff8e23ab998cfc99bc87bec05ea9fb55adbcae1993da1cbc719eea90fd3": {
                    "Name": "postgres",
                    "EndpointID": "edd547148b50c6c3319f2b65ec151816e14f9ea9e7dd9acb9b5895d44fcd6cda",
                    "MacAddress": "02:42:ac:14:00:02",
                    "IPv4Address": "172.20.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    

    在上面的例子中,postgres和pgadmin在同一个网络中,所以他们可以看到对方。

    如果它们不在同一个网络中,请明确定义。

    # docker-compose.yml
    
    services:
      django:
        container_name: dj
        build:
          context: ./server
        restart: unless-stopped
        volumes:
          - staticfiles:/app/staticfiles
          - mediafiles:/app/media
        command: gunicorn nohchi_mott.wsgi:application --bind 0.0.0.0:8000
        env_file: ./server/.env
        expose:
          - 8000
        networks:
          - web
          - django
        depends_on:
          - db
      db:
        container_name: postgres
        image: postgres:12.0-alpine
        restart: unless-stopped
        labels:
          - "traefik.enable=false"
        volumes:
          - postgres_data:/var/lib/postgresql/data/
        expose:
          - 5432
        networks:
          - django
        env_file: ./db/.env
      pgadmin:
        container_name: pgadmin
        image: dpage/pgadmin4:latest
        restart: unless-stopped
        volumes:
          - pgadmin_data:/var/lib/pgadmin
        env_file: ./db/pgadmin/.env
        links:
          - db:pgsql-server
        networks:
          - web
          - django
        depends_on:
          - db
    
    volumes:
      staticfiles:
      mediafiles:
      postgres_data:
      pgadmin_data:
    
    networks:
      web:
        external: true
      django:
        external: false
    
    蒯胜泫
    2023-03-14

    docker compose。yml将Postgres的5432端口发布到docker守护进程运行的机器。

    因此,应用程序应该连接到作为Postgres主机的127.0.0.1,以及作为Postgres端口的5432,假设它们在机器上运行。

     类似资料:
    • 我有一个视频流android应用程序。Firebase项目包含视频链接和元数据。我已经实现了身份验证和firebase数据库规则,这样只有经过身份验证的用户才能访问这些视频。 仍然有人能够访问链接并下载视频上传到youtube上。 所以我的问题是如何完全阻止用户在应用程序之外访问我的json。我已将读取操作仅限于经过身份验证的用户。 任何人都可以使用命令行注册我的项目,然后访问数据吗?

    • 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。 当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。 使用 docker container ls 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应

    • 问题内容: 在此URL中,我有一些Json数据。如何 使用该URL将数据获取到我的andorid应用程序。 我在Google中看到过引用。但是没有解决办法。 我是Andorid的新手。 请帮我。 问题答案: 做这个 : 步骤-1在您的gradle中导入排球库: 实现’com.android.volley:volley:1.1.0’ 然后在Java中编写以下代码:

    • 问题内容: 我正在编写一个使用JPA进行持久化的J2SE应用程序(无企业容器)。这是我的: 这是一个静态文件,“编译”到应用程序中。但是,我需要提取凭据,以便可以在运行时从配置参数中加载它们,因为它们在应用程序的开发和实时版本方面是不同的。 我以默认方式加载持久性设置: 如何在此设置中外部化凭据?我可以在运行时生成persistence.xml文件,但这有点hacky。 问题答案: 您可以在创建时

    • 从我的控制器中,我使用 但是我不知道如何从服务中访问它(我想我的服务类不应该扩展)。 我是否应该像这样将所需的参数映射到我的服务注册中: 或者类似的东西?如何从服务访问应用程序参数? 这个问题看起来是一样的,但我实际上回答了它(控制器的参数),我说的是从服务访问。

    • 我正在迭代JSON数据,获取数据并将其赋值给一个全局变量,当我在循环内打印变量时,我得到了所有数据,然而,当我在循环外打印变量时,我只得到了JSON对象的最后一些数据。我的目标是获取数据并将其作为函数的参数传递。我如何获取循环之外的所有数据?