Как подключиться из одного контейнера в другой в docker-compose?
Я пытаюсь запустить 8 контейнеров. 4 узла и 4 узла abci. Это мой файл docker-compose
Идея состоит в том, чтобы подключить каждый узел к его узлу abci. Файл конфигурации, который должен использоваться всеми узлами, находится в папке с именем build в каталоге.
version: '3'
services:
node0:
container_name: node0
image: "tendermintnode"
ports:
- "26656-26657:26656-26657"
environment:
- ID=0
- LOG=$${LOG:-tendermint.log}
build:
context: .
dockerfile: abci.Dockerfile
volumes:
- ./build:/tendermint
command: tendermint node --proxy_app=tcp://abci0:26658 --home "./tendermint/node0" --consensus.create_empty_blocks=false
depends_on:
- abci0
networks:
localnet:
ipv4_address: 192.167.10.2
node1:
.
node2:
node3:
.
abci0:
container_name: abci0
image: "abcinode"
build:
context: .
dockerfile: abci.Dockerfile
command: python3 vimana/tendermint/app.py
networks:
localnet:
ipv4_address: 192.167.10.6
abci1:
.
abci2:
.
abci3:
.
networks:
.
Предполагалось начать отправку запросов друг другу. Но вместо этого это дает.
abci1 | INFO ABCIServer started on port: 26658
abci0 | INFO ABCIServer started on port: 26658
.
.
.
node0 | E[20016-01-20|19:50:10.519] Dialing failed module=pex addr=7ab8dbd0213ba49aaba13bb7d9396072ba4c4496@192.167.10.5:26656 err="dial tcp 192.167.10.5:26656: connect: connection refused" attempts=0
node0 | E[20016-01-20|19:50:10.657] Dialing failed module=pex addr=ba1ee154e395db646cc54c6fd2a9d0f8f9f98bf1@192.167.10.3:26656 err="dial tcp 192.167.10.3:26656: i/o timeout" attempts=0
.
.
.
node2 | I[20016-01-20|19:50:12.576] Started node module=main nodeInfo="{ProtocolVersion:{P2P:5 Block:8 App:0} ID_:01723b064d72fdbe356911652e1f078fa3c5efd5 ListenAddr:tcp://0.0.0.0:26656 Network:chain-EFXD56 Version:0.27.3 Channels:4020212223303800 Moniker:asura Other:{TxIndex:on RPCAddress:tcp://0.0.0.0:26657}}"
node3 | E[20016-01-20|19:50:40.625] Dialing failed module=pex addr=7ab8dbd0213ba49aaba13bb7d9396072ba4c4496@192.167.10.5:26656 err="self ID<7ab8dbd0213ba49aaba13bb7d9396072ba4c4496>" attempts=0
node1 | E[20016-01-20|19:50:41.751] Dialing failed module=pex addr=ba1ee154e395db646cc54c6fd2a9d0f8f9f98bf1@192.167.10.3:26656 err="self ID<ba1ee154e395db646cc54c6fd2a9d0f8f9f98bf1>" attempts=0
node2 | E[20016-01-20|19:50:42.581] Dialing failed module=pex addr=01723b064d72fdbe356911652e1f078fa3c5efd5@192.167.10.4:26656 err="self ID<01723b064d72fdbe356911652e1f078fa3c5efd5>" attempts=0
node0 | E[20016-01-20|19:51:09.660] Dialing failed module=pex addr=753c2e8a68b459816d598b49a0db107f64777fc5@192.167.10.2:26656 err="self ID<753c2e8a68b459816d598b49a0db107f64777fc5>" attempts=0
node0 | E[20016-01-20|19:53:37.353] Error on broadcastTxCommit module=rpc err="Timed out waiting for tx to be included in a block"
Как вы можете видеть выше, контейнеры abci работают нормально. Но соединение становится отказанным.
2 ответа
Для людей, которые ищут ответ, PR-сайт https://github.com/tendermint/tendermint/pull/3195/files был объединен для разработки несколько дней назад.
node0:
container_name: node0
image: "tendermint/localnode"
ports:
- "26656-26657:26656-26657"
environment:
- ID=0
- LOG=$${LOG:-tendermint.log}
volumes:
- ./build:/tendermint:Z
command: node --proxy_app=tcp://abci0:26658
networks:
localnet:
ipv4_address: 192.167.10.2
abci0:
container_name: abci0
image: "abci-image"
build:
context: .
dockerfile: abci.Dockerfile
command: <insert command to run your abci application>
networks:
localnet:
ipv4_address: 192.167.10.6
networks:
localnet:
driver: bridge
ipam:
driver: default
config:
-
subnet: 192.167.10.0/16
По сути, вам ничего не нужно делать, кроме как оставить соответствующие определения контейнеров в той же сетевой зоне, как показано ниже, и вам не нужно указывать конкретный IP-адрес (если он вам действительно не нужен).
version: "3"
services:
node0:
image: ...
networks:
- abci0_net
node1:
image: ...
networks:
- abci1_net
node2:
image: ...
networks:
- abci2_net
abci0:
image: ...
networks:
- abci0_net
abci1:
image: ...
networks:
- abci1_net
abci2:
image: ...
networks:
- abci2_net
networks:
abci0_net:
driver: bridge
abci1_net:
driver: bridge
abci2_net:
driver: bridge
При такой конфигурации только парные машины могут получать доступ друг к другу.