web-dev-qa-db-ja.com

cassandra docker to cqlshに接続できません

私は実行していますCassandra docker container:

docker pull cassandra
run --name cassandra -p 9042:9042 -p 9160:9160   -d cassandra  

Netstat -tplnは次のとおりです。

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

LISTEN    -  tcp6       0      0 [::]:9160               [::]:*
LISTEN    -  tcp6       0      0 [::]:9042               [::]:*

ローカルcqlshからC *への接続は問題ありません。

docker exec -it cassandra /bin/bash
#cqlsh
Connected to Test Cluster at 127.0.0.1:9042. 
[cqlsh 5.0.1 | Cassandra 3.1.1 | CQL spec 3.3.1 | Native protocol v4] 
Use HELP for help.
cqlsh> show Host     
Connected to Test Cluster at 127.0.0.1:9042.  

ローカルcqlshをインストールします。

$cqlsh --version
cqlsh 4.1.1

しかし、私はlocalhostからdockerコンテナーに接続しません:

$sqlsh
Traceback (most recent call last):
  File "/usr/sbin/cqlsh", line 2067, in <module>
    main(*read_options(sys.argv[1:], os.environ))
  . . .
  File "/home/akalend/src/cqlsh_standalone/lib/thrift-python-internal-only-0.9.1.Zip/thrift/transport/TSocket.py", line 103, in read
socket.error: [Errno 104] Connection reset by peer

そのため、localhost php-driverからの接続は行いません。

接続方法cassandra phpスクリプトとcqlshを備えたdocker

なぜ港湾労働者がtcp6にポートをマッピングし、tcp4をしないのですか?resolve

ローカルcqlsh(バージョン4.1)が9160ポートで接続するのに、Dockerコンテナーcqlsh(バージョン5.0.1)が9042ポートで接続するのはなぜですか?


追加情報

Conteinerを次のように実行すると:

run --name cassandra -p 127.0.0.1:9042:9042 -p 127.0.0.1:9160:9160   -d cassandra 

私はip4ポートをリッスンしています:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address  State       PID/Program name
tcp        0      0 127.0.0.1:9160 0.0.0.0:*       LISTEN      2454/docker-proxy
tcp        0      0 127.0.0.1:9042 0.0.0.0:*       LISTEN      2462/docker-proxy

しかし、私はcqlshとphpとの接続を持っていません

socket.error: [Errno 104] Connection reset by peer

PHP Fatal error:  Uncaught exception 'Cassandra\Exception\RuntimeException' with message 'No hosts available for the control connection' in /home/akalend/projects/test/cassa/test.php:7
Stack trace:
#0 /home/akalend/projects/test/cassa/test.php(7): Cassandra\DefaultCluster->connect('system')
#1 {main} thrown in /home/akalend/projects/test/cassa/test.php on line 7

Docker runコマンドを次のように変更してみてください:

_docker pull cassandra
docker run --name cassandra -p 127.0.0.1:9042:9042 -p 127.0.0.1:9160:9160   -d cassandra 
_

これにより、DockerコンテナーがIPv4に確実にマップされます。

_9160 - Thrift client API
9042 - CQL native transport port
_

PHP=アプリケーションから、Thriftポートに接続する必要があります。 http://support.qualityunit.com/942764-Example-of-PHPの例に従ってください。 -application-readingwriting-to-Cassandra 上記の例では、cassandraコンテナーが実行されている同じマシンからコンテナーに接続するために、同じTSocket('127.0.0.1', 9160)

別のマシンから接続する場合は、TSocket('IP/Domain name', 9160)を使用する必要があります。IP/ドメイン名は、Dockerコンテナーが実行されているマシンの識別子です。

PHPアプリケーションが同じマシンの別のDockerコンテナーにある場合、最初にコンテナーをリンクする必要があります。次に、この中でTSocket('alias name', 9160)を使用できます。エイリアス名はリンクの名前。

_try {
  // Make a connection to the Thrift interface to Cassandra
  $socket = new TSocket('127.0.0.1', 9160);
_
20
Phani