Vagrant + Docker で Oracle Linux 7.1のコンテナを使う

VagrantVirtualbox 上に Oracle Linux 7.1 を動作させ、その上で Oracle Linux 7.1 の Docker コンテナを動かしてみました。

前提の整理

今回作成した環境の構成は、以下のとおりです。

本記事は、VagrantCygwin はインストール済みの前提で記述します。特に、Cygwin インストール時の注意事項については、過去の記事を参照ください。

Vagrant に vbguest プラグインをインストールする

Docker コンテナの作成で Dokerfile を参照させる際、ホストOSとゲストOSの共有フォルダがあると便利です。
共有フォルダを作るには、Virtualbox の guest additions がゲストOSに適切にインストールされる必要があります。このために、Vagrant にゲストOSの guest additions を自動更新してくれるプラグインをインストールします。

$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.10.0)'!

これで、Vagrantfile があるフォルダが、ゲストOS上の /vagrant にマウントされる様になります。

ゲストOSをセットアップする

適当なフォルダを作成し、Vagrantfile を作成します。

$ cd ~/
$ mkdir dock
$ touch ~/dock/Vagrantfile
$ vi ~/dock/Vagrantfile

Vagrantfile の内容は以下のとおりです。

Vagrant.configure(2) do |config|

    # VM settings
    config.vm.define :dock, primary: true do |dock|
        dock.vm.box = "oraclelinux-7.1-x86_64"
    end

    # VM provider settings
    config.vm.provider "virtualbox" do |vb|
        vb.name = "dock"
        vb.cpus = "2"
        vb.memory = "4096"
    end
end

実際にDockerコンテナでアプリケーションを動かしたりする場合、ポートフォワーディングの設定などが必要になりますが、今回はただ動かすだけなので省略します。

ゲストOSを起動します。過去の記事に引き続き、terrywang さんが公開している Oracle Linux 7 の Base Box を利用させていただきます。

$ vagrant box add oraclelinux-7.1-x86_64 http://cloud.terry.im/vagrant/oraclelinux-7-x86_64.box
$ cd dock
$ vagrant up dock

ゲストOSの構築中に、guest additions の更新と再起動が行われます。
また、ssh でゲストOSが利用できるように、/.ssh ファイルの設定もしておきます。こちらは過去の記事の手順を参考にしてください。以降、"ssh dock-root" と打つことで、ゲストOSに root でアクセスできるものとします。

Provisioner(=Docker) をインストールし、Docker デーモンを起動する

ゲストOSに Oracle Linux を使っている場合、 yum のアドオンのリポジトリにアクセスできるように設定をおこなう必要があります。これをやっておかないと、ゲストOSに provisioner (=Docker) をインストールする際に、エラーになってしまいます。

ゲストOSで /etc/yum.repos.d/public-yum-ol7.repo を編集します。

$ ssh dock-root
[root@oraclelinux7:~]$ vim /etc/yum.repos.d/public-yum-ol7.repo

[ol7_addons] 配下の enabled の値を、1 (=有効)に変更します。

…
[ol7_addons]
name=Oracle Linux $releasever Add ons ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL7/addons/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1
…

続いて、Vagrantfile に provisioner の設定を追記します。

Vagrant.configure(2) do |config|

    # VM settings
    config.vm.define :dock, primary: true do |dock|
        dock.vm.box = "oraclelinux-7.1-x86_64"
    end

    # VM provider settings
    config.vm.provider "virtualbox" do |vb|
        vb.name = "dock"
        vb.cpus = "2"
        vb.memory = "4096"
    end

    # Provisioner settings
    config.vm.provision "docker"
end

最後に provisioner (=Docker) を起動します。

$ vagrant provision

以上の手順により、ゲストOSに Docker がインストールされ、Docker デーモンが起動します。

Docker イメージをビルドし、コンテナを起動する

いよいよ Docker コンテナを動作させてみます。

まず、ホストOSの Vagrantfile が配置されたフォルダに、Dockerfile という名前でファイルを作成し、以下の内容を記述しておきます。

FROM oraclelinux:latest
MAINTAINER Oracle Linux Product Team <ol-ovm-info_ww@oracle.com>
CMD ["/bin/bash"]

続いて Docker イメージをビルドします。

$ ssh dock-root
root@oraclelinux7:~# docker build -t charlier_shoe/hoge /vagrant

Oracle Linux の Docker イメージは、Docker Hub に公式のものがありますので、それを利用しています。

-t オプションは、ビルドされたイメージにつけるタグ名です。後で、コンテナを起動する際、このタグ名でイメージを指定します。
Dockerfile を配置したフォルダは、ゲストOSの /vagrant に共有フォルダとしてマウントされています。コマンドの最後の "/vagrant" は、Dockerfileの配置先を指定していますが、共有フォルダの設定のおかげで、先の Dockerfile がすでに配置された状態になっています。

続いて、以下のコマンドを実行します。

$ ssh dock-root
root@oraclelinux7:~# docker run -it -v /vagrant:/tmp/shared --name="hoge" charlier_shoe/hoge

上記では、ゲストOSに root でアクセスした後、Docker イメージのビルド、コンテナの起動が行うコマンドを実行しています。オプションの意味は以下のとおりです。

  • -i
    • 標準入力を開いたままにします(=対話モード)
  • -t
    • 擬似ターミナル割り当て(…?)
  • -v /vagrant:/tmp/shared
    • /tmp/shared をゲストOSの /vagrant との共有フォルダに設定します
  • --name="hoge"
    • コンテナの名前を指定します
  • charlier_shoe/hoge
    • イメージのタグの名前を指定しています。この文字列はビルド時につけた名前です。

無事にコンテナが起動すると、コンテナに root ユーザーでアクセスした状態になります。

[root@a76d0766aba6 /]# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
[root@a76d0766aba6 /]# ls /tmp/shared/
Dockerfile  Vagrantfile

/tmp/shared/ に、共有フォルダに配置したファイルがあるのがわかります。
アプリケーションサーバーをインストールしたいときなど、共有フォルダを使うとインストーラを転送する手間が省けて便利です。

exit コマンドを打つと、コンテナがシャットダウンします。

[root@a76d0766aba6 ~]# exit

run コマンドでは、新たにコンテナを作成しようとするため、既存のコンテナを起動するときは start コマンドを使います。

root@oraclelinux7:~# docker start hoge
hoge

起動中のコンテナに複数のターミナルからアクセスしたい場合、ゲストOSから、exec コマンドで bash を起動してやります。

root@oraclelinux7:~# docker exec -it hoge bash

コンテナの停止は stop コマンドです。

root@oraclelinux7:~# docker stop hoge
hoge

VagrantVirtualbox 上に Oracle Linux 7.1 を動作させ、その上で Oracle Linux 7.1 の Docker コンテナを動かす手順は、以上です。