stream浪者:使用stream浪者将docker运行parameter passing给多个容器

为了研究的目的,我使用vagrant部署了一个多VM环境,到目前为止是非常棒的。 但是现在我需要将每个docker容器固定到特定的CPU核心,但是我不知道如何使用stream浪汉来做到这一点。 我知道我可以使用Vagrantfile的“args”子句将“–cpuset”parameter passing给docker run命令,但是我不知道如何在循环中使用它,因为我启动了多个容器,我需要将每个容器固定到不同的CPU内核(例如,node1引脚到核心#0,节点2引脚到核心#1等)。

我目前的Vagrantfile如下,没有CPU钉住的事情:

# 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 

假设你想在循环中configurationvagrant vm,因为vagrantfile是基于ruby语言的,所以你可以把开发的可用性包含到vagrantfile中,这里是一个例子,你可以在你的configuration文件中添加“–cpuset”configurationVM定义。

 # -*- 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来定义vm,你可以定义你的

 { "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 } } } 

最后,我看错了地方。 添加“–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