如何使用 Docker 启动多个使用 tcp 的容器

How to start multiple containers that use tcp with Docker

我正在尝试 运行 Docker 容器中的第二个 Meteor 应用程序。第一个(我想要 运行ning)可以通过 localhost:3000 访问,我想 运行 第二个在另一个端口,如 localhost:3003。当我尝试访问第二个时,我得到了这个

This website is not accessible. Localhost don't allow the connexion. Do a research about localhost 3003 on Google.

如果我查看 Docker,我可以看到我的容器是 运行ning: 但是我注意到端口之间存在差异,可以访问的端口是0.0.0.0:3000->3000/tcp,不能访问的端口是3000/tcp, 0.0.0.0:3003->3003/tcp,所以我认为这里有问题。

在我的 docker-compose.yml 中,我做了:

app:
  image: jeromevi/controlcontainersapp
  ports:
    - "3003:3003"
  environment:
    - ROOT_URL=http://localhost:3003
    - MONGO_URL=mongodb://mongo:27017/meteor
mongo:
  image: mongo:latest

感谢您的帮助

[编辑] 有日志:

=> Starting app on port 3000...

/opt/meteor/dist/bundle/programs/server/node_modules/fibers/future.js:313
                        throw(ex);
                        ^
MongoError: failed to connect to server [mongo:27017] on first connect
    at Object.Future.wait (/opt/meteor/dist/bundle/programs/server/node_modules/fibers/future.js:449:15)
    at new MongoConnection (packages/mongo/mongo_driver.js:219:27)
    at new MongoInternals.RemoteCollectionDriver (packages/mongo/remote_collection_driver.js:4:16)
    at Object.<anonymous> (packages/mongo/remote_collection_driver.js:38:10)
    at Object.defaultRemoteCollectionDriver (packages/underscore.js:784:19)
    at new Mongo.Collection (packages/mongo/collection.js:103:40)
    at meteorInstall.both.collections.infosContainers.js (both/collections/infosContainers.js:2:14)
    at fileEvaluate (packages/modules-runtime.js:181:9)
    at require (packages/modules-runtime.js:106:16)
    at /opt/meteor/dist/bundle/programs/server/app/app.js:217:1
    - - - - -
    at [object Object].<anonymous> (/opt/meteor/dist/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/topologies/server.js:313:35)
    at emitOne (events.js:77:13)
    at [object Object].emit (events.js:169:7)
    at [object Object].<anonymous> (/opt/meteor/dist/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/connection/pool.js:271:12)
    at [object Object].g (events.js:260:16)
    at emitTwo (events.js:87:13)
    at [object Object].emit (events.js:172:7)
    at Socket.<anonymous> (/opt/meteor/dist/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/connection/connection.js:165:49)
    at Socket.g (events.js:260:16)
    at emitOne (events.js:77:13)

[EDIT2] 使用新配置时,错误是:

但是我有网络testNtw:

NETWORK ID          NAME                DRIVER              SCOPE
6767c4bf208f        bridge              bridge              local
c69fbc3a59cf        host                host                local
f6f5083df32e        none                null                local
3d0aacdbb757        testNtw             bridge              local

并且我做了与答案中相同的 docker-compose.yml

尝试以下操作:

sudo docker network create <your network name>

Docker 撰写文件:

version: '2'
services:
  app:
    image: jeromevi/controlcontainersapp
    ports:
      - "3003:3000"
    environment:
      - ROOT_URL=http://localhost:3000
      - MONGO_URL=mongodb://mongo:27017/meteor
    networks:
      - <your network name>
  mongo:
    image: mongo:latest
    networks:
      - <your network name>
networks:
  <your network name>:
    external: true

然后在您的浏览器中检查 url:

http://localhost:3003

澄清:

对于默认网络,您需要使用 links 这是一项遗留功能。我建议使用 User-Defined 网络。 User-Defined 网络提供内置 DNS,因此您可以通过 name 从同一 User-Defined 网络上的其他容器连接到您的容器。在您的情况下,需要从名为 app.

的容器访问名为 mongo 的容器