Macにサーバと同じ環境を構築する 〜Docker編 １〜

# はじめに

[前々回のVagrant](http://qiita.com/segawa/items/e77985ed2c107505930e)、[前回のChef](http://qiita.com/segawa/items/1e23df98fbb54f70d467)に続いて、Docker で開発環境を構築してみます。
ただ、まだあまり理解できておらず、、、中途半端な記事になっております。

Dockerについて予備知識ゼロの人は[昨日の記事](http://qiita.com/segawa/items/980317e5ccb7f8747886)を読んでもらえると良いと思います。

# 1. インストール

Docker は Linux 上でのみ動作するため、Mac で Docker を利用するには Linux の仮想環境を用意する必要があります。

## インストール方法

### A. Docker Toolbox でインストール

Docker 社が提供している **Docker Toolbox** を利用すると、Linux の仮想環境構築に必要な VirtualBox、専用の Linux（**Boot2Docker**）、Docker のインストールまでを行ってくれます。

Mac への Docker Toolbox のインストール方法は下記のページに説明があります。OS X 10.8（Mountain Lion）以降に対応しているようです。
https://docs.docker.com/mac/step_one/

### B. 手動でインストール

すでに Linux の仮想環境がある場合は、ゲスト OS に Docker だけをインストールすればOKです。
手元に Vagrantで用意した CentOS 6 の環境がありますが、Docker が対応しているのは CentOS 7.x 以降のようなので、今回は Docker Toolbox でインストールしてみます。

## インストール作業

インストールは下記ページからインストーラをダウンロードし、後はそれにしたがってインストールを進めるだけです。
https://www.docker.com/docker-toolbox

VirtualBox が起動していると下記のような警告が出てインストールが進まないので、起動している VirtualBox の仮想環境はすべて停止しておいてください。

<img width="732" alt="スクリーンショット 2015-12-20 15.04.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/20940/b0267cfb-14ea-a0af-cdbd-36d4e123de46.png">

インストールが完了すると下記の状態となります。

<img width="732" alt="スクリーンショット 2015-12-20 15.14.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/20940/9cd8041f-6d8d-7de6-2504-5c7133e6d2f4.png">

左のアイコンはコマンドラインで Docker を起動、右は GUI ツールで起動します。
コマンドラインで起動してみると下記のような結果が表示されました。

<img width="590" alt="スクリーンショット 2015-12-20 15.29.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/20940/1cf5c07b-fdb9-ba0c-5726-3e5148cd1a65.png">

Docker Machine名 `default` で、IPアドレスは `192.168.99.100` で起動しています。

## 確認作業

インストールが正常に完了しているか確かめるため、下記のコマンドを実行します。

```console:確認
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b901d36b6f2f: Pull complete 
0a6ba66e537a: Pull complete 
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/userguide/
```

内容を読むと、まずローカルに `hello-world` イメージがあるかを探し、無かったので **Docker Hub** から 
`hello-world` イメージを取得し、それを元に新しいコンテナを作成していることがわかります。
Docker Hub は Docker イメージの Github のようなものです。公式のイメージ以外に、ユーザーが自分で作成したイメージを公開、取得できるサイトです。

インストールは以上です。

# 2. Docker のコマンド

**仮想サーバのリスト**

```
docker-machine ls
```

```console:例
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER   ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.9.1   
```

`default` という仮想環境が稼働してます。

**仮想サーバへSSHログイン**

```
docker-machine ssh
```

```console:例
$ docker-machine ssh default
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.9.1, build master : cef800b - Fri Nov 20 19:33:59 UTC 2015
Docker version 1.9.1, build a34a1d5
```

**稼働中のコンテナ一覧**

```
docker ps
```

```console:例
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
b415493bfc37        centos              "/bin/bash"         18 minutes ago      Exited (0) 18 minutes ago                          sample1
01ef9e3cac93        hello-world         "/hello"            About an hour ago   Exited (0) About an hour ago                       tender_fermi
```


**新しいコンテナの作成と起動**

```
docker run
```

**新しいコンテナの作成／削除**

```
docker create|rm
```

**コンテナの起動／停止／再起動**

```
docker start|stop|restart
```

**Docker のバージョン**

```
docker version
```

**仮想環境の情報**

```
docker info
```

その他の docker コマンドは下記で確認可能です。

```
docker -h
```

# 3. Docker イメージを探す

最初なので Web 上に公開されている Docker イメージを使ってみます。

## Docker イメージを調べる

[Docker Hub](https://hub.docker.com/) で公式の Docker イメージを見てみましょう。

**Apache**

https://hub.docker.com/_/httpd/

**PHP**

https://hub.docker.com/_/php/

**MySQL**

https://hub.docker.com/_/mysql/

## コマンドで調べる

コマンドで調べることもできます。

```console:イメージの検索
$ docker search httpd
```


# 4. 環境を構築する

それでは開発環境を構築してみましょう。

Docker Hub から公式のイメージを取得しますが、PHP と Apache がセットになったものがあるので、そちら使用します。

```console:イメージの取得
$ docker pull php:5.6.16-apache
```

取得済みのイメージは下記のコマンドで確認可能です。

```console:取得済みイメージのリスト
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
php                 5.6.16-apache       cb016a201e95        9 days ago          480.5 MB
```

では、このイメージを元にコンテナを起動してみます。

```console:コンテナの起動
$ docker run -d -p 80:80 -v /home/sample:/var/www/html php:5.6.16-apache 
2ef3f68868ea4e6363bea92d51b83b10b4c1f3352f73097dcbb853666a740d3b
```

**オプションの説明**
`-d` : コンテナをバックグラウンドで稼働する
`-p` : コンテナのポートをホストに結びつける
`-v` : ボリュームをマウントする（ローカルのディレクトリを仮想サーバのディレクトリに同期する）


Vagrant のようにローカルのディレクトリを仮想サーバのディレクトリに同期することができます。
`-v` で指定したローカル側のディレクトリ `/home/sample` に `index.php` を置いて、下記のURLにアクセスしてみます。

http://192.168.99.100/index.php

作成した index.php が表示されると思います。

今回はここまで。