【问题标题】:Running a Dockerhub Image in Ubuntu 18.04 with MongoDB image and Nginx使用 MongoDB 映像和 Nginx 在 Ubuntu 18.04 中运行 Dockerhub 映像
【发布时间】:2021-03-23 11:10:13
【问题描述】:

所以我有一个带有 Github 操作管道的 Nodejs 应用程序,它连接到一个私有 Dockerhub 存储库,一旦使用应用程序目录中的Dockerfilemain 分支进行推送,它就会创建一个图像

FROM node:12.21.0-alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 4000

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

我已将映像拉入运行 Nginx 的 Ubuntu 18.04 服务器,并从官方 Dockerhub Mongo 映像中拉出 mongo 映像。

我可以独立运行mongo 映像和我的私有 docker 映像 (docker-username/docker-image) 并添加 --net 标志,我可以从应用容器连接到 mongodb。

我的挑战:

  1. 是否可以创建 Nginx 代理来路由到应用容器端口 4000?
  2. 运行docker-composer.yml 文件以处理这些进程而不是单独运行图像的正确方法是什么?

下面是我在服务器上的docker-compose.yml

version: "3.8"
services:
    nodeserver:
        build:
            context: ./app
        ports:
            - "4000:4000"
    nginx:
        restart: always
        build:
            context: ./nginx
        ports:
            - "80:80"
    mongo:
        image: "mongo:latest"
        container_name: my_mongo
        ports:
            - 27017:27017
        volumes:
            - mongodb:/data/db
            - mongodb_config:/data/configdb

但我不断收到此错误: build path /home/devUser/app either does not exist, is not accessible, or is not a valid URL.

【问题讨论】:

    标签: node.js mongodb docker docker-compose dockerhub


    【解决方案1】:

    构建错误表明您在撰写文件旁边没有app 目录。由于您已经有一个构建图像的 ci 进程,我建议通过将 image: docker-username/docker-image 指定为 compose 文件中的 nodeserver 服务的图像来使用构建的图像。您需要使用可以访问服务器上的私有映像的帐户登录(只需运行 docker login 并输入您的凭据)。

    这是您的撰写文件在指定图像而不是构建图像时的样子:

    version: "3.8"
    services:
        nodeserver:
            image: docker-username/docker-image
            ports:
                - "4000:4000"
        nginx:
            restart: always
            build:
                context: ./nginx
            ports:
                - "80:80"
        mongo:
            image: "mongo:latest"
            container_name: my_mongo
            ports:
                - 27017:27017
            volumes:
                - mongodb:/data/db
                - mongodb_config:/data/configdb
    

    现在,关于您的其他问题:

    您绝对可以使用 nginx 将请求代理到您的应用程序。为此,您需要一个类似于此的 nginx 配置:

    server {
        listen 80;
    
        location / {
            proxy_pass http://nodeserver:4000;
        }
    }
    

    这会将向 nginx 容器发出的所有请求转发到端口 4000 上的 nodeserver 服务。

    然后你需要将配置挂载到你的 nginx 容器中,就像这样而不是构建它:

    version: "3.8"
    services:
        nodeserver:
            image: docker-username/docker-image
            ports:
                - "4000:4000"
        nginx:
            image: nginx
            ports:
                - "80:80"
            volumes:
                - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
        mongo:
            image: "mongo:latest"
            container_name: my_mongo
            ports:
                - 27017:27017
            volumes:
                - mongodb:/data/db
                - mongodb_config:/data/configdb
    

    默认情况下,docker compose 文件中的所有服务都可以通过名称自动通过网络看到彼此,就好像它们是“经典”专用网络中的独立机器一样。 因此,您不需要从不需要从外部世界访问的容器中公开任何端口,这些容器是除 nginx 容器之外的所有容器。除非您知道自己在做什么,否则我强烈建议您遵循此建议。特别是一旦某些扫描仪偶然发现互联网上开放的 mongo 服务器,暴露诸如 mongo db 之类的东西会很快变得非常危险。清理后的 docker-compose.yml 看起来像这样:

    version: "3.8"
    
    services:
        nodeserver:
            image: docker-username/docker-image
        nginx:
            image: nginx
            ports:
                - "80:80"
            volumes:
                - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
        mongo:
            image: "mongo:latest"
            volumes:
                - mongodb:/data/db
                - mongodb_config:/data/configdb
    

    我建议您查看Traefik,它使这变得非常简单,并且可以做更多的事情,例如自动 tls、多域、访问限制等。

    【讨论】:

    • 感谢 @kolaente 尝试使用您的方法,应用程序容器无法连接到 MongoDb connect ECONNREFUSED xxx.xx.x.x:27017 然后 Nginx 也 failed (111: Connection refused) while connecting to upstream http://xxx.xx.x.x:4000/
    • 您在应用中为 mongodb 连接配置了什么?
    • mongodb://localhost:27017/my_db_name
    • 那必须是mongodb://mongo:27017/my_db_namemongo 是 compose 文件中 mongodb 服务的名称,由于 compose 文件中的所有服务都在同一个网络中,因此其他服务(=您的节点应用程序)可以使用该名称与 mongodb 服务通信。
    • 坦克很多。这完全符合预期。如果有人有同样的问题,只需澄清一下,docker-compose.yml 中的volumes 的值应该有一个前面的./ 以避免Named volume "mongodb:/data/db:rw" is used in service "mongo" but no declaration was found in the volumes section. 错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2019-03-22
    • 2020-07-28
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    相关资源
    最近更新 更多