Windows上のVMWareでCoreOS、Dockerを動かす

WindowsでDockerを動かすにはVagrant + VirtualBoxを使った方法が一般的なようですが、私は普段はVMWareを利用していて、その環境にVirtualBoxを同時にインストールして競合してしまいハマった経験があるので、VMWareとCoreOSを使ったシンプルな環境を構築した際のメモです。

最終的なゴールは、
Windows上のVMWareにCoreOSを導入し、Dockerfileを使用してPostgreSQLの動作するコンテナを作成、起動し、クライアント(pgAdminまたはアプリ)からアクセすることです。

準備

  • Windows7 64bit
  • VMWare または VMPlayer(どちらでも動作を確認できました)
  • msysGitなどsshクライアントを使用できるもの


VMWare、msysGitのインストール方法や使い方には触れませんので各自お調べください。

CoreOSのセットアップ

CoreOSはVMWare用のイメージがあるので、これをダウンロードしてきます。
https://coreos.com/にアクセスして、画面左側の「Lastest Release Info」をクリックします。


今回はStable版を使用するので、StableのBrowse Imageをクリックします。


ファイルの一覧が表示されるので、その中からcoreos_production_vmware_insecure.zipをダウンロードします。


適当なフォルダに展開し、coreos_production_vmware_insecure.vmxを起動すると数十秒で起動でログイン画面が表示されます。(デバイス構成の変更は適宜してください)


※以降はsshクライアントから操作します。


画面に表示されているIPアドレスを確認して、coreos_production_vmware_insecure.vmxが存在するディレクトリに鍵ファイルがあるので、これを使ってsshクライアントから接続します。

win7@ $ ssh -i insecure_ssh_key core@IPアドレス

CoreOSには既にDockerがインストールされているのでバージョンを確認してみます。

core@$ docker version
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.2
Git commit (client): 990021a
Server version: 1.0.1
Server API version: 1.12
Go version (server): go1.2
Git commit (server): 990021a

PostgreSQLコンテナの作成

今回はPostgreSQLが動作するコンテナを作成します。なぜPostgreSQLなのかというと、Golang Cafe #41PostgreSQLの環境が欲しかったというだけです。


Dockerizing a PostgreSQL serviceを参考にしながらコンテナを作成していきます。
まずCoreOS上でDockerfileの配置場所を作成します。

core@ $ mkdir postgresql
core@$ cd postgresql/

そのままCoreOS上でDockerfileを作成してもよいのですが、CoreOSに接続した状態では私のmsysGitのvimが正常に動作しないので、ホスト(Windows7)上で作成してコピーします。

win7@ $ scp -i insecure_ssh_key ./postgresql.Dockerfile core@IPアドレス:postgresql/Dockerfile

Dockerfileの中身はリンク先を参照してください。Dockerfileの中身についても今回は触れません。


再度CoreOSに接続してイメージをビルドします。

core@ $ mkdir postgresql
core@ $ cd postgresql/
core@ $ ls 
Dockerfile

core@ $ sudo docker build -t eg_postgresql .

しばらく時間がかかりますが、イメージが作成されます。

core@ $ dokcer images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
eg_postgresql       latest              45b811be258a        52 minutes ago      366.7 MB
ubuntu              trusty              ba5877dc9bec        2 weeks ago         192.7 MB
ubuntu              latest              ba5877dc9bec        2 weeks ago         192.7 MB
ubuntu              14.04               ba5877dc9bec        2 weeks ago         192.7 MB
ubuntu              12.04               b9e56c8f2cf5        2 weeks ago         103.8 MB
ubuntu              precise             b9e56c8f2cf5        2 weeks ago         103.8 MB
ubuntu              utopic              6ef6f1a66de1        2 weeks ago         194.1 MB
.....


作成したイメージからコンテナを起動します。デーモンとして動作させ、コンテナ上のポートを公開させるために-d、-Pオプションを使います。

core@ $ sudo docker run -d -P --name pg_test eg_postgresql

外部からコンテナ上のPostgreSQLにアクセスするためのポートを確認します。

core@ $ docker ps
CONTAINER ID   IMAGE                  COMMAND                CREATED          STATUS         PORTS                    NAMES
c33476aa6397   eg_postgresql:latest   /usr/lib/postgresql/   12 seconds ago   Up 9 seconds   0.0.0.0:49153->5432/tcp  pg_test

pgAdmin等で接続を確認します。

無事に接続も確認できたのでこれで目標は達成です。


起動中のコンテナを停止します。

core@ $ docker stop pg_test

CoreOSの終了時は普通のlinuxと同じく

core@ $ sudo shutdown -h now

で数秒で終了します。


Dockerについての詳しい内容は適宜調べていただくか、下記のような書籍を参考にされるといいと思います。

まとめ

以前Golang Cafe #26〜でDockerのソースコードの一部は読みましたが、実際に試してみることはありませんでした。更にはちょっと怖いようなイメージもありました。
しかし、以前ソースコードを読んでいたせいか、触り始めるとほとんど抵抗はなくなりました。これもGolang Cafeの成果ですね。でもまだ若干ブラックボックスを触っている感じがあります。