如何构建 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 现在命名网络基本上已经取代了它。将一个容器设置为另一个网络命名空间中的 运行 也是一种非常不寻常的设置,并且它具有像您所显示的那样的限制。
我有 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 现在命名网络基本上已经取代了它。将一个容器设置为另一个网络命名空间中的 运行 也是一种非常不寻常的设置,并且它具有像您所显示的那样的限制。