#docker #vagrant #virtualization #vagrantfile
#docker #vagrant #виртуализация #vagrantfile
Вопрос:
Я использую vagrant для развертывания среды с несколькими виртуальными машинами в исследовательских целях, и пока это было здорово. Но теперь мне нужно привязать каждый контейнер docker к определенному ядру процессора, но я не знаю, как это сделать с помощью vagrant. Я знаю, что могу использовать предложение «args» в файле Vagrantfile для передачи параметра «—cpuset» команде docker run, но я не знаю, как использовать его в цикле, поскольку я запускаю несколько контейнеров, и мне нужно привязать каждый контейнер к другому ядру процессора (например. node1 подключается к ядру # 0, node2 подключается к ядру # 1 и т. Д.).
Мой текущий Vagrantfile выглядит следующим образом, без привязки процессора:
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
# choose how many machines the cluster will contain
N_VMS = 32
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "tknerr/baseimage-ubuntu-14.04"
config.vm.network "private_network", ip: "192.168.121.2"
config.vm.provider "docker" do |v|
v.has_ssh = true
end
hosts_file = []
1.upto(N_VMS) do |i|
config.vm.define vm_name = "node#{i}" do |config|
config.vm.hostname = vm_name
end
end
script = <<-SCRIPT
apt-get -y update
apt-get -y install libcr-dev mpich2 mpich2-doc arp-scan openssh-server nano make
SCRIPT
script.sub! 'N_VMS', N_VMS.to_s
config.vm.provision "shell", inline: script
end
Ответ №1:
В конце концов, я искал не в том месте. Правильное место для добавления «—cpuset-cpus» было в блоке config.vm.define .
Код закончился так:
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
# choose how many machines the cluster will contain
N_VMS = 32
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "tknerr/baseimage-ubuntu-14.04"
config.vm.network "private_network", ip: "192.168.121.2"
config.vm.provider "docker" do |v|
v.has_ssh = true
end
2.upto(N_VMS 1) do |i|
config.vm.define vm_name = "node#{i}" do |config|
# CPU PINNING CONFIG
config.vm.provider "docker" do |docker|
docker.create_args = ['--cpuset-cpus=' ((i/2)-1).to_s]
end
config.vm.hostname = vm_name
end
end
script = <<-SCRIPT
apt-get -y update
apt-get -y install libcr-dev mpich2 mpich2-doc arp-scan openssh-server nano make
SCRIPT
script.sub! 'N_VMS', N_VMS.to_s
i=1
config.vm.provision "shell", inline: script
end
Ответ №2:
Предположим, вы хотите настроить виртуальную машину vagrant в цикле, поскольку vagrantfile основан на языке ruby, поэтому вы можете подключить к vagrantfile возможности разработки, вот пример, вы можете добавить свою конфигурацию «—cpuset» в определение виртуальной машины.
# -*- mode: ruby -*-
# vi: set ft=ruby :
# read vm and chef configurations from JSON files
nodes_config = (JSON.parse(File.read("nodes.json")))['nodes']
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
nodes_config.each do |node|
node_name = node[0] # name of node
node_values = node[1] # content of node
# puts node_name
# puts node_values['box']
config.vm.define node_name do |config|
config.vm.box = node_values['box']
config.vm.hostname = node_name
config.vm.network :private_network, ip: node_values['ip']
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", node_values['memory']]
vb.customize ["modifyvm", :id, "--name", node_name]
end
end
end
nodes.json
чтобы определить виртуальную машину, вы можете определить
{
"nodes": {
"jenkins.example.com": {
"info": "jenkins master server",
"box": "../Vgrant-boxes/centos65_virtualbox_50G.box",
"ip": "192.168.35.101",
"ports": [],
"memory": 512
},
"node01.example.com": {
"info": "tomcat app host server",
"box": "../Vgrant-boxes/centos65_virtualbox_50G.box",
"ip": "192.168.35.121",
"ports": [],
"memory": 512
},
"node02.example.com": {
"info": "jboss app host server",
"box": "../Vgrant-boxes/centos65_virtualbox_50G.box",
"ip": "192.168.35.122",
"ports": [],
"memory": 512
},
"node03.example.com": {
"info": "oracle xe server",
"box": "../Vgrant-boxes/centos65_virtualbox_50G.box",
"ip": "192.168.35.123",
"ports": [],
"memory": 512
},
"node04.example.com": {
"info": "artifactory server",
"box": "../Vgrant-boxes/centos65_virtualbox_50G.box",
"ip": "192.168.35.124",
"ports": [],
"memory": 512
}
}
}
Комментарии:
1. Я думаю, что этот метод не работает для поставщика docker, поскольку аргументы, которые я должен передать, относятся к команде «docker run». Согласно документам Vagrant, эти аргументы передаются с помощью команды config.vm.provision, но я не уверен, как ее использовать.
2. @LuisCarlosJersak Может быть, вы можете сослаться на это , которое я использовал для предоставления рецептов шеф-повара.