倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

32bit Windows マシンに Docker CE をインストールする

お恥ずかしながら未だに 32bit PC を使っておりまして、なんだかよく分からんけど流行ってる Docker をちょっと使ってみようと思ったらそもそもインストールすらできない状況で行き詰まって息詰まってたんですが、Vagrant (+VirtualBox) を使えば 32bit PC でも Docker を使えるようなので試してみました。

ただ、少し前なら Vagrant の Docker プロビジョニングで簡単に Docker が使えたようなんですが、Docker の方が Docker CE と Docker EE に分かれてしまったせいでこの方法が使えなくなったので、もう少しインストールに手間がかかります。

基本的には次の GitHub リポジトリ

にある方法でインストールするのですが、自分の環境では書いてある手順通りにしてもうまく動かなかったので、少し Vagrantfile を書き換えます。

【この記事の内容】

使用するツール

Vagrant + VirtualBox
まず Vagrant + VirtualBox で 32bit PC 上に 64bit 環境を作るのですが、Windows 10 では Vagrant 2.x 系が動かなかったので*1、ここでは Vagrant 1.x 系の(現時点での)最後のバージョンと、それに対応する VirturalBox のバージョンである

を使います。 それぞれ以下のサイトから Windowsインストーラーをダウンロードできます:

VirtualBox のインストールには PC の再起動が必要だったかと思いますが、インストールの詳細は各サイトを見てください。

Git for Windows
次に、GitHub リポジトリを clone するために、Git for Windows もインストールします。 Git for Windows

からダウンロードできます。 Vagrant のプロビジョニングには Bash を使いますが、この実行には Git for Windows に付属している Git Bash を使います(そのせいでちょっと手間が増えるのですが ^^;)。

Docker CE のインストール

GitHub リポジトリ redgeoff/docker-ce-vagrant の clone
Docker CE をインストールするための Vagrantfile やプロビジョニング用のシェルスクリプトは以下の GitHub リポジトリ

においてあるものを使います。 Git Bash を起動して適当なディレクトリでこのリポジトリを clone し、そのディレクトリへ移動します*2

$ git clone https://github.com/redgeoff/docker-ce-vagrant.git
$ cd docker-ce-vagrant

この GitHub リポジトリの README によると、あとは「vagrant up」すれば Docker CE がインストールされると書いてますが、自分の環境ではうまく動かなかったので少し修正を加えます。

Vagrantfile の修正
Vagrantfile を適当なエディタで開いて、以下の修正を行います。

まず指定されているボックスが現時点で動かないので、このボックス指定をコメントアウト(もしくは削除)して、不安定としてコメントアウトされているボックス指定 ubuntu/xenial64 のコメントを外します*3

  config.vm.box = "ubuntu/xenial64"
  # config.vm.box = "https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-vagrant.box"

次に、これは Git Bash が原因のようですが、プロビジョニングのシェルスクリプトから他のシェルスクリプトを呼び出すとコマンドを見つけられずに失敗するので、bootstrap.sh の呼び出しを以下のように書き換えます:

  # config.vm.provision :shell, path: "bootstrap.sh"
  config.vm.provision :shell, path: "ubuntu.sh"
  config.vm.provision :shell, path: "docker.sh"

bootstrap.sh は内部で単に ubuntu.sh, docker.sh を呼び出してるだけなので、実質的には何も変わってないんですけどね・・・ この修正後には bootstrap.sh は必要なくなるので削除してもかまいません。

最終的な Vagrantfile は(コメント行を省略すれば)以下のようになります:

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.network "private_network", ip: "192.168.50.11"

  config.vm.provider "virtualbox" do |v|
    v.memory = 1024

    v.customize [ "guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 1000 ]
  end

  config.vm.provision :shell, path: "ubuntu.sh"
  config.vm.provision :shell, path: "docker.sh"
end

VirtualBox の設定箇所はなくても動きましたが、一応そのままにしておきます。

vagrant up !
以上の修正を行うと Docker CE のインストールができるようになったので、Git Bash 上で「vagrant up」を実行します:

$ vagrant up

長い長い処理の後、インストールが成功していれば「vagrant ssh」で仮想マシンにログインして

$ vagrant ssh
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-112-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


*** System restart required ***
vagrant@ubuntu-xenial:~$

sudo docker version」を実行すると、インストールされた Docker CE のバージョンが表示されます:

vagrant@ubuntu-xenial:~$  sudo docker version
Client:
 Version:       17.12.1-ce
 API version:   1.35
 Go version:    go1.9.4
 Git commit:    7390fc6
 Built: Tue Feb 27 22:17:40 2018
 OS/Arch:       linux/amd64

Server:
 Engine:
  Version:      17.12.1-ce
  API version:  1.35 (minimum version 1.12)
  Go version:   go1.9.4
  Git commit:   7390fc6
  Built:        Tue Feb 27 22:16:13 2018
  OS/Arch:      linux/amd64
  Experimental: false

ボックス ubuntu/xenial64 の不安定さなのか、自分の実行環境のしょぼさのせいなのか、しばしば上記の手順でインストールするのに失敗する場合がありますが、「vagrant up」し直すとうまくいくこともよくあります。 ただし、VirtualBox仮想マシンが起動したままになっていることもあるので、「vagrant destroy --force」で仮想マシンを破棄*4しないとフリーズしたりするのでご注意を。

ボックスへのパッケージング

上記のプロビジョニングはかなりの時間を要するので、仮想マシンは破棄 (vagrant destroy) せずに停止 (vagrant suspend / vagrant halt) して使い回すのがいいと思いますが、別の仮想マシンで Docker CE を使いたい場合は Vagrant のボックスとしてパッケージングしておく方が楽だと思います。 ただ、仮想マシンの起動に失敗する頻度が妙に高いので、もう少し何らかの設定を追加しないといけないのかも知れません。

ボックスへのパッケージングとボックスの追加
上記の方法で Docker CE のインストールに成功したら、仮想マシンから「exit」でログアウトして

vagrant@ubuntu-xenial:~$ exit
logout
Connection to 127.0.0.1 closed.

vagrant package」で仮想マシンの設定をボックスとしてパッケージングします:

$ vagrant package
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: C:/Users/???/package.box

作業ディレクトリに package.box が生成されたら、これを新たなボックスとして Vagrant に追加します。 ここではボックス名を「docker-xenial」とします:

$ vagrant box add docker-xenial package.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'docker-xenial' (v0) for provider:
    box: Unpacking necessary files from: file://C:/Users/???/package.box
    box:
==> box: Successfully added box 'docker-xenial' (v0) for 'virtualbox'!

ちなみに、ローカル環境に存在しているボックスは「vagrant box list」で確認できます。

他環境からのボックスの使用
上記のように追加したボックスは、他の Vagrant 環境から以下のような Vagrantfile で使用できます:

Vagrant.configure("2") do |config|
  config.vm.box = "docker-xenial"
end

もちろん、他の設定を書くこともできます。 「vagrant up」で仮想マシンを起動するなどの使い方も全く同じです。

まとめ

32bit Windows マシンで Docker CE を使う方法を見てきましたが、正直言ってまだ Docker 自体をほぼ使っていないので、いろいろ不具合があるかも知れません。 とはいえ、32bit マシンでとりあえず Docker を試してみることができるので、今後あれこれイジっていきたいと思います。

ちなみに、この記事のインストール方法を試してから記事を書くまでに少々時間が空いたので、Vagrant の Docker CE プロビジョニングがどっかーに既に公開されているかも知れませんがあしからず。

Docker

Docker

*1:試したのは1~2ヶ月前なので、もしかしたら既に修正されてるかも?

*2:以下のコマンドの最初の「$」は入力不要。 念のため。

*3:他の ubuntu ベースのボックスで試すと、ubuntu/trusty64 ではインストールはされるけど後で書くボックスにまとめる方法がうまくいかない、hashicorp/precise64 では途中でメッセージがバグってやばい、という感じでした

*4:もしくは VirtualBoxGUI を立ち上げて、起動している仮想マシンを手動で停止・削除