通过容器端Node.js Web应用程序访问容器端Postgres数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过容器端Node.js Web应用程序访问容器端Postgres数据库相关的知识,希望对你有一定的参考价值。

我有一个Node.js应用程序的Dockerfile,整体看起来像这样:

FROM ubuntu
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

WORKDIR /app
COPY . /app

ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get install -y -q --no-install-recommends 
        apt-transport-https 
        build-essential 
        ca-certificates 
        curl 
        git 
        libssl-dev 
        wget 
        postgresql-10 postgresql-client-10 postgresql-contrib-10

USER postgres
RUN    /etc/init.d/postgresql start &&
    psql --command "CREATE USER warbler WITH SUPERUSER;" &&
    createdb -O warbler warbler_store

# ... node setup stuff ...
# ...
# ...

RUN psql -U warbler -d warbler_store -f db_v1.sql

CMD ["node", "index.js"]

有了这个虽然我收到以下错误信息:

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

我在网上看了一下,我发现的大多数解决方案似乎都说Docker正在尝试连接到主机postgres实例,以及与主要目的是运行PostgreSQL的docker容器有关的其他问题。这是否准确,如果是这样,仍然可以运行主应用程序可访问的容器端PostgreSQL实例?

答案

显然,将您的数据库与Web应用程序放在同一个Docker容器中并不是一个好习惯。我通过在另一个容器中使用postgresql:10图像并让web应用程序通过docker-compose与之通信来改变我的容器结构。 docker-compose允许定义服务,Docker的内部DNS允许它们相互通信

这就是docker-compose.yaml的样子:

version: '3'
services:
    web:
        build: .
        ports:
        - "3000:3000"
        volumes:
        - .:/app
        links:
        - db

    db:
        image: postgres:10
        environment:
        - POSTGRES_USER=warbler
        - POSTGRES_DB=warbler_store
        volumes:
        - ./db_v1.sql:/docker-entrypoint-initdb.d/db_v1.sql
        - dbdata:/var/lib/postgresql/data

volumes:
    dbdata:

在这种情况下,在web的Dockerfile中,我设置了必要的环境变量,因此Node连接到在postgresql://db:5432/warbler_store上运行的数据库。 db通过DNS解析运行db服务的容器的IP地址,这是postgres映像容器。

以上是关于通过容器端Node.js Web应用程序访问容器端Postgres数据库的主要内容,如果未能解决你的问题,请参考以下文章

阿里云服务器-docker部署 web 应用(端口号)

黑客可以访问/复制/下载部署在Node Js上的JS服务器端代码吗?

不同用户访问web项目,这些不同的请求,叫多进程,还是叫啥?

Docker容器:将带UI的程序直接转为Web应用,so easy

跨桌面端Web容器演进

使用Vert.x构建Web服务器和消息系统