не удается подключиться к докеру cassandra с помощью cqlsh

Я запускаю контейнер докеров Cassandra:

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               [::]:*

Подключение к C * из локального cqlsh в порядке:

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

но я не подключаюсь к контейнеру докеров с локального хоста:

$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

Итак, я не подключаюсь через php-драйвер localhost.

Как я могу подключить докер cassandra к моему php-скрипту и cqlsh?

Почему докер сопоставляет порт tcp6, а не tcp4? решить

Почему локальный cqlsh (версия 4.1) подключается через порт 9160, а докер-контейнер cqlsh (версия 5.0.1) подключается через порт 9042?


добавленная информация

Если запустить контейнер как:

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

person Alexandre Kalendarev    schedule 07.01.2016    source источник
comment
Если вы запускаете Cassandra в докере, она работает в собственной сети; Таким образом, вы можете создать сеть докеров и использовать ее для Cassandra и использовать ту же сеть для других контейнеров, которым необходимо подключиться к ней medium.com/techlogs/cassandra-in-docker-3e5eb98cdb22   -  person Alex Punnen    schedule 23.07.2020


Ответы (1)


Попробуйте изменить команду запуска докера как:

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

Это обеспечит сопоставление контейнера докеров с 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 / доменное имя является идентификатором компьютера, на котором запущен контейнер докера.

Если ваше приложение PHP находится в другом контейнере докеров на том же компьютере, сначала вам нужно связать контейнеры, затем вы можете использовать TSocket('alias name', 9160) в этом, псевдоним - это имя, которое у вас есть для ссылки.

try {
  // Make a connection to the Thrift interface to Cassandra
  $socket = new TSocket('127.0.0.1', 9160);
person Phani    schedule 07.01.2016
comment
Спасибо, но у меня нет связи с php и cqlsh. См. Добавленный текст к вопросу. - person Alexandre Kalendarev; 07.01.2016
comment
это решило вашу проблему? если да, пожалуйста, примите решение, чтобы другие, столкнувшиеся с подобной проблемой, могли извлечь из него пользу. - person Phani; 02.02.2016
comment
Проблема была решена конкретно. Я устанавливаю новый cqlsh из источника cassandra и имею контейнер докеров для подключения, но не имею соединения с клиентом PHP. Итак, я мог бы использовать другой клиент PHP, но у меня нет времени на эксперименты. Спасибо за помощь. - person Alexandre Kalendarev; 03.02.2016