DockerコンテナでApacheサーバーを立てる [初級編]

# まずはじめに
もし気に入っていただけたり、役に立ったらぜひ　”いいね！”　お待ちしております！
投稿のモチベーションに繋がります^^¥

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/45069dde-ab07-757c-f11b-7e6d7d0e9b83.png)

# この記事の目的
Dockerコンテナを利用してapacheサーバーを立てます。
localhostからアクセスし、apacheのトップ画面が表示されるところまで見ましょう。

# Dockerと従来の仮想化
そもそもサーバーの仮想化をご理解されている方には不要かもしれませんが、
一つの物理機を仮想化することで、以下のようなメリットをもたらします。

- ###コスト削減
    - サーバ物品調達コストが減らせる
    - スペースを節約できる
    - 電力コストを抑えられる

- ###運用性向上
    - サーバメンテナンスが楽になる
    - VM毎に役割をもたせることで可用性が高まる
    - OS以上でパッチ適用の切り戻しが楽になる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/b8f8d911-ce8a-7f18-3914-b0ac40dcbd6b.png)


## 仮想化の歴史

現在ではストレージ・ネットワークなどのほとんどのものが仮想化され、身近な技術として利用されてきています。
仮想マシン（VM）の歴史は古く、1972年にIBMがメインフレーム用にリリースしたSystem/370までさかのぼるるそうです。

2002年には仮想マシンのための専用OSが登場します。一般的にはハイパーバイザーと呼ばれるものです。

## ホスト型とハイパーバイザー型の仮想化
サーバーの仮想化は大きく、　”ホスト型” と "ハイパーバイザー型"に分けられます。

- ホスト型
    - OSに仮想化ソフトをインストールし、その上で仮想マシンを動かします。
    - 既存のサーバを使うことができるため、手軽に利用できる
    - ハードウェアにアクセスする際、ホストOSを経由することで余計なオーバーヘッドがかかり、十分な性能がでない
    - 代表的な製品：
        - VMware Palyer, VMWare Fusion, VirtualBox

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/819a13dd-70fc-d31e-1a7e-fe37f14a584d.png)


- ハイパーバイザー型
    - サーバーへ直接ハイパーバイザーをインストールし仮想マシンを可動させる方式
    - ホストOSを必要としないため、ハードウェアを直接制御することができる
    - 仮想マシンの速度低下を最小限に抑えることができる
    - 複数の仮想マシンを効率よく可動させるための機能がある
    - 代表的な製品
        - VMWare ESX-i, Microsoft Hyper-V

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/8f01a3a8-291c-d7da-7e0e-b93235d0e05a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/51b07835-774c-0f88-ebe6-bca1c166b7f2.png)



## コンテナ型
Dockerがまさにコレです。

- ホストOSのカーネルを直接利用するため、オーバーヘッドが少なく高速
- ゲストOSを含まないかつ、アプリケーション/ライブラリをパッケージングしているので、非常に少ないリソースで稼働できる
- ホストOSに直接アタッチしている反面、セキュリティ上リスクが高め

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/1e2fe0c3-bf61-6a47-b505-e548f48b1b47.png)


# Dockerを使っていこう
以前はdocker tools + virtualboxで仮想コンテナを立てていましたが、Docker for Macが登場し、
HyperKitの仮想環境上でdockerコンテナを動かすことができるようになりました。
Docker for MacはDocker公式からダウンロードしましょう。

>https://docs.docker.com/docker-for-mac/install/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/2779f14b-ed8d-c577-14b6-5e21cebd1cc9.png)

## DockerHubにログインする
してもしなくても大丈夫ですが、後にDockerイメージをリモートのDockerHubに上げることができます。
DockerHubアカウントをお持ちの方は、アカウント名とパスワードを入れることでローカル環境からDockerHubにアクセスできます。

```
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:'YOUR ACCOUNT NAME'
Password:'YOUR PASSWORD'
Login Succeeded
```

## dockerコンテナでubuntuを動かす

主な流れとしては、以下イメージです。

- dockerイメージの取得
- dockerイメージをもとにコンテナを作成
- コンテナの停止/起動を制御

## イメージの取得
```docker pull 'image名:オプション'``` でイメージを取得することが可能です。
```latest```を指定すると、最新versionのイメージが取得されます。

```
$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest
```

取得したイメージを確認するには、```docker images```を使用します。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              4c108a37151f        5 days ago          64.2MB 
```

## コンテナの作成
イメージをもとにコンテナを作成します。
```docekr run```をベースに必要なオプションを付帯させて作成します.
```-d```デーモンとしてバックグラウンド起動させます。
```--name```後ろに来る引数を名前としてつけることができます。
```-p```ポートフォワードとIPアドレスを指定します。

```
$ docker run -d --name test -p 127.0.0.1:10080:80 ubuntu:latest
2f618005774e6d6767e5cd2102785b9a5ec2795aeeb41beccb6d118c58d1f9ca
```

```docker ps -a```ですべてのdockerコンテナを確認します。
ちゃんと作成されていることがわかりました。

```
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
2f618005774e        ubuntu:latest       "/bin/bash"         7 seconds ago       Exited (0) 6 seconds ago                              test
```

## コンテナにapacheをインストールする
作成したばかりのdockerコンテナを```docker start 'コンテナID'```で起動させ、
```docker attach 'コンテナID'```でコンテナ内を操作しに行きます。
```service apache2 start```でapacheを起動させましょう。

```
$ docker start 2f618005774e
2f618005774e
$ docker attach 2f618005774e
root@97de19e4e9f4:/# apt-get update
root@97de19e4e9f4:/# apt-get install apache2 -y
root@97de19e4e9f4:~# service apache2 status
 * apache2 is not running
 * root@97de19e4e9f4:~# service apache2 start 
 * Starting Apache httpd web server apache2                                                                  AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
```

##  ローカルホストにアクセスする
ポートフォワードで指定した```127.0.0.1:10080```にアクセスすると、apacheの起動画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/cc87e914-1ec7-e02c-15b3-00316552b856.png)


# 最後に
如何でしたでしょうか。
Vagrant + VirtualBoxと比べてコンテナの作成 ~ 起動は秒単位で爆速なので、
作ってすぐ壊す開発環境などにも適していると思います。
至らない点もあるかと思いますが、ここまで読んでいただき、ありがとうございました。

次回はDockerfileを使ったIaC（Infrastructure as Code）でのコンテナ作成について書きたいと思います。