apocas / dockerode

Docker + Node = Dockerode (Node.js module for Docker's Remote API)
Apache License 2.0
4.37k stars 461 forks source link

Spin-up DB Cluster Port Mapping not working properly #622

Closed konsalex closed 3 years ago

konsalex commented 3 years ago

Hey there,

I am trying to create a cluster, basically replicating this script

docker network create --driver=bridge cluster

docker run --name=core1 --detach --network=cluster \
    --publish=7474:7474 --publish=7473:7473 --publish=7687:7687 \
    --hostname=core1 \
    --env NEO4J_dbms_mode=CORE \
    --env NEO4J_causal__clustering_expected__core__cluster__size=3 \
    --env NEO4J_causal__clustering_initial__discovery__members=core1:5000,core2:5000,core3:5000 \
    --env NEO4J_ACCEPT_LICENSE_AGREEMENT=yes \
    --env NEO4J_dbms_connector_bolt_advertised__address=localhost:7687 \
    --env NEO4J_dbms_connector_http_advertised__address=localhost:7474 \
    neo4j:4.3-enterprise

docker run --name=core2 --detach --network=cluster \
    --publish=8474:7474 --publish=8473:7473 --publish=8687:7687 \
    --hostname=core2 \
    --env NEO4J_dbms_mode=CORE \
    --env NEO4J_causal__clustering_expected__core__cluster__size=3 \
    --env NEO4J_causal__clustering_initial__discovery__members=core1:5000,core2:5000,core3:5000 \
    --env NEO4J_ACCEPT_LICENSE_AGREEMENT=yes \
    --env NEO4J_dbms_connector_bolt_advertised__address=localhost:8687 \
    --env NEO4J_dbms_connector_http_advertised__address=localhost:8474 \
    neo4j:4.3-enterprise

docker run --name=core3 --detach --network=cluster \
    --publish=9474:7474 --publish=9473:7473 --publish=9687:7687 \
    --hostname=core3 \
    --env NEO4J_dbms_mode=CORE \
    --env NEO4J_causal__clustering_expected__core__cluster__size=3 \
    --env NEO4J_causal__clustering_initial__discovery__members=core1:5000,core2:5000,core3:5000 \
    --env NEO4J_ACCEPT_LICENSE_AGREEMENT=yes \
    --env NEO4J_dbms_connector_bolt_advertised__address=localhost:9687 \
    --env NEO4J_dbms_connector_http_advertised__address=localhost:9474 \
    neo4j:4.3-enterprise

While the script creates the containers properly, the port bindings are messed-up, leaving 2 out of 3 clusters with null port bindings.

Any clue why this is happening?

F7C03C99-F8C8-4D07-AE51-D47BAA9E1E69

443FB70E-7E6B-4F31-895C-DC2433478460

The options object I pass is

{
    Image: newOptions.imageName,
    Tty: true,
    name: memberName,
    Hostname: memberName,
    AttachStdin: false,
    AttachStdout: false,
    AttachStderr: false,
    HostConfig: {
      NetworkMode: networkName,
      PortBindings: {
        /** HTTP port */
        [`${ports.container.HTTP}/tcp`]: [
          {HostIp: '0.0.0.0', HostPort: ports.host.HTTP},
        ],
        /** HTTPS port */
        [`${ports.container.HTTPS}/tcp`]: [
          {HostIp: '0.0.0.0', HostPort: ports.host.HTTPS},
        ],
        /** Bolt port */
        [`${ports.container.BOLT}/tcp`]: [
          {HostIp: '0.0.0.0', HostPort: ports.host.BOLT},
        ],
      },
    },
    Env: [
      'NEO4J_ACCEPT_LICENSE_AGREEMENT=yes',
      `NEO4J_dbms_mode=${newOptions.mode}`,
      `NEO4J_causal__clustering_expected__core__cluster__size=${newOptions.clusterSize}`,
      `NEO4J_causal__clustering_initial__discovery__members=${discoveryMembers}`,
      `NEO4J_dbms_connector_bolt_advertised__address=localhost:${ports.container.BOLT}`,
      `NEO4J_dbms_connector_http_advertised__address=localhost:${ports.container.HTTP}`,
    ],
  }
konsalex commented 3 years ago

Also the options generated are below if this helps:

{"Image":"neo4j:4.3-enterprise","Tty":true,"name":"boltnet-e7lg0nh-CORE-1","Hostname":"boltnet-e7lg0nh-CORE-1","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"HostConfig":{"NetworkMode":"boltnet-jrstmo","PortBindings":{"7474/tcp":[{"HostIp":"0.0.0.0","HostPort":"7474"}],"7473/tcp":[{"HostIp":"0.0.0.0","HostPort":"7473"}],"7687/tcp":[{"HostIp":"0.0.0.0","HostPort":"7687"}]}},"Env":["NEO4J_ACCEPT_LICENSE_AGREEMENT=yes","NEO4J_dbms_mode=CORE","NEO4J_causal__clustering_expected__core__cluster__size=3","NEO4J_causal__clustering_initial__discovery__members=boltnet-e7lg0nh-CORE-1:5000,boltnet-e7lg0nh-CORE-2:5000,boltnet-e7lg0nh-CORE-3:5000","NEO4J_dbms_connector_bolt_advertised__address=localhost:7687","NEO4J_dbms_connector_http_advertised__address=localhost:7474"]}
{"Image":"neo4j:4.3-enterprise","Tty":true,"name":"boltnet-e7lg0nh-CORE-2","Hostname":"boltnet-e7lg0nh-CORE-2","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"HostConfig":{"NetworkMode":"boltnet-jrstmo","PortBindings":{"7484/tcp":[{"HostIp":"0.0.0.0","HostPort":"7474"}],"7483/tcp":[{"HostIp":"0.0.0.0","HostPort":"7473"}],"7697/tcp":[{"HostIp":"0.0.0.0","HostPort":"7687"}]}},"Env":["NEO4J_ACCEPT_LICENSE_AGREEMENT=yes","NEO4J_dbms_mode=CORE","NEO4J_causal__clustering_expected__core__cluster__size=3","NEO4J_causal__clustering_initial__discovery__members=boltnet-e7lg0nh-CORE-1:5000,boltnet-e7lg0nh-CORE-2:5000,boltnet-e7lg0nh-CORE-3:5000","NEO4J_dbms_connector_bolt_advertised__address=localhost:7697","NEO4J_dbms_connector_http_advertised__address=localhost:7484"]}
{"Image":"neo4j:4.3-enterprise","Tty":true,"name":"boltnet-e7lg0nh-CORE-3","Hostname":"boltnet-e7lg0nh-CORE-3","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"HostConfig":{"NetworkMode":"boltnet-jrstmo","PortBindings":{"7494/tcp":[{"HostIp":"0.0.0.0","HostPort":"7474"}],"7493/tcp":[{"HostIp":"0.0.0.0","HostPort":"7473"}],"7707/tcp":[{"HostIp":"0.0.0.0","HostPort":"7687"}]}},"Env":["NEO4J_ACCEPT_LICENSE_AGREEMENT=yes","NEO4J_dbms_mode=CORE","NEO4J_causal__clustering_expected__core__cluster__size=3","NEO4J_causal__clustering_initial__discovery__members=boltnet-e7lg0nh-CORE-1:5000,boltnet-e7lg0nh-CORE-2:5000,boltnet-e7lg0nh-CORE-3:5000","NEO4J_dbms_connector_bolt_advertised__address=localhost:7707","NEO4J_dbms_connector_http_advertised__address=localhost:7494"]}

and I create containers :

const container = await dockerDriver.createContainer(options);
container.start();
konsalex commented 3 years ago

Found the issue,

/** HTTP port */
        [`${ports.host.HTTP}/tcp`]: [
          {HostIp: '0.0.0.0', HostPort: ports.container.HTTP},
        ],
        /** HTTPS port */
        [`${ports.host.HTTPS}/tcp`]: [
          {HostIp: '0.0.0.0', HostPort: ports.container.HTTPS},
        ],
        /** Bolt port */
        [`${ports.host.BOLT}/tcp`]: [
          {HostIp: '0.0.0.0', HostPort: ports.container.BOLT},
        ]

confused the order for the Port Bininds