今更MacでDockerを使ってみた

Sun, Jun 21, 2015 2-minute read

今更ですが、MacでDockerの環境を整えて使ってみました。
今まで難しそうなイメージで避けてきましたが、そろそろ手を出しておかないと本気でまずいと思い今回使ってみましたが、思ったよりも簡単に使えました。

Dockerとは

Docker(ドッカー)はソフトウェアコンテナ内のアプリケーションのデプロイメントを自動化するオープンソースソフトウェアである。

LinuxカーネルにおけるLXCと呼ばれるLinuxコンテナ技術とAufsという特殊なファイルシステムを利用してコンテナ型の仮想化を行う。VMware製品などの完全仮想化を行うハイパーバイザー型製品と比べて、ディスク使用量は少なく、インスタンス作成やインスタンス起動は速く、性能劣化がほとんどないという利点を持つ。dockerfileと呼ばれる設定ファイルからコンテナイメージファイルを作成可能という特性を持つ。一方で、コンテナOSとしてはホストOSと同じLinuxカーネルしか動作しない。

Docker - Wikipedia

MacでDockerを使うには

MacでDockerを使うには、VirtualBox、boot2docker、Dockerをインストールする必要があります。今回は全てHomebrewからインストールしました。

Homebrewのインストール方法、使い方はこちらを参照してください。
MacにHomebrewをインストールしてパッケージを管理をする

VirtualBoxでなくても仮想化ソフトなら問題ないと思います。

MacではVirtualBoxなどの仮想化ソフトでboot2docker(Dockerサーバ)の仮想環境を構築し、ローカルからDockerサーバを操作し Dockerコンテナを実行しているみたいです。

VirtualBoxのインストール

まずはVirtualBoxからインストールします。

$ brew cask install virtualbox

Docker、boot2dockerをインストール

次にDockerとboot2dockerをインストールします。

$ brew install docker boot2docker

インストールをしたらboot2dockerの初期化の為に下記コマンドを実行します。

$ boot2docker init

初期化後、boot2dockerを起動します。

$ boot2docker up

boot2dockerを起動すると、To connect the Docker client to the Docker daemon, please set:とメッセージが表示されるので、表示された通りに環境変数を設定します。
今回は.zshrcに設定しました。

$ cat<<'EOS'>~/.zshrc
> # boot2docker
> export DOCKER_HOST=tcp://192.168.59.103:2376
> export DOCKER_CERT_PATH=/Users/username/.boot2docker/certs/boot2docker-vm
> export DOCKER_TLS_VERIFY=1
> EOS
$ source ~/.zshrc

ここまで完了したらdockerコマンドが正常に動作するか下記コマンドで確認します。

$ docker version
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 7c8fca2
OS/Arch (client): darwin/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): 7c8fca2
OS/Arch (server): linux/amd64

私の環境ではこのように表示されました。
これでインストールは完了です。

コンテナの操作

dockerコマンドでコンテナを操作します。
個人的にCentOSを使うことが多いので、ここではCentOS 6を例にしたいと思います。

まずCentOSのイメージファイルを取得します。

$ docker pull centos:centos6

取得したイメージファイルは下記コマンドで確認できます。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos6             b9aeeaeb5e17        8 weeks ago         202.6 MB

取得したイメージファイルをdocer runコマンドでコンテナとして起動します。

$ docker run -i -t --name centos centos:centos6 /bin/bash

ここでは -name オプションでコンテナ名をcentosとして起動しています。コンテナ名をつけるとコンテナ操作時にコンテナ名で操作できるようになります。
また、上記コマンド実行後は起動したコンテナに接続した状態になります。

コンテナを確認するには、次のコマンドを実行します。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9da3dd45d0d5        centos:centos6      "/bin/bash"         2 minutes ago       Up 2 minutes                            centos

起動しているコンテナを停止するには次のコマンドを実行します。

$ docker stop centos

centosはdocker run時に-nameで指定したコンテナ名です。コンテナ名を指定していない場合は、docker ps -aコマンドで表示されるCONTAINER IDで指定します。

一度停止したコンテナを再起動するにはdocker startコマンドを実行します。

$ docker start centos

コンテナに再接続するには次のコマンドを実行します。

$ docker attach centos

コンテナにApacheをインストールしてブラウザで表示

コンテナに接続している状態でApacheをインストールします。

# yum update
# yum install httpd
# chkconfig httpd on
# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4 for ServerName
[  OK  ]

コンテナはコミットすると、現在のコンテナの状態をイメージファイルを保存できます。

$ docker commit centos docker/centos

このコミットしたイメージファイルを起動すると、Apacheがインストールされた状態のコンテナが起動されます。

$ docker run -i -t -d -p 80:80 --name centos docker/centos /sbin/init

-d オプションを指定すると、SSHでログインせずにバックグラウンドで起動されます。
-p オプションでホスト(boot2docker)とコンテナをポートマッピングを指定します。ポートマッピングを指定することで、boot2dockerの80番ポートにアクセスするとコンテナの80ポートにアクセスできるようになります。

ポートマッピングを指定してコンテンを起動したら、boot2dockerのipを確認します。

$ boot2docker ip

表示されたipにブラウザからアクセスすると、ApacheのTest Pageが表示されると思います。

以上、Dockerのインストールから基本的な使い方でした。

その他

まだ試していませんが、DockerではDockerfileを作成してdocker buildコマンドを使えば、自動で環境を構築できるらしいです。自動で環境を構築してくれるのは非常にありがたいです。これは試してみて改めて記事として書きたいと思います。

また、テスト環境としてDockerを使うのはイメージしやすいのですが、開発環境として使うにはもう少し色々とやらないといけないんじゃないかと思っています。ちらっと調べてみたら、VagrantとDockerを使えば、ローカルのソースとコンテナのソースを同期できるみたいなので、こちらの後で試してみたいと思います。

かなり話題になっていたDockerですが、手を出すのが遅すぎました。話題の技術はどんどん習得していかねばと思う今日このごろです。