動かしながら Docker を理解しよう


## 対象

以下のような方向けです

- Docker をまだ触ったことがない初心者の方
- 細かいことはいいから、とにかく手を動かしながら Docker を理解していきたい方
- Docker や Docker Compose を使ったことはあるが、あまり理解できていない方

## 環境

docker コマンドを実行できる環境は整っているものとします

環境構築がまだの方は「[Docker の動作環境をコマンド一発で立ち上げる](https://qiita.com/lmatsul/items/7c9c325a5726ec43df9c)**(※1)**」を参考に環境構築をお願いします

## まずはじめに

Docker の動作する環境にてターミナルなどを立ち上げて進めてください

なるべくコピペはせず、自身でコマンドを入力しながら進めてもらえるとより理解が深まるかと思います

```sh
# docker と実行してみて、コマンドの一覧を見てみます
$ docker
```

## Docker Hub から Image を取得してみる

Image とは、Dockerコンテナを作成する際に必要となるファイルシステムのことです

```sh
# Nginx の Image を取得してみます
$ docker pull nginx

# 取得できたら Image の一覧を確認してみます
$ docker images

# 指定バージョンでの取得をしてみます
$ docker pull nginx:1.16

# 取得できたら Image の一覧を確認してみます
$ docker images
# 1.16 と latest の Nginx イメージが取得されていることが確認できるかと思います

# 1.16 のイメージを削除してみます
$ docker rmi nginx:1.16

# Image の一覧を確認してみると、1.16 の Nginx イメージが削除されていることが確認できるかと思います
$ docker images
```

## コンテナを作成して起動してみる

```sh
# Nginx の Image からコンテナを作成してみます
#  --name コンテナの名前を指定
#  -p コンテナのポート80を8080として公開
$ docker create --name nginx_container -p 8080:80 nginx

# コンテナの一覧を確認してみます
#  -a 停止しているコンテナを含む全てのコンテナを表示する
$ docker ps -a

# 作成したコンテナを起動してみます
$ docker start nginx_container

# ブラウザからアクセスして Nginx の起動を確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080 へアクセスすることで確認できます

# 起動しているコンテナの一覧を確認してみます
$ docker ps

# 次に Apache の Image 取得、コンテナを作成、コンテナの起動を 1コマンドで実行してみます
#  -p 80ポートを8081として公開
#  -d バックグラウンドで実行
$ docker run -p 8081:80 -d httpd

# ブラウザからアクセスして Apache の起動を確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8081 へアクセスすることで確認できます

# コンテナの一覧を確認してみます
$ docker ps -a
# コンテナの名前を指定せず docker run を実行した影響で、
# コンテナの名前（NAMES）に適当な名前が割り振られていることが確認できるかと思います

# Image の一覧を確認してみます
$ docker images
# httpd イメージが増えていることが確認できるかと思います

# 起動した httpd の コンテナID または コンテナ名 を指定してコンテナを停止してみます
$ docker stop [CONTAINER ID または NAME]

# もう一度、今度はコンテナの名前を指定して Apache を docker run してみます
#  --name コンテナの名前を指定
$ docker run --name httpd_container -p 8081:80 -d httpd

# コンテナの一覧を確認してみると、httpd のコンテナが2つに増えていることが確認できるかと思います
# ※docker run は毎回、Imageの取得（ローカルにまだ無ければ）、コンテナの作成、コンテナの起動を行うので注意が必要です
# ※既に存在するコンテナであれば、docker start で起動するようにしましょう
$ docker ps -a

# コンテナ名(nginx_container)を指定してコンテナを停止してみます
$ docker stop nginx_container

# コンテナ名(nginx_container)を指定してコンテナを削除してみます
$ docker rm nginx_container

# nginx_container が削除されていることを確認します
$ docker ps -a

# stop せずに強制的にコンテナ(httpd_container)を削除してみます
$ docker rm -f httpd_container

# httpd_container が削除されていることを確認します
$ docker ps -a
```

## Nginx コンテナへ test.html をマウントして表示してみる

```sh
# マウントディレクトリを作成する
$ mkdir ~/www

# test.html ファイルを作成する
$ vi ~/www/test.html

# 中身は下記のようにする
------------------------------
<!DOCTYPE html>
<html>
<body>
<h1>TEST</h1>
</body>
</html>
------------------------------

# ~/www を /usr/share/nginx/html へマウントしたコンテナを作成する
#  -v [ホスト側パス]:[コンテナ側パス] でマウントする
$ docker create --name nginx_html -p 8080:80 -v ~/www:/usr/share/nginx/html nginx

# 作成したコンテナを起動する
$ docker start nginx_html

# ブラウザからアクセスして test.html が参照できるか確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080/test.html へアクセスすることで確認できます

# test.html を書き換えて、反映されるか確認してみる
$ vi ~/www/test.html

# 中身は下記のように変更して保存して、ブラウザをリロードして TEST2 になっていたらOKです
------------------------------
<!DOCTYPE html>
<html>
<body>
<h1>TEST2</h1>
</body>
</html>
------------------------------
```

## Nginx の設定を変更してコンテナへ反映してみる

```sh
# Nginx の設定ファイルを置くディレクトリを作成する
$ mkdir ~/nginx

# nginx_html コンテナの /etc/nginx/nginx.conf を ~/nginx/nginx.conf へコピーする
$ docker cp nginx_html:/etc/nginx/nginx.conf ~/nginx/nginx.conf

# ~/nginx/nginx.conf の書き換え
$ vi ~/nginx/nginx.conf
```

以下のように `autoindex on;` を追記してみる

```diff:nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

+    autoindex on;

    include /etc/nginx/conf.d/*.conf;
}
```

編集して保存したら、以下の手順を実施してみる

```sh
# Nginx コンテナを一旦削除する
#  -f 実行中のコンテナを強制的に削除する
$ docker rm -f nginx_html

# ~/nginx/nginx.conf を /etc/nginx/nginx.conf へ上書きしたコンテナを作成する
#  -v [ホスト側パス]:[コンテナ側パス] でマウントする
$ docker create --name nginx_html -p 8080:80 -v ~/www:/usr/share/nginx/html -v ~/nginx/nginx.conf:/etc/nginx/nginx.conf nginx

# 作成したコンテナを起動する
$ docker start nginx_html

# ブラウザからルートへアクセスしてファイル一覧がされているか確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080 へアクセスすることで確認できます

# 以下のように表示されていればOKです
------------------------------
# Index of /
# ../
# test.html                                             05-Jun-2019 06:07                  62
------------------------------

# コンテナ内で bash コマンドを実行して中身を確認してみる
#  -i アタッチしていなくても STDIN をオープンにし続ける
#  -t 疑似ターミナル (pseudo-TTY) の割り当て
$ docker exec -it nginx_html

# root@************:/# のような表示になったら以下のコマンドを実行して中身が書き換わっていることを確認します
$ cat /etc/nginx/nginx.conf

# bash から抜けます
$ exit
```
## Nginx + PHP-FPM の環境を構築してみる

```sh
# PHP-FPM の Image 取得、コンテナを作成、コンテナの起動を実行してみます
$ docker run --name php_fpm -d php:7.3.6-fpm

# PHP-FPM の設定ファイルを置くディレクトリを作成する
$ mkdir ~/php_fpm

# php_fpm コンテナの /usr/local/etc/php-fpm.d/www.conf を ~/php_fpm/www.conf へコピーする
$ docker cp php_fpm:/usr/local/etc/php-fpm.d/www.conf ~/php_fpm/www.conf

# ~/php_fpm/www.conf の書き換え
$ vi ~/php_fpm/www.conf
```

以下のように修正を加える

```diff:www.conf
:

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = www-data
group = www-data

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
-listen = 127.0.0.1:9000
+; IPアドレスは外し、9000ポートで LISTEN するようにする
+listen = 9000

; Set listen(2) backlog.
; Default Value: 511 (-1 on FreeBSD and OpenBSD)
;listen.backlog = 511

:
```

編集して保存したら、以下の手順を実施してみる

```sh
# PHP-FPM のコンテナを作成してみます
$ docker create --name php_fpm -v ~/www:/var/www/html -v ~/php_fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf php:7.3.6-fpm

# PHP-FPM のコンテナを起動してみます
$ docker start php_fpm

# コンテナの起動を確認してみます
$ docker ps

# Docker のネットワーク一覧を確認してみます
$ docker network ls
# bridge、host、none などが一覧表示されるかと思います
#  bridge … デフォルトでコンテナが接続されるネットワーク
#  host … ホストに接続されるネットワーク
#  none … ネットワークの無いネットワーク

# bridge ネットワークの詳細を確認してみます
$ docker network inspect bridge
# Containers の中に Name が php_fpm のネットワーク情報が表示されるかと思います
# IPアドレスをメモしておきましょう

# nginx_html コンテナの /etc/nginx/conf.d/default.conf を ~/nginx/default.conf へコピーする
$ docker cp nginx_html:/etc/nginx/conf.d/default.conf ~/nginx/default.conf

# ~/nginx/default.conf の書き換え
$ vi ~/nginx/default.conf
```

以下のように修正を加える

```diff:default.conf
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
-        root   /usr/share/nginx/html;
+        root   /var/www/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
-    #location ~ \.php$ {
-    #    root           html;
-    #    fastcgi_pass   127.0.0.1:9000;
-    #    fastcgi_index  index.php;
-    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
-    #    include        fastcgi_params;
-    #}
+    location ~ \.php$ {
+        root           /var/www/html;
+        fastcgi_pass   [先程メモしたIPアドレス]:9000;
+        fastcgi_index  index.php;
+        # fastcgi_param SCRIPT_FILENAME が /var/www/html/***.php となるように設定を変更する
+        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
+        include        fastcgi_params;
+    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
```

編集して保存したら、以下の手順を実施してみる

```sh
# 起動中の Nginx コンテナを削除する
#  -f 実行中のコンテナを強制的に削除する
$ docker rm -f nginx_html

# 各設定ファイルを上書きした Nginx コンテナを作成してみる
$ docker create --name nginx_php -p 8080:80 -v ~/www:/var/www/html -v ~/nginx/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/default.conf:/etc/nginx/conf.d/default.conf nginx

# Nginx コンテナを起動してみる
$ docker start nginx_php

# phpinfo.php ファイルを作成する
$ vi ~/www/phpinfo.php

# 中身は下記のようにする
------------------------------
<?php phpinfo(); ?>
------------------------------

# ブラウザから phpinfo.php へアクセスしてPHP情報が表示されるか確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080/phpinfo.php へアクセスすることで確認できます
```
## コンテナ間の自動DNS解決に対応した構成にしてみる

先程は Nginx の設定ファイルへ PHP-FPM のIPアドレスを直で書きしましたが、
PHP-FPM コンテナのIPアドレスが変わっても問題ないように自動DNS解決に対応した構成に変更してみます

docker create の --link オプションは[非推奨](https://docs.docker.com/network/links)となってしまっているようなので、
ここではユーザー定義 ブリッジ ネットワークを用います

「ユーザー定義 ブリッジ ネットワーク」と「デフォルト ブリッジ ネットワーク」の違いは、[こちら](https://docs.docker.com/network/bridge/#differences-between-user-defined-bridges-and-the-default-bridge)を参照ください

1点だけ抜粋すると、
「デフォルト ブリッジ ネットワーク」ではDNS解決が出来ませんが、
「ユーザー定義 ブリッジ ネットワーク」ではDNS解決がされます

```sh
# 起動中のコンテナを削除する
#  -f 実行中のコンテナを強制的に削除する
$ docker rm -f nginx_php
$ docker rm -f php_fpm

# ユーザー定義ブリッジ ネットワークを作成してみます
$ docker network create web

# Docker のネットワーク一覧を確認してみます
$ docker network ls
# web が一覧へ追加されるかと思います

# ~/nginx/default.conf の書き換え
$ vi ~/nginx/default.conf
```

以下のように修正を加える

```diff:default.conf
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /var/www/html;
-        fastcgi_pass   [先程メモしたIPアドレス]:9000;
+        # コンテナの名前で設定する
+        fastcgi_pass   php_fpm:9000;
        fastcgi_index  index.php;
        # fastcgi_param SCRIPT_FILENAME が /var/www/html/***.php となるように設定を変更する
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
```

編集して保存したら、以下の手順を実施してみる

```sh
# web ネットワークへ接続する PHP-FPM のコンテナを作成します
#  --network 接続するネットワークの指定
$ docker create --name php_fpm --network web -v ~/www:/var/www/html -v ~/php_fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf php:7.3.6-fpm

# PHP-FPM のコンテナを起動します
$ docker start php_fpm

# web ネットワークへ接続する Nginx コンテナを作成します
#  --network 接続するネットワークの指定
$ docker create --name nginx_php --network web -p 8080:80 -v ~/www:/var/www/html -v ~/nginx/nginx.conf:/etc/nginx/nginx.conf -v ~/nginx/default.conf:/etc/nginx/conf.d/default.conf nginx

# Nginx のコンテナを起動します
$ docker start nginx_php

# ブラウザから phpinfo.php へアクセスしてPHP情報が表示されるか確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080/phpinfo.php へアクセスすることで確認できます

# web ネットワークの詳細を確認してみます
$ docker network inspect web
# Containers の中に Name が nginx_php、php_fpm のネットワーク情報が表示されるかと思います

# nginx、php のログを確認してみます
$ docker logs nginx_php
$ docker logs php_fpm
# phpinfo.php へ接続したログが見れるかと思います
```

## MySQL 5.7 のコンテナを立ち上げて PHP-FPM コンテナから利用してみる

```sh
# MySQL 5.7 のコンテナを作成します
#  root ユーザのパスワードは root-pw としています
#  -e 環境変数の設定
# 参考URL（https://hub.docker.com/_/mysql）
$ docker create --name mysql -e MYSQL_ROOT_PASSWORD=root-pw --network web mysql:5.7

# MySQL のコンテナを起動します
$ docker start mysql

# MySQL拡張モジュールをインストールした PHP-FPM コンテナを作成するための Dockerfile を作成してみます
$ vi ~/php_fpm/Dockerfile
```

Dockerfile とは Dockerコンテナーの構成内容を記述したキスト形式のファイルです

取得していた php:7.3.6-fpm も元は Dockerfile にて構成内容が記述されています
https://hub.docker.com/_/php の 7.3.6-fpm-stretch リンク先などを参照してみてください

php:7.3.6-fpm は、そのままだと MySQL拡張モジュールが入っていないので Dockerfile を独自に作成して対応します

Dockerfile に以下のように記述します

```Dockerfile:Dockerfile
# ベースイメージに php:7.3.6-fpm を指定
# ベースイメージは https://github.com/docker-library/official-images/tree/master/library を参照
FROM php:7.3.6-fpm

# MySQL拡張モジュールをインストール
RUN docker-php-ext-install mysqli
```

編集して保存したら、以下の手順を実施してみます

```sh
# Dockerfile を用いたイメージの作成
#  Dockerfile へのパスはディレクトリ指定となります
#  -t イメージの名前を指定
$ docker build -t php_fpm_mysql ./php_fpm

# 独自のイメージが追加されていることを確認します
$ docker images

# 起動中の Nginx コンテナを停止します
$ docker stop nginx_php

# 起動中の PHP-FPM コンテナを削除します
$ docker rm -f php_fpm

# 独自のイメージからコンテナを起動してみます
$ docker run -d --name php_fpm --network web -v ~/www:/var/www/html -v ~/php_fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf php_fpm_mysql

# 停止させていた Nginx コンテナをを起動します
$ docker start nginx_php

# MySQLへ接続する処理を書いたPHPファイルを用意してみます
$ vi ~/www/mysql.php
```

以下のように記述します

```php:mysql.php
<?php
// mysqlデータベースへ接続し、userテーブルの中身を一覧表示する
// ※mysqli('接続先', 'ユーザ名', 'パスワード', 'データベース名');
$mysqli = new mysqli('mysql', 'root', 'root-pw', 'mysql');
if ($mysqli->connect_error) {
    echo $mysqli->connect_error;
    exit;
}

$mysqli->set_charset('utf8');

$sql = 'SELECT * FROM user';
if ($result = $mysqli->query($sql)) {
    while ($row = $result->fetch_assoc()) {
        echo 'Host: ' . $row['Host'] . ', User: ' . $row['User'] . '<br>';
    }
    $result->close();
}

$mysqli->close();
```

編集して保存したら、以下の手順を実施してみます

```sh
# ブラウザから mysql.php へアクセスして以下のようなものが表示されるか確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080/mysql.php へアクセスすることで確認できます

------------------------------
Host: localhost, User: root
Host: localhost, User: mysql.session
Host: localhost, User: mysql.sys
Host: %, User: root
------------------------------
```

## Volume を触ってみる

MySQL のコンテナを作成した際に Volume と呼ばれるコンテナ間での共通ストレージのようなものが追加されています

これは作成した MySQL コンテナを削除しても、
また別の MySQL コンテナを作成した際に以前作成していたデータベースを利用できるようにデータだけ分離する際に利用されたりします

```
# まずは Volume の存在を確認してみます
$ docker volume ls

# 現在存在する Volume の一覧が表示されるかと思います

# MySQL起動時に Volume が作られています
# 詳しくは（https://hub.docker.com/_/mysql）から Dockerfile を参照してみてください
# 「VOLUME /var/lib/mysql」という記述があるかと思います

# Volume の詳細を確認してみます
$ docker volume inspect [ボリューム名(ハッシュのような値)]

# Volume の詳細が確認できるかと思います

# Mountpoint がローカルのパスになりますので、中身を確認してみます
$ sudo ls -l [Mountpointの値(/var/lib/docker/volumes/**********/_dataのような値)]

# MySQL コンテナの詳細を確認してみます
$ docker inspect mysql

# 以下のようなマウント情報が表示されるかと思います

# コンテナの /var/lib/mysql が /var/lib/docker/volumes/(ハッシュのような値)/_data へ volume でマウントされていることがわかります

------------------------------
:
"Mounts": [
    {
        "Type": "volume",
        "Name": "(ハッシュのような値)",
        "Source": "/var/lib/docker/volumes/(ハッシュのような値)/_data",
        "Destination": "/var/lib/mysql",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
:
------------------------------
```

起動中の MySQL コンテナからデータベースの中身を編集してみます

```sh
# MySQL コンテナ内で bash コマンドを実行
$ docker exec -it mysql bash

# MySQL へ接続
$ mysql -u root -p
Enter password: root-pw

# test というデータベースを作成
mysql> CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

# データベース一覧を確認してみます
mysql> show databases;

# test というデータベースが増えていることが確認できるかと思います

# test データベースを使用する
mysql> use test;

# list というテーブルを追加
mysql> CREATE TABLE list (id int, name TEXT);

# テーブル一覧を確認してみます
mysql> show tables;

# list というテーブルが増えていることが確認できるかと思います

# list テーブルへデータを追加
mysql> INSERT INTO list VALUES (1, 'yamada tarou');

# MySQL から抜ける
mysql> \q

# ~/www/mysql.php を ~/www/list.php へコピーする
$ cp ~/www/mysql.php ~/www/list.php

# ~/www/list.php の書き換え
$ vi ~/www/list.php
```

以下のように修正を加える

```diff:list.php
<?php
// mysqlデータベースへ接続し、userテーブルの中身を一覧表示する
// ※mysqli('接続先', 'ユーザ名', 'パスワード', 'データベース名');
-$mysqli = new mysqli('mysql', 'root', 'root-pw', 'mysql');
+$mysqli = new mysqli('mysql', 'root', 'root-pw', 'test');
if ($mysqli->connect_error) {
    echo $mysqli->connect_error;
    exit;
}

$mysqli->set_charset('utf8');

-$sql = 'SELECT * FROM user';
+$sql = 'SELECT * FROM list';
if ($result = $mysqli->query($sql)) {
    while ($row = $result->fetch_assoc()) {
-        echo 'Host: ' . $row['Host'] . ', User: ' . $row['User'] . '<br>';
+        echo 'id: ' . $row['id'] . ', name: ' . $row['name'] . '<br>';
    }
    $result->close();
}

$mysqli->close();
```

編集して保存したら、以下の手順を実施してみます

```sh
# ブラウザから list.php へアクセスして以下のようなものが表示されるか確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080/list.php へアクセスすることで確認できます

------------------------------
id: 1, name: yamada tarou
------------------------------

# MySQL コンテナを削除してみます
$ docker rm -f mysql

# Volume 一覧を確認してみます
$ docker volume ls

# コンテナが削除されても Volume は削除されていないことが確認できるかと思います

# ここで 既存の Volume の名前をメモしておいてください

# 試しに 以前と同様にMySQLコンテナを作成して起動してみます
$ docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=root-pw --network web mysql:5.7

# Volume 一覧を確認してみます
$ docker volume ls

# Volume が増えていることが確認できるかと思います

# ブラウザから mysql.php へアクセスして以下のようなものが表示されるか確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080/mysql.php へアクセスすることで確認できます

------------------------------
Host: localhost, User: root
Host: localhost, User: mysql.session
Host: localhost, User: mysql.sys
Host: %, User: root
------------------------------

# ブラウザから list.php へアクセスして以下のようなものが表示されるか確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080/list.php へアクセスすることで確認できます

------------------------------
Warning: mysqli::__construct(): (HY000/2002): Connection refused in /var/www/html/list.php on line 2
Connection refused
------------------------------

# 新しいデータベースのデータとなり、test データベースが存在しないためにエラーとなったことが確認できます

# 試しに起動した MySQL コンテナを削除します
# docker rm -f mysql

# 以前中身を変更した Volume へマウントした MySQL コンテナを作成して起動してみます
$ docker run -d --name mysql2 -e MYSQL_ROOT_PASSWORD=root-pw --network web -v [メモしておいたボリューム名(ハッシュのような値)]:/var/lib/mysql mysql:5.7

# ブラウザから list.php へアクセスして以下のようなものが表示されるか確認してみます
# ※1で記載した確認環境であれば、192.168.33.10:8080/list.php へアクセスすることで確認できます

------------------------------
id: 1, name: yamada tarou
------------------------------

# 無事に既存の Volume 利用ができたことが確認できました

# 不要な Volume を削除してみます
#  -f 削除の確認をしない
$ docker volume prune -f

# ※docker volume rm VOLUME_NAME でも削除できます
# ※docker prune は、未使用の Volume を一括で削除する際に利用すると便利です
```

## 後片付け

お疲れ様でした
Docker については、ここまでとします

作成したコンテナ、Volume を削除して後片付けをします

```sh
# コンテナの削除
$ docker rm -f nginx_php
$ docker rm -f php_fpm
$ docker rm -f mysql

# Volume の削除
$ docker volume prune -f

# コンテナがないことを確認
$ docker ps -a

# Volume がないことを確認
$ docker volume ls
```

## 利用した Docker コマンド 一覧

|コマンド|説明|オプション|
|------------------|-------------------|-------------------|
|**docker**|コマンドの一覧や詳細を表示|
|**docker pull** NAME[:TAG]|イメージの取得|
|**docker images**|イメージの一覧を表示|
|**docker rmi** IMAGE|イメージの削除|
|**docker create** IMAGE|コンテナの作成|**--name** コンテナの名前を指定<br>**-p** host:guest コンテナのポート(guest)をホスト(host)として公開<br>**-v** host_path:guest_path ホスト(host_path)をコンテナ(guest_path)へマウント|
|**docker ps**|コンテナの一覧を確認|**-a** 停止しているコンテナを含む|
|**docker start** CONTAINER|コンテナの起動|
|**docker stop** CONTAINER|コンテナの停止|
|**docker run** IMAGE|イメージの取得、コンテナの作成、コンテナの起動を実行|**--name** コンテナの名前を指定<br>**-p** host:guest コンテナのポート(guest)をホスト(host)として公開<br>**-d** バックグラウンドで実行<br>**-v** host_path:guest_path ホスト(host_path)をコンテナ(guest_path)へマウント|
|**docker rm** CONTAINER|コンテナの削除|**-f** 実行中のコンテナを強制的に削除する|
|**docker cp** CONTAINER:SRC_PATH DEST_PATH<br>**docker cp** SRC_PATH CONTAINER:DEST_PATH|コンテナとホスト間でファイルやフォルダをコピーする|
|**docker exec** -it CONTAINER COMMAND|コンテナ内でコマンドを実行する|**-i** アタッチしていなくても STDIN をオープンにし続ける<br>**-t** 疑似ターミナル (pseudo-TTY) の割り当て|
|**docker network ls**|Docker ネットワークを一覧で表示する||
|**docker network inspect** NETWORK|Docker ネットワークの詳細情報を表示する||
|**docker logs** CONTAINER|コンテナのログを表示する||
|**docker inspect** CONTAINER|コンテナの詳細情報を表示する||
|**docker build** PATH|Dockerfileからイメージを作成する|**-t** イメージの名前を指定|
|**docker volume ls**|ボリュームの一覧を表示する||
|**docker volume inspect** VOLUME|ボリュームの詳細情報を表示する||
|**docker volume rm** VOLUME|ボリュームを削除する||
|**docker volume prune**|未使用のボリュームを全て削除する|**-f** 削除の確認をしない|

## 参考URL
[Docker コマンドライン リファレンス](http://docs.docker.jp/engine/reference/commandline/toc.html)

## 続いて

続いて、 「動かしながら Docker Compose を理解しよう（鋭意執筆中です）」 にて Docker Compose の理解へ進みましょう