运行 Ubuntu 18.04 中的 Dockerhub 镜像,带有 MongoDB 镜像和 Nginx

Running a Dockerhub Image in Ubuntu 18.04 with MongoDB image and Nginx

所以我有一个带有 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" ]

我已经将镜像拉入我的 Ubuntu 18.04 服务器 运行ning Nginx 并且还从官方 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.

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

这是您的合成文件在图像 specified 而不是构建时的样子:

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 组合文件中的所有服务都可以通过名称在网络上自动相互查看,就好像它们是“经典”专用网络中的独立机器一样。 因此,您不需要从不需要从外部世界访问的容器中公开任何端口,这些容器都是除 nginx 容器之外的容器。我强烈建议您遵循此建议,除非您知道自己在做什么。 Especially 一旦某些扫描器偶然发现互联网上打开的 mongo 服务器,暴露 mongo 数据库之类的东西会很快变得非常危险。清理后的 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、多个域、访问限制等。