Windows版のDocker Engineのリスト

Microsoftのドキュメント「Windows Containers on Windows Server」の手順では、OneGetを利用してDocker Engineを取得する。 OneGetを実行すると、Azure StorageからDocker Engineの実行バイナリを取得するようだ。 直接以下のAPIを実行すると、配置されているDocker Engineの一覧を取得することができる。

http://dockermsft.blob.core.windows.net/dockercontainer?resType=container&comp=list

執筆時点でのAPIの実行結果(自分で整形)は以下。 JSON形式では返せない模様。

<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults ContainerName="http://dockermsft.blob.core.windows.net/dockercontainer">
  <Blobs>
    <Blob>
      <Name>DockerMsftIndex.json</Name>
      <Url>http://dockermsft.blob.core.windows.net/dockercontainer/DockerMsftIndex.json</Url>
      <Properties>
        <Last-Modified>Wed, 05 Apr 2017 22:38:24 GMT</Last-Modified>
        <Etag>0x8D47C74784ED01A</Etag>
        <Content-Length>5032</Content-Length>
        <Content-Type>application/octet-stream</Content-Type>
        <Content-Encoding/>
        <Content-Language/>
        <Content-MD5>TAIVvNh/G6LpvBFeeohrWA==</Content-MD5>
        <Cache-Control/>
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
      </Properties>
    </Blob>
    <Blob>
      <Name>docker-1-12-1-cs1.zip</Name>
      <Url>http://dockermsft.blob.core.windows.net/dockercontainer/docker-1-12-1-cs1.zip</Url>
      <Properties>
        <Last-Modified>Thu, 02 Mar 2017 19:33:49 GMT</Last-Modified>
        <Etag>0x8D461A30D591EF4</Etag>
        <Content-Length>13838077</Content-Length>
        <Content-Type>application/octet-stream</Content-Type>
        <Content-Encoding/>
        <Content-Language/>
        <Content-MD5>PzDfmGUp5SqfRVy2/hofog==</Content-MD5>
        <Cache-Control/>
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
      </Properties>
    </Blob>
    <Blob>
      <Name>docker-1-12-2-cs1.zip</Name>
      <Url>http://dockermsft.blob.core.windows.net/dockercontainer/docker-1-12-2-cs1.zip</Url>
      <Properties>
        <Last-Modified>Thu, 02 Mar 2017 19:43:54 GMT</Last-Modified>
        <Etag>0x8D461A475DDC980</Etag>
        <Content-Length>13863262</Content-Length>
        <Content-Type>application/octet-stream</Content-Type>
        <Content-Encoding/>
        <Content-Language/>
        <Content-MD5>p6z/SiiR7R17iABzuNDMxg==</Content-MD5>
        <Cache-Control/>
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
      </Properties>
    </Blob>
    <Blob>
      <Name>docker-1-12-2-cs2-ws-beta.zip</Name>
      <Url>http://dockermsft.blob.core.windows.net/dockercontainer/docker-1-12-2-cs2-ws-beta.zip</Url>
      <Properties>
        <Last-Modified>Wed, 12 Oct 2016 23:48:15 GMT</Last-Modified>
        <Etag>0x8D3F2FA3C4E334E</Etag>
        <Content-Length>14183015</Content-Length>
        <Content-Type>application/octet-stream</Content-Type>
        <Content-Encoding/>
        <Content-Language/>
        <Content-MD5>2b14ZgGoGyBVrtkzwtd34w==</Content-MD5>
        <Cache-Control/>
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
      </Properties>
    </Blob>
    <Blob>
      <Name>docker-1-13-0-rc3.zip</Name>
      <Url>http://dockermsft.blob.core.windows.net/dockercontainer/docker-1-13-0-rc3.zip</Url>
      <Properties>
        <Last-Modified>Thu, 02 Mar 2017 19:47:12 GMT</Last-Modified>
        <Etag>0x8D461A4EBCFFD99</Etag>
        <Content-Length>13911681</Content-Length>
        <Content-Type>application/octet-stream</Content-Type>
        <Content-Encoding/>
        <Content-Language/>
        <Content-MD5>+OR6vKBZbU0aAzjme/hBtw==</Content-MD5>
        <Cache-Control/>
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
      </Properties>
    </Blob>
    <Blob>
      <Name>docker-1-13-0-rc4.zip</Name>
      <Url>http://dockermsft.blob.core.windows.net/dockercontainer/docker-1-13-0-rc4.zip</Url>
      <Properties>
        <Last-Modified>Thu, 02 Mar 2017 19:50:29 GMT</Last-Modified>
        <Etag>0x8D461A56102B607</Etag>
        <Content-Length>13934374</Content-Length>
        <Content-Type>application/octet-stream</Content-Type>
        <Content-Encoding/>
        <Content-Language/>
        <Content-MD5>8iZy1ZG44wwnF11+KOThIA==</Content-MD5>
        <Cache-Control/>
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
      </Properties>
    </Blob>
    <Blob>
      <Name>docker-1-13-1.zip</Name>
      <Url>http://dockermsft.blob.core.windows.net/dockercontainer/docker-1-13-1.zip</Url>
      <Properties>
        <Last-Modified>Fri, 10 Feb 2017 02:51:11 GMT</Last-Modified>
        <Etag>0x8D4515FABC5013F</Etag>
        <Content-Length>14025912</Content-Length>
        <Content-Type>application/octet-stream</Content-Type>
        <Content-Encoding/>
        <Content-Language/>
        <Content-MD5>dkVeRNm5LvDycVg7M2ucWw==</Content-MD5>
        <Cache-Control/>
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
      </Properties>
    </Blob>
    <Blob>
      <Name>docker-17-03-0-ee.zip</Name>
      <Url>http://dockermsft.blob.core.windows.net/dockercontainer/docker-17-03-0-ee.zip</Url>
      <Properties>
        <Last-Modified>Thu, 02 Mar 2017 19:03:54 GMT</Last-Modified>
        <Etag>0x8D4619EDF782BE1</Etag>
        <Content-Length>14027010</Content-Length>
        <Content-Type>application/octet-stream</Content-Type>
        <Content-Encoding/>
        <Content-Language/>
        <Content-MD5>U8846AI0qZef+mg8PbhxhA==</Content-MD5>
        <Cache-Control/>
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
      </Properties>
    </Blob>
    <Blob>
      <Name>docker-17-03-1-ee.zip</Name>
      <Url>http://dockermsft.blob.core.windows.net/dockercontainer/docker-17-03-1-ee.zip</Url>
      <Properties>
        <Last-Modified>Wed, 05 Apr 2017 22:34:08 GMT</Last-Modified>
        <Etag>0x8D47C73DFDE700A</Etag>
        <Content-Length>14029894</Content-Length>
        <Content-Type>application/octet-stream</Content-Type>
        <Content-Encoding/>
        <Content-Language/>
        <Content-MD5>OJHI8eUJ9OR0oxEktszJJQ==</Content-MD5>
        <Cache-Control/>
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
      </Properties>
    </Blob>
  </Blobs>
  <NextMarker/>
</EnumerationResults>

参考

Blob Service REST API - List Containers

JSONの整形

はじめに

LinuxでのJSONの整形方法をメモ。

コマンドjqを利用

$ cat in.json | jq

Ubuntuでjqをインストールする場合は以下。

$ sudo apt-get install jq

CentOSでjqをインストールする場合は以下。

$ sudo yum install jq

Pythonのモジュールを利用

$ cat in.json | python -m json.tool

etcdでよく利用するAPI

はじめに

自分がよく利用するetcdのAPIをメモしておく。

キーの値を取得

キーがfoo/barの場合。

curl http://localhost:2379/v2/keys/foo/bar

キーの値を再帰的に取得

キーがfoo/barの場合。

curl http://localhost:2379/v2/keys/foo/bar/?recursive=true

Vagrantを利用して同じ環境のVMを複数作成

以下のようにループを利用して必要な台数分の定義を生成するVagrantfileを準備すればよい。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  MAX_VM_COUNT = 3
  
  (0 ... MAX_VM_COUNT).each do |counter|
    config.vm.define "node#{counter}" do |server|
      server.vm.box = "willyhu/ubuntu-16.04-server-amd64"
      server.vm.network "private_network", ip: "192.168.10.#{counter+100}", netmask: "255.255.255.0"
    end
  end
end

ここでは、node0 〜 node2の3台のVMを作成し、それぞれにIPアドレス192.168.10.100 〜 192.168.10.102を割り当てている。

Ubuntu 16.04で最新のAnsibleをインストール

Ubuntu 16.04の標準のリポジトリからapt-getで取得できるAnsibleは若干古い。 最新版をインストールするには、PPAのAnsibleのリポジトリを追加してapt-getすればよい。

$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible

参考

Ansible Document - Instllation

Ubuntu 16.04でのVagrant + libvirtの環境構築

はじめに

Ubuntu 16.04でのVagrant + libvirtの環境構築に苦労したので、手順を残しておく。 VagrantKVMを扱えるようにするには、vagrant-libvirtというサードパーティ製のプラグインが必要になる。

以下の手順は、KVMの環境は構築済みであることが前提。

Vagrantインストール

$ sudo apt-get install vagrant

apt-getでインストールされるVagrantは1.8.1と若干古い(現時点での最新は1.9.1)が、後述のvagrant-libvirtのインストールに影響があるかもしれないので、これを利用する。

vagrant-libvirtのインストールの事前準備

/etc/apt/sources.listのdeb-srcのコメントアウトを外しておく。 コメントアウトを外しておかないと、後述のapt-get build-depの実行に失敗する。

$ sudo sed -i 's/^# deb-src/deb-src/g' /etc/apt/sources.list
$ sudo apt-get update

また、Vagrant 1.8.1にはプラグインのインストールに失敗するバグがあるため、(正式な対処ではないが)以下のように修正する。

$ sudo sed -i'' "s/Specification.all = nil/Specification.reset/" /usr/lib/ruby/vendor_ruby/vagrant/bundler.rb

vagrant-libvirtのインストール

まず、必要な依存物のインストールなどを行う。

$ sudo apt-get build-dep vagrant ruby-libvirt
$ sudo apt-get install qemu libvirt-bin ebtables dnsmasq
$ sudo apt-get install libxslt-dev libxml2-dev libvirt-dev zlib1g-dev ruby-dev

そして、vagrant-libvirtのインストールを行う。

$ vagrant plugin install vagrant-libvirt

動作確認

boxのホスティングサイトのAtlasから適当なboxを選ぶ。 数は少ないが、キーワード「libvirt」で検索すると、いくつかヒットする。 ここでは、willyhu/ubuntu-16.04-server-amd64を利用することにする。

適当にvagrant-testという作業ディレクトリを作成し、そのディレクトリの中で以下のようにboxを起動する。

$ mkdir vagrant-test
$ cd vagrant-test
$ vagrant init willyhu/ubuntu-16.04-server-amd64
$ vagrant up --provider libvirt

起動後、Vagrant経由でSSHでログインできれば成功。

$ vagrant ssh

参考

vagrant-libのREADME.md

https://github.com/vagrant-libvirt/vagrant-libvirt

Vagrantのバグで出力されるエラー

$ vagrant plugin install vagrant-libvirt
Installing the 'vagrant-libvirt' plugin. This can take a few minutes...
/usr/lib/ruby/2.3.0/rubygems/specification.rb:946:in `all=': undefined method `group_by' for nil:NilClass (NoMethodError)
        from /usr/lib/ruby/vendor_ruby/vagrant/bundler.rb:275:in `with_isolated_gem'
        from /usr/lib/ruby/vendor_ruby/vagrant/bundler.rb:231:in `internal_install'
        from /usr/lib/ruby/vendor_ruby/vagrant/bundler.rb:102:in `install'
        from /usr/lib/ruby/vendor_ruby/vagrant/plugin/manager.rb:62:in `block in install_plugin'
        from /usr/lib/ruby/vendor_ruby/vagrant/plugin/manager.rb:72:in `install_plugin'
        from /usr/share/vagrant/plugins/commands/plugin/action/install_gem.rb:37:in `call'
        from /usr/lib/ruby/vendor_ruby/vagrant/action/warden.rb:34:in `call'
        from /usr/lib/ruby/vendor_ruby/vagrant/action/builder.rb:116:in `call'
        from /usr/lib/ruby/vendor_ruby/vagrant/action/runner.rb:66:in `block in run'
        from /usr/lib/ruby/vendor_ruby/vagrant/util/busy.rb:19:in `busy'
        from /usr/lib/ruby/vendor_ruby/vagrant/action/runner.rb:66:in `run'
        from /usr/share/vagrant/plugins/commands/plugin/command/base.rb:14:in `action'
        from /usr/share/vagrant/plugins/commands/plugin/command/install.rb:32:in `block in execute'
        from /usr/share/vagrant/plugins/commands/plugin/command/install.rb:31:in `each'
        from /usr/share/vagrant/plugins/commands/plugin/command/install.rb:31:in `execute'
        from /usr/share/vagrant/plugins/commands/plugin/command/root.rb:56:in `execute'
        from /usr/lib/ruby/vendor_ruby/vagrant/cli.rb:42:in `execute'
        from /usr/lib/ruby/vendor_ruby/vagrant/environment.rb:268:in `cli'
        from /usr/bin/vagrant:173:in `<main>'

プラグインインストール不可のバグの報告

https://github.com/mitchellh/vagrant/issues/6911

プラグインインストール不可のバグの対処法など

http://stackoverflow.com/questions/36811863/cant-install-vagrant-plugins-in-ubuntu-16-04

Ubuntu 16.04でのKVM環境の構築

事前準備

CPUがハードウェア仮想化をサポートしているか検査。 以下のコマンドを実行した結果、1以上が表示されればOK。

$ egrep -c '(vmx|svm)' /proc/cpuinfo

KVM

$ sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

virt-manager

$ sudo apt-get install virt-manager

参考

Community Help Wiki - KVM/Installation