DockerでWebサーバーを構築する

#1.Dockerで仮想環境を作成する方法
Dockerをインストールした後、アプリケーションの仮想環境を作成します。
方法は2つあります。

- Docker Hub からイメージをダウンロードする
- 自分でコンテナを作成して構築する

今回は、手始めに簡単にできるDocker Hubから作成済みのコンテナをダウンロードして環境を構築します。

#2.Docker Hubとは
[Docker Hub](https://hub.docker.com/)は、クラウド上に用意されているアプリケーションやサービス・コンテナの配布、公開などを行っています。
運営は、docker社が行っています。
(参考)http://docs.docker.jp/docker-hub/overview.html
サイトにアクセスするにはユーザー登録がいりますが、無償でも参加できます。
また、Docker Hubに登録されているアプリケーションを検索することができます。

#3.Docker HubからWebサーバーをダウンロードして構築する
今回は、Webサーバとしてapacheを使用します。

- dockerが起動していることを確認し、以下のコマンドを実行してダウンロードします。

```text
# docker pull httpd
```

実行例

```text
# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
afb6ec6fdc1c: Pull complete 
5a6b409207a3: Pull complete 
41e5e22239e2: Pull complete 
9829f70a6a6b: Pull complete 
3cd774fea202: Pull complete 
Digest: sha256:db9c3bca36edb5d961d70f83b13e65e552641e00a7eb80bf435cbe9912afcb1f
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
```

- ダウンロードされたことを確認します。

```text
# docker images
```

実行例

```text
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              d4e60c8eb27a        31 hours ago        166MB
centos              latest              470671670cac        4 months ago        237MB
hello-world         latest              fce289e99eb9        16 months ago       1.84kB
```

「httpd」 があることを確認します。

#4.Webサーバーを起動する。
先ほどダウンロードしたapacheを起動し、動作を確認します。

```text
# docker run -d -p 81:80 httpd
```
 docker コマンドの紹介は別途しますが、ここで意識するオプションは3つです。
　-d 　　→　コマンドをバックグラウンドで実行する
　-p （サーバーのポート):(コンテナのポート）　→　ポートの紐づけ 
　　　　　　　上記の例では、サーバー81番ポートと、コンテナ（httpd)80番ポートを紐づけます。
　　　　　　　つまり、コンテナのWebサーバにアクセスするときは、81番ポートに接続するということになります。
　httpd　実行するイメージ

```text
[root@dockerl ~]# docker run -d -p 81:80 httpd
b8fd34885a6c2828f10f4db4b0dc960688bea07818e9d1013d4da49e5e1e9a1b
```

実際に、ウェブブラウザでアクセスしてみます。
URLは以下になります。
http://(サーバのIPアドレス):81/

画面が出れば成功です。
ちなみに、私の環境では「It's Works!」というテキストだけの画面が出ました。

#5.Webサーバの停止
Dockerのコンテナを停止は以下のようにします。

- コンテナのコンテナIDを調べる
- コンテナIDを指定して停止させる

```text
# docker ps

# docker stop (コンテナID)
```

実行例

```text
# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                NAMES
b8fd34885a6c        httpd               "httpd-foreground"   6 minutes ago       Up 5 minutes        0.0.0.0:81->80/tcp   eager_noether
# docker stop b8fd34885a6c　　　　# stop の後には、docker psのCONTAINER IDを指定する。
b8fd34885a6c
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
#
```

docker stop の後のdocker ps でhttpd が消えていれ成功です。


#6.コンテナに独自の設定を行う
ダウンロードしたhttpdには、初期設定が入っています。
独自の設定をするにはローカルサーバー上に設定ファイルやコンテンツを保存し、コンテナにそこを参照させます。
その方法は、docekr run の -v オプションを使用します。

　-v  "(サーバーのパス):(コンテナに配置するパス)"　→ファイル、ディレクトリの紐づけ
　　　　　　ディレクトリ指定の場合は必ず最後に/ を入れてください。
　　　　　　/を入れない場合はファイルと認識されるようです。

例）ディレクトリを置き換える

```text
# docker run -d -p 81:80 -v "/tmp/httpdtest/:/usr/local/apache2/htdocs/" httpd
```

/tmp/httpdtest　にindex.html やコンテンツを保存したうえで上記を実行すると、保存したファイルが表示されます。
なお、-v オプション、-pオプションは1つのコマンドで複数選択できます。
例えばコンテンツが複数のディレクトリに分かれている。httpd.conf を変更したいといった場合、
複数のポートを使用している場合にも適用できます。



今回使ったオプションのまとめ

　-d 　　→　コマンドをバックグラウンドで実行する
　-p （サーバーのポート):(コンテナのポート）　→　ポートの紐づけ 
　　　　　　　上記の例では、サーバー81番ポートと、コンテナ（httpd)80番ポートを紐づけます。
　　　　　　　つまり、コンテナにWebサーバにアクセスするときは、81番ポートに接続するということになります。
　-v  "(サーバーのパス):(コンテナに配置するパス)"　→ファイル、ディレクトリの紐づけ
　　　　　　　パスはディレクトリ指定の場合は必ず最後に/ を入れてください。
　　　　　　　/を入れない場合はファイルと認識されるようです。
　httpd　実行するイメージ

#.7参考

dockerやdockerコマンドについての詳細は、下記を参照してください。
　　Docker ドキュメント日本語化プロジェクト　：　http://docs.docker.jp/index.html
　　Dockre Docs　：　https://docs.docker.com/

以上です。