Как настроить Vagrant, чтобы хост мог общаться с kafka-docker, работающим на ВМ? - PullRequest
0 голосов
/ 07 мая 2018

У меня Кафка-докер, работающий на Vagrant Ubuntu VM. Я могу создавать и потреблять сообщения, используя программы NodeJ, работающие на виртуальной машине.

Однако я не могу использовать те же программы NodeJ с хоста Windows, программы, кажется, достигают, но ответ не получен.

Вот мой файл docker-compose.yml:

 version: '2'
 services:
   zookeeper:
     image: "wurstmeister/zookeeper:latest"
     network_mode: "host"
     ports:
       - "2181:2181"
   kafka:
     image: "wurstmeister/kafka:latest"
     network_mode: "host"
     ports:
       - 9092:9092
     environment:
       KAFKA_LISTENERS: PLAINTEXT://:9092
       KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.17.0.1:9092
       KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
       KAFKA_CREATE_TOPICS: "BertTopic:3:1"

Вот мой Vagrantfile:

SRCMOUNT = "/hyperledger"
LOCALDEV = "/local-dev"

$script = <<SCRIPT
set -x

echo "127.0.0.1 couchdb" | tee -a /etc/hosts

cd #{SRCMOUNT}/fabric/devenv
./setup.sh

SCRIPT

Vagrant.require_version ">= 1.7.4"
Vagrant.configure('2') do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.network :forwarded_port, guest: 2181, host: 2181, id: "zookeeper", host_ip: "localhost", auto_correct: true # zookeeper 
  config.vm.network :forwarded_port, guest: 9092, host: 9092, id: "kafka", host_ip: "localhost", auto_correct: true # kafka
  config.vm.network :forwarded_port, guest: 7050, host: 7050, id: "orderer", host_ip: "localhost", auto_correct: true # fabric orderer service
  config.vm.network :forwarded_port, guest: 7051, host: 7051, id: "peer", host_ip: "localhost", auto_correct: true # fabric peer service
  config.vm.network :forwarded_port, guest: 7053, host: 7053, id: "peer_event", host_ip: "localhost", auto_correct: true # fabric peer event service
  config.vm.network :forwarded_port, guest: 7054, host: 7054, id: "ca", host_ip: "localhost", auto_correct: true # fabric-ca service
  config.vm.network :forwarded_port, guest: 5984, host: 15984, id: "couchdb", host_ip: "localhost", auto_correct: true # CouchDB service
  config.vm.synced_folder "../..", "#{SRCMOUNT}"
  config.vm.synced_folder "../..", "/opt/gopath/src/github.com/hyperledger"
  config.vm.synced_folder ENV.fetch('LOCALDEVDIR', "../.."), "#{LOCALDEV}"
  config.vm.provider :virtualbox do |vb|
    vb.name = "kafkadocker"
    vb.customize ['modifyvm', :id, '--memory', '4096']
    vb.cpus = 2

    storage_backend = ENV['DOCKER_STORAGE_BACKEND']
    case storage_backend
    when nil,"","aufs","AUFS"
      # No extra work to be done
    when "btrfs","BTRFS"
      # Add a second disk for the btrfs volume
      IO.popen("VBoxManage list systemproperties") { |f|

        success = false
        while line = f.gets do
          # Find the directory where the machine images are stored
          machine_folder = line.sub(/^Default machine folder:\s*/,"")

          if line != machine_folder
            btrfs_disk = File.join(machine_folder, vb.name, 'btrfs.vdi')

            unless File.exist?(btrfs_disk)
              # Create the disk if it doesn't already exist
              vb.customize ['createhd', '--filename', btrfs_disk, '--format', 'VDI', '--size', 20 * 1024]
            end

            # Add the disk to the VM
            vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', btrfs_disk]
            success = true

            break
          end
        end
        raise Vagrant::Errors::VagrantError.new, "Could not provision btrfs disk" if !success
      }
    else
      raise Vagrant::Errors::VagrantError.new, "Unknown storage backend type: #{storage_backend}"
    end

  end

  config.vm.provision :shell, inline: $script
end

Мой ifconfig на виртуальной машине Linux показывает:

docker0   Link encap:Ethernet  HWaddr 02:42:11:89:57:c8
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

Вот мой файл / etc / hosts в Ubuntu:

127.0.0.1       localhost
127.0.0.1               zookeeper
127.0.0.1               kafkadocker

Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 10 мая 2018

Наконец-то разобрался, как обойти «Ошибка: подключить ETIMEDOUT», когда я вижу, как программа nodejs в Windows подключается, но не удается выполнить.

Вот простой рецепт.

Во-первых, в Vagrantfile, в дополнение к линиям перенаправленных портов, перечисленным выше, укажите правильное имя Oracle Virtualbox vm со строкой:

# after line: config.vm.provider :virtualbox do |vb|
    vb.name = "kafkadocker"

Запустите виртуальную машину с:

vagrant up

Далее в командной строке Windows выполните:

ipconfig

Обратите внимание на IP-адрес Oracle Virtualbox vm, для меня строки импорта были:

Ethernet adapter VirtualBox Host-Only Network:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::9900:a662:107f:3420%11
   IPv4 Address. . . . . . . . . . . : 192.168.56.1

Далее нам нужно настроить Windows, чтобы понять, когда ей говорят, что для подключения к серверу «kafkadocker» необходимо перейти на IP-адрес 192.168.56.1, поэтому откройте Notepad ++ как АДМИНИСТРАТОР и добавьте следующую строку в файл C: \ Windows \ System32 \ drivers \ etc \ hosts:

192.168.56.1    kafkadocker

Далее, в vm, отредактируйте docker-compose.yml и измените его на:

version: '2'
services:
  zookeeper:
    image: "wurstmeister/zookeeper:latest"
    network_mode: "host"
    ports:
      - "2181:2181"
  kafka:
    image: "wurstmeister/kafka:latest"
    network_mode: "host"
    ports:
      - 9092
    environment:
      KAFKA_LISTENERS: PLAINTEXT://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkadocker:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CREATE_TOPICS: "BertTopic:3:1"

Важной строкой является KAFKA_ADVERTISED_LISTENERS. При подключении, Кафка скажет клиенту на Windows вставить сервер "kafkadocker". Теперь, благодаря файлу хостов Windows, нодовая программа будет знать, на какой IP-адрес перейти.

Теперь запустите kafka-docker в виртуальной машине с:

 docker-compose up -d

Далее в Windows откройте код Visual Studio:

cd c:\nodecode
code .

И запустить программы nodejs. Для производителя:

var kafka = require('kafka-node'),
    Producer = kafka.Producer,
    KeyedMessage = kafka.KeyedMessage,
    client = new kafka.Client(),
    producer = new Producer(client),
    km = new KeyedMessage('key', 'message'),
    payloads = [
        { topic: 'BertTopic', messages: 'first message', partition: 0 },
        { topic: 'BertTopic', messages: 'second message', partition: 0 },
        { topic: 'BertTopic', messages: 'third message', partition: 0 }
    ];
producer.on('ready', function () {
    producer.send(payloads, function (err, data) {
        console.log(data);
        process.exit(0);
    });
});

producer.on('error', function (err) {
console.log('ERROR: ' + err.toString());
});

Для потребителя (чтение всех сообщений с начала):

var kafka = require('kafka-node'),
    Consumer = kafka.Consumer,
    client = new kafka.Client(),
    consumer = new Consumer(
        client,
        [
              { topic: 'BertTopic', partition: 0, offset: 0 }
        ],
        { fromOffset: true }         
    );

consumer.on('message', function (message) 
{
    console.log(message);
});

consumer.on('error', function (err) 
{
    console.log('ERROR ' + err.toString());
});

Надеюсь, это кому-нибудь поможет.

...