Dockerを触ってみる

こんにちわ

[グローバルセンス株式会社](https://gb-sense.com)のskanehiraです。

最近気になっているDockerについて触ってみました。
仮想化技術の一つというのは分かっているが、VMとは何が違うのかが分かっていないので、
メリット・デメリットを知るというのが目的です。

# Dockerとは
DockerはVMと違ってOS上に仮想OSを作らず、
Linuxの一部を仮想化してその上にアプリケーションを動かす様です。

Dockerでは、コンテナと呼ばれる領域があり、
その領域内でアプリが動くそうです。
倉庫と同じイメージですね。

DockerとVMに違いを図で表すと以下になると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/7d9a20a7-35f3-36a5-e970-70548554b692.png)

OSほどディスク・CPU・メモリを要しないため、
起動が早く・動作も軽いので、仮想ではなくそのままOS上で動いている様な感触です。

また、Dokcer上で動いているので、
ローカルにアプリケーションの実態がないので環境汚染も怖くありません。
ここはVMと同じですねー

概要を掴んだどころで、実際触ってみましょう。

# Dockerのインストール

1.　ダウンロード
無料のCommunity Editionを使います。
[こちら](https://www.docker.com/community-edition)から自分のプラットフォームを選択してダウンロードします。

2.　インストール
Mac版ですと、実行ファイルをアプリケーションフォルダに移すだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/a67daee2-da1a-60a7-f228-9308ce8cfbd3.png)

3.　起動
appをそのまま実行するだけです。
実行後、バーにDockerのアイコンがありますので、そちらをクリックしてDocker is runnigになっていればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/d8644bce-a8a6-58cd-54a6-bdd4ade67f55.png)

# Dockerを使ってみる
今回は、あんまりDockerの仕組みを理解して無くてもとりあえず環境作りたいので、
[docker-compose](http://docs.docker.jp/compose/toc.html)を使います。

まずWordPressを使うのに本体とMySQLが必要らしいので、
yamlファイルにそれらを定義してます。

- yamlファイルの定義

```shell-session
MacBookPro:wordpress skanehira$ ll
total 8
-rw-r--r--  1 skanehira  staff  542  2 21 08:59 docker-compose.yaml
MacBookPro:wordpress skanehira$ cat docker-compose.yaml
version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "80:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
MacBookPro:wordpress skanehira$
```

- docker-composeでコンテナを起動

yamlファイルを作成したら、起動します。
初回はイメージのダウンロードが走りますので少し待ちます。

```shell-session
MacBookPro:wordpress skanehira$ docker-compose up -d
Creating network "wordpress_default" with the default driver
Creating volume "wordpress_db_data" with default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
4176fe04cefe: Pull complete
d1e86691d483: Pull complete
ffadeffb3eb4: Pull complete
6c2c640eac6b: Pull complete
cec6a6ff8ae8: Pull complete
af71dde5fa23: Pull complete
2546980014e4: Pull complete
a525a4f1d664: Pull complete
af610cdb4173: Pull complete
fe36edc2517a: Pull complete
Digest: sha256:4f9323cb4aeca062fd1a341b50c7721b9aef6bff3ded806dec0897323b8b7be8
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
8176e34d5d92: Pull complete
f6c81892adaa: Pull complete
c8125c73b868: Pull complete
5ef22f6299b6: Pull complete
8537460e9a8c: Pull complete
b837671b83f0: Pull complete
366ea9d8b411: Pull complete
c4dd539af472: Pull complete
445753fb3ee6: Pull complete
6811f6b5d500: Pull complete
2ca365cdc65d: Pull complete
c91023a57f04: Pull complete
dcf0735fda8a: Pull complete
6b23fdc3538b: Pull complete
2eed880b86fe: Pull complete
798b2e547e59: Pull complete
159be43511e4: Pull complete
b5605b08f665: Pull complete
20d8e9ec2764: Pull complete
Digest: sha256:841369e184ecfa3969adcad3648f8b96294197a489dfd802e61be5eee7d6ddde
Creating wordpress_db_1        ... done
Creating wordpress_db_1        ...
Creating wordpress_wordpress_1 ... done
MacBookPro:wordpress skanehira$
```

イメージの確認

```shell-session
MacBookPro:wordpress skanehira$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wordpress           latest              80a6fca6cc6a        2 days ago          407MB
mysql               5.7                 f0f3956a9dd8        3 days ago          409MB
MacBookPro:wordpress skanehira$
```

イメージダウンロード完了後、自動でアプリケーションを立ち上げてくれます。
立ち上がっているかどうか、プロセスを見てみます。
STATUSがUpになっているので問題なさそうです。

```shell-session
MacBookPro:wordpress skanehira$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
d445a1c84185        wordpress:latest    "docker-entrypoint.s…"   21 seconds ago      Up 19 seconds       0.0.0.0:80->80/tcp   wordpress_wordpress_1
650726ae1ca9        mysql:5.7           "docker-entrypoint.s…"   21 seconds ago      Up 20 seconds       3306/tcp             wordpress_db_1
MacBookPro:wordpress skanehira$
```

プロセスが立ち上がったらブラウザで実際WordPressにアクセスしてみます。
無事セットアップ画面にたどり着きました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/b110c108-e941-c24e-f1bf-880aad31727c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/ac45b7ba-f30f-5d9b-de81-99bb9840ea03.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/23ffef2e-7eaa-8e17-cf58-336a64fad8c1.png)

おおお、これが港で噂のWordPressか（小並感）
ぱっと見色々といじれそうで凄そう（小並感）

- アプリケーションを停止
立ち上げたアプリケーションを停止させるのもdocker-comopseを使って行います。

```shell-session
MacBookPro:wordpress skanehira$ docker-compose down
Stopping wordpress_wordpress_1 ... done
Stopping wordpress_db_1        ... done
Removing wordpress_wordpress_1 ... done
Removing wordpress_db_1        ... done
Removing network wordpress_default
MacBookPro:wordpress skanehira$
```

プロセスもちゃんとなくなっていますね。

```shell-session
MacBookPro:wordpress skanehira$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

# 最後に
今回はDockerの概念について調べたり理解したりして、
細かい使い方に関しては特に書いていませんが、どういったものかはおおよそ理解しました。

VMはOSの仮想化に対して
Dockerはアプリケーションの仮想化と言った方イメージし易いのかもしれませんね。

自分の場合はDockerを使うほどの事をしていないので、現時点での需要はなさそうだなぁと思いました。
とは言え、ある程度扱える様になったほうが作業効率が上がりそうなので、
今後は積極的に使っていこうと思います。