[英]How do you configure Vagrant so host can communicate with kafka-docker running on VM?
我有在流浪漢Ubuntu VM上運行的kafka-docker。 我可以使用在VM上運行的NodeJs程序生成和使用消息。
但是,我無法使用Windows主機上的相同NodeJs程序,這些程序似乎可以訪問但未收到任何答案。
這是我的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
我在Linux VM上的ifconfig顯示:
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
這是我在Ubuntu上的/ etc / hosts文件:
127.0.0.1 localhost
127.0.0.1 zookeeper
127.0.0.1 kafkadocker
任何幫助,不勝感激。
最后,當我看到Windows中的nodejs程序正在連接但無法通過時,終於弄清楚了如何克服“錯誤:連接ETIMEDOUT”。
這是簡單的食譜。
首先,在Vagrantfile中,除了上面列出的轉發端口行外,還使用以下行為Oracle Virtualbox vm提供適當的名稱:
# after line: config.vm.provider :virtualbox do |vb|
vb.name = "kafkadocker"
使用以下命令啟動虛擬機:
vagrant up
接下來,在Windows命令提示符下,執行以下操作:
ipconfig
注意Oracle Virtualbox vm的IP地址,對我來說重要的幾行是:
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
接下來,在虛擬機中,編輯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。 在連接時,Kafka將告訴Windows上的客戶端通過服務器“ kafkadocker”。 現在,借助Windows主機文件,節點程序將知道要轉到哪個IP。
現在,使用以下命令在VM中啟動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());
});
希望這對某人有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.