如何构建 docker 个容器端口?使用--net 或--link?

How to structure docker container ports? Use --net or --link?

我有 2 个 docker 个容器。其中一个包含一个简单的 node.js 网络应用程序,其中包含服务器信息和 MongoDB 连接详细信息。第二个包含 运行ning 实例 MongoDB。

我正在尝试 运行 网络应用程序容器连接到 MongoDB 容器,如下所示:

docker run --link mongodb2:mongodb2 -p 49160:8080 -it --name web node-web-app

这样做我可以成功访问和查看位于 http://hostname:49160/ 的托管页面,但我无法连接到 MongoDB。

我试过的另一种方法是:

docker run --net container:mongodb2 -ti --name web node-web-app

这里我可以成功连接到 MongoDB,但是我无法访问我的托管页面 http://hostname:27017/。相反,我收到消息:

It looks like you are trying to access MongoDB over HTTP on the native driver port.

我也尝试使用 --net 方法传递端口详细信息:

docker run --net container:mongodb2 -p 49160:8080 -ti --name web node-web-app

但我收到 docker 错误:

docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
See 'docker run --help'.

我认为我配置端口的方式存在问题,但我对 docker 和设置 Web 服务器都是新手。

这是我的网络应用程序代码:

'use strict';
const express = require('express');
// App
const app = express();

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

const MongoClient = require('mongodb').MongoClient;

// Connect URL
const url = 'mongodb://127.0.0.1:27017';

var db;
var ticket;

MongoClient.connect(url, {
    useNewUrlParser: true,
    useUnifiedTopology: true
}, (err, client) => {
    if (err) {
        return console.log(err);
    }

    // Specify database you want to access

    db = client.db('DB');

    console.log(`MongoDB Connected: ${url}`);

    ticket = db.collection('ticket');

    ticket.find().toArray((err, results) => {
        console.log(results);
    });

});

//Routes
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html')
});


app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`)

您应该使用 named Docker network 在容器之间进行连接。完成后,其他容器的名称将用作主机名。

docker network create some-network
docker run -d --net some-network --name mongodb2 mongo
docker run -d --net some-network --name app -p 49160:8080 node-web-app

在您的源代码中,您不能对数据库的位置进行硬编码,因为当您部署它时,它很可能不在同一台机器或同一容器中。 localhost 可能是合理的开发人员默认设置,但该选项需要可配置。

const mongoHost = process.env.MONGO_HOST || 'localhost';
const url = `mongodb://${mongoHost}:27017`;
docker run ... -e MONGO_HOST=mongodb2 ...

如果您使用 Docker Compose 来启动东西,it provides a default network for you(不同于核心 Docker 文档中的“默认桥接网络”)并且您需要做很多小设置;只需使用其他容器的 Compose 服务名称作为主机名即可。

version: '3.8'
services:
  mongodb2:
    image: mongo
  app:
    build: .
    ports: ['49160:8080']
    environment:
      - MONGO_HOST=mongodb2

在您提出的其他选项中,--link is considered obsolete 现在命名网络基本上已经取代了它。将一个容器设置为另一个网络命名空间中的 运行 也是一种非常不寻常的设置,并且它具有像您所显示的那样的限制。