如何使用docker-compose正确运行数据库(rethinkdb)?

时间:2018-07-16 14:59:00

标签: docker docker-compose dockerfile

我需要帮助来使用docker和nodejs运行数据库。我不明白我要去哪里错,但是我无法在带数据库的容器和带节点的容器之间建立连接。这是docker中的数据库链接:“ https://hub.docker.com/_/rethinkdb/”。然后是:

我的Dockerfile

FROM node:latest
ENV HOME=/src/jv-agricultor
RUN mkdir -p $HOME/
WORKDIR $HOME/
ADD package* $HOME/
RUN npm install
EXPOSE 80
ADD . $HOME/
CMD ["node", "node_modules/.bin/nodemon", "-L", "bin/www"]

我的docker-compose.yml

version: "3"
volumes:
  rethindb-data:
    external: true
services:
  db:
    image: rethinkdb:latest
    ports:
      - "8080:8080"
      - "29015:29015"
      - "28015:28015"
  api:
    image: hello-nodemon
    environment:
      - NODE_ENV=development
      - PORT=80
      - DB_HOST=localhost
      - DB_PORT=28015
    deploy:
      # replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "3000:80"
    volumes:
      - .:/src/jv-agricultor
      - /src/jv-agricultor/node_modules
    depends_on:
      - db
    networks:
      - webnet
networks:
  webnet:

我运行: docker stack deploy -c docker-compose.yml网络服务

我的docker服务

ID                  NAME                MODE                REPLICAS            IMAGE                  PORTS
yez42a7w8khs        webservice_api      replicated          1/1                 hello-nodemon:latest   *:3000->80/tcp
n8idu78cp18m        webservice_db       replicated          1/1                 rethinkdb:latest       *:8080->8080/tcp,*:28015->28015/tcp,*:29015->29015/tcp

我的docker服务api(这是节点/表达式)

ID                  NAME                IMAGE                  NODE                DESIRED STATE       CURRENT STATE            ERROR          PORTS
p20qdagcspjc        webservice_api.1    hello-nodemon:latest   abner               Running             Running 28 minutes ago

我的Docker服务数据库

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR       PORTS
3046xuo4l8ix        webservice_db.1     rethinkdb:latest    abner               Running             Running 30 minutes ago

我的日志内部数据库

webservice_db.1.3046xuo4l8ix@abner    | Recursively removing directory /data/rethinkdb_data/tmp
webservice_db.1.3046xuo4l8ix@abner    | Initializing directory /data/rethinkdb_data
webservice_db.1.3046xuo4l8ix@abner    | Running rethinkdb 2.3.6~0jessie (GCC 4.9.2)...
webservice_db.1.3046xuo4l8ix@abner    | Running on Linux 4.15.0-24-generic x86_64
webservice_db.1.3046xuo4l8ix@abner    | Loading data from directory /data/rethinkdb_data
webservice_db.1.3046xuo4l8ix@abner    | Listening for intracluster connections on port 29015
webservice_db.1.3046xuo4l8ix@abner    | Listening for client driver connections on port 28015
webservice_db.1.3046xuo4l8ix@abner    | Listening for administrative HTTP connections on port 8080
webservice_db.1.3046xuo4l8ix@abner    | Listening on cluster addresses: 127.0.0.1, 172.18.0.3, 10.0.5.182, 10.0.5.183, 10.255.11.212, 10.255.11.213
webservice_db.1.3046xuo4l8ix@abner    | Listening on driver addresses: 127.0.0.1, 172.18.0.3, 10.0.5.182, 10.0.5.183, 10.255.11.212, 10.255.11.213
webservice_db.1.3046xuo4l8ix@abner    | Listening on http addresses: 127.0.0.1, 172.18.0.3, 10.0.5.182, 10.0.5.183, 10.255.11.212, 10.255.11.213
webservice_db.1.3046xuo4l8ix@abner    | Server ready, "069fd360acfb_jot" c1cf5173-cf0d-457f-9c8f-4ba1756c28d8

我的app.js

...
var connect = require('./lib/connect');
console.log('DB_HOST: ' + process.env.DB_HOST);
console.log('DB_PORT: ' + process.env.DB_PORT);
console.log('PORT: ' + process.env.PORT);
console.log('NODE_ENV: ' + process.env.NODE_ENV);
...

我的连接中间件

'use strict'

// import r from 'rethinkdb';
var r = require('rethinkdb');

module.exports._connect = (function _connect(req, res, next) {
    r.connect( {host: process.env.DB_HOST, port: process.env.DB_PORT}, (err, conn) => {
        console.log(err);
    })
})();

我的服务docker API日志重新放置

webservice_api.1.p20qdagcspjc@abner    | [nodemon] restarting due to changes...
webservice_api.1.p20qdagcspjc@abner    | [nodemon] starting `node bin/www`
webservice_api.1.p20qdagcspjc@abner    | DB_HOST: localhost
webservice_api.1.p20qdagcspjc@abner    | DB_PORT: 28015
webservice_api.1.p20qdagcspjc@abner    | PORT: 80
webservice_api.1.p20qdagcspjc@abner    | NODE_ENV: development
webservice_api.1.p20qdagcspjc@abner    | { ReqlDriverError: Could not connect to localhost:28015.
webservice_api.1.p20qdagcspjc@abner    | connect ECONNREFUSED 127.0.0.1:28015
webservice_api.1.p20qdagcspjc@abner    |     at ReqlDriverError.ReqlError [as constructor] (/src/jv-agricultor/node_modules/rethinkdb/errors.js:23:13)
webservice_api.1.p20qdagcspjc@abner    |     at new ReqlDriverError (/src/jv-agricultor/node_modules/rethinkdb/errors.js:68:50)
webservice_api.1.p20qdagcspjc@abner    |     at TcpConnection.<anonymous> (/src/jv-agricultor/node_modules/rethinkdb/net.js:94:27)
webservice_api.1.p20qdagcspjc@abner    |     at Object.onceWrapper (events.js:273:13)
webservice_api.1.p20qdagcspjc@abner    |     at TcpConnection.emit (events.js:182:13)
webservice_api.1.p20qdagcspjc@abner    |     at Socket.<anonymous> (/src/jv-agricultor/node_modules/rethinkdb/net.js:705:22)
webservice_api.1.p20qdagcspjc@abner    |     at Socket.emit (events.js:187:15)
webservice_api.1.p20qdagcspjc@abner    |     at emitErrorNT (internal/streams/destroy.js:82:8)
webservice_api.1.p20qdagcspjc@abner    |     at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
webservice_api.1.p20qdagcspjc@abner    |     at process._tickCallback (internal/process/next_tick.js:63:19)
webservice_api.1.p20qdagcspjc@abner    | From previous event:
webservice_api.1.p20qdagcspjc@abner    |     at Function.<anonymous> (/src/jv-agricultor/node_modules/rethinkdb/net.js:945:10)
webservice_api.1.p20qdagcspjc@abner    |     at Function.connect (/src/jv-agricultor/node_modules/rethinkdb/util.js:43:16)
webservice_api.1.p20qdagcspjc@abner    |     at _connect (/src/jv-agricultor/lib/connect.js:9:7)
webservice_api.1.p20qdagcspjc@abner    |     at Object.<anonymous> (/src/jv-agricultor/lib/connect.js:19:3)
webservice_api.1.p20qdagcspjc@abner    |     at Module._compile (internal/modules/cjs/loader.js:689:30)
webservice_api.1.p20qdagcspjc@abner    |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
webservice_api.1.p20qdagcspjc@abner    |     at Module.load (internal/modules/cjs/loader.js:599:32)
webservice_api.1.p20qdagcspjc@abner    |     at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
webservice_api.1.p20qdagcspjc@abner    |     at Function.Module._load (internal/modules/cjs/loader.js:530:3)
webservice_api.1.p20qdagcspjc@abner    |     at Module.require (internal/modules/cjs/loader.js:637:17)
webservice_api.1.p20qdagcspjc@abner    |     at require (internal/modules/cjs/helpers.js:20:18)
webservice_api.1.p20qdagcspjc@abner    |     at Object.<anonymous> (/src/jv-agricultor/app.js:14:15)
webservice_api.1.p20qdagcspjc@abner    |     at Module._compile (internal/modules/cjs/loader.js:689:30)
webservice_api.1.p20qdagcspjc@abner    |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
webservice_api.1.p20qdagcspjc@abner    |     at Module.load (internal/modules/cjs/loader.js:599:32)
webservice_api.1.p20qdagcspjc@abner    |     at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
webservice_api.1.p20qdagcspjc@abner    |     at Function.Module._load (internal/modules/cjs/loader.js:530:3)
webservice_api.1.p20qdagcspjc@abner    |     at Module.require (internal/modules/cjs/loader.js:637:17)
webservice_api.1.p20qdagcspjc@abner    |     at require (internal/modules/cjs/helpers.js:20:18)
webservice_api.1.p20qdagcspjc@abner    |   name: 'ReqlDriverError',
webservice_api.1.p20qdagcspjc@abner    |   msg:
webservice_api.1.p20qdagcspjc@abner    |    'Could not connect to localhost:28015.\nconnect ECONNREFUSED 127.0.0.1:28015',
webservice_api.1.p20qdagcspjc@abner    |   frames: undefined,
webservice_api.1.p20qdagcspjc@abner    |   message:
webservice_api.1.p20qdagcspjc@abner    |    'Could not connect to localhost:28015.\nconnect ECONNREFUSED 127.0.0.1:28015' }

2 个答案:

答案 0 :(得分:2)

docker-compose按服务名称进行服务间通信,因此DB_HOST的值应为db

另一方面,除非您需要将数据库公开到堆栈外部,否则不需要端口映射。

@Alex Karshin不必完全指定容器名称。 docker-compose networking docs中的第一个示例显示了它的真实程度。

答案 1 :(得分:2)

spawnia有一点,但可能没有正确的答案。如果您查看docker ps -a,则数据库容器的名称为webservice_db。因此,如果您尝试在本地主机上连接到rethinkdb(因为它显然不在本地主机上),您将不会成功。

您必须将容器名称(webservice_db)硬编码到您的配置文件中,或者 do docker-compose.yml中进行设置。但是,如果这样做,建议您明确设置容器名称:

version: "3"
...
services:
  db:
    container_name: webservice_db
    ...
  api:
    container_name: webservice_api
    environment:
      - NODE_ENV=development
      - PORT=80
      - DB_HOST= webservice_db
      - DB_PORT=28015
  ...

现在,它应该可以正常工作了。