どうも! 職業訓練生のがっちゃんです!
50歳にして、長期人材育成「情報セキュリティ管理者資格」2年コースを絶賛受講中です!
今回は、「Dockerの総復習」と「MySQLコンテナ」の生成について勉強したことをお伝えしたいと思います!最終的には「MySQLと連動したWebサーバコンテナ」の作成をゴールとします。このコンテナについては、後々の続編「映画館予約サイトの作成」で使う予定です。
Dockerの総復習で使い方をおさらい
コンテナを何度も作ったり削除することにより、コマンドの使い方なども復習していきます。実際にコンテナを作って実行することにより、どんな機能のものが作成できるのかを確認することもできます。
まずは「Docker Quickstart Terminal」をクリックし、ドッカーを起動。クジラマークが出てくれば起動完了の合図です。
今までのコンテナやイメージを削除する
「docker ps -a」コマンドでどんなコンテナがあるのか、それぞれの起動状態を確認します。
「docker start php」コマンドで、以前作成した「php」コンテナを起動させてみます。
再度「docker ps -a」コマンドでコンテナの起動状態を確認します。
以下がそれぞれのコマンドを実行した時の画面になります。
「docker rm php」コマンドで「phpコンテナの削除」を実行しますが、「phpコンテナ」が動いているのに削除しようとすると、以下のように「削除の前にコンテナをストップさせてね」というエラーメッセージが出てきて削除ができません。
コンテナを削除する場合は「docker stop php」コマンドでコンテナをストップさせてから削除します。phpコンテナをストップさせると「STATUS欄」が「Up ~」から「Exited ~」に変わっていることが分かります。こうなればphpコンテナの削除が可能になります。
「docker rm php」コマンドで削除してみると、今回は「phpコンテナ」がキチンと削除されましたね。たくさんのコンテナを一発で消去する場合は「docker rm -f $(docker ps -a -q)」コマンドになります。
次は「docker images」コマンドでイメージを確認してみます。以下のように4つのイメージが残っているので「docker rmi」コマンドで削除しましょう。すべて削除する場合は「docker rmi -f $(docker images -aq)」コマンドになります。全部消去できたか「docker images」で確認します。何も表示されていなければ成功です。
新たにコンテナを作成したり削除したりする
再びコンテナを作成していきます。「docker run -d php:7.2-apache」でWebサーバ環境を作成します。以下が実行したときの画面になります。「run」は、「docker pull,docker create,docker start」コマンドを一度に実行するものです。
「docker ps -a」で確認すると、「STATUS」が「Up 3 minutes~」となっており、Webサーバ環境が動いていることが分かります。それと「NAMES」が適当に付けられていることも分かります(ここでは「jolly_mahavira」)。
ブラウザにつながっているかURL「192.168.99.100」(もしくは「localhost」)で確認してみると、以下のようにつながっていません。Webサーバの80番ポートをくっつけてあげないと、ブラウザで見ることが出来ません。
そこで、次はWebサーバ名を勝手に付けられないよう、名前を「php」とし、Webサーバを80番ポートにくっつけてブラウザで見れるようにしてみます。先ほど作成したコンテナは「docker rm -f $(docker ps -a -q)」で削除してくださいね。
Webサーバ環境をサクッと作成
「docker run –name php -p “80:80” -d php:7.2-apache」コマンドを実行してみましょう。「docker ps -a」で確認すると、「NAMES」は「php」になっており「PORTS」が80番ポートにくっつけられたことが分かります。
次に「docker exec -it php bash」コマンドで「php」コンテナに入り、「info.php」ファイル(phpのバージョン情報が見れるファイル=Webサーバ環境が整い、ブラウザで見れるようになった)を作成します。
「echo “<?php phpinfo(); ?>” > info.php」でinfo.phpファイルを作成。
「ls」コマンドで、「info.php」ファイルができていることが確認できます。
「cat info.php」コマンドで「info.php」の中身を確認できます。「<?php phpinfo(); ?>」だけで、phpのバージョン情報を見ることができます。
実際に、URL「192.168.99.100/info.php」(もしくは「localhost/info.php」)でブラウザ画面を見てみましょう。こんな画面が出てきたらOKですね。
ではせっかく作った「php」コンテナも削除して次にまいりましょう。「exit」コマンドで「php」コンテナから出て「docker stop php」「docker rm php」とコマンドを打っていきましょう。
ローカルディレクトリとマウントしたphpコンテナを作成
今回は自分のPCのデスクトップに講師からいただいた「docker-amp」フォルダを配置。そのフォルダ内の「www」フォルダと「php」コンテナをドッキングさせます。ドッキングさせるだけなので、自分で好きな名前のフォルダを作成してドッキングしていただいてOKです。ドッキングしたかの確認のため「www」フォルダ内に「hello」とだけ書いた「index.html」ファイルを置いておきましょう。
再び「Docker Quickstart Terminal」に戻って次のコマンドを打ちこみましょう。「$(pwd)」は自分のいるディレクトリ(ローカルディレクトリ)を表しています。
「docker run –name php -p “80:80” -v “$(pwd)/www:/var/www/html” -d php:7.2-apache」
「phpという名のWebサーバコンテナを作成して80番ポートをドッキング、でもって自分のPCのデスクトップに作ったDocker-amp内のwwwフォルダとphpコンテナのvar/www/html(Webサーバの公開用フォルダで、通常ここにHTMLファイルを作成して配置する)」とをドッキング(同期)させますぜ!」という感じでしょうか!?
実際にうまくドッキングできたかブラウザで「192.168.99.100」を打ち込んで確認していきましょうかね?こんな感じで表示されればつながってますね。つながったついでにコードエディタ「Visual Studio Code」で編集してみて反映するかどうかを見るのもいいですね。面倒ですが「Docker Quickstart Terminal」のほうでも編集すると、より理解が深まります。
データベースサーバを作成する
次はデータベースサーバ「MySQL」コンテナを作成します。
ここからは新しいことです。データベースサーバを利用した「映画館予約サイト」を作成するときに必要になります。授業が始まって4か月くらいのときに学んだのですが、この時は「サーバって美味しいの!?」「魚と違うわ!」って感じで、なんとなく機能は知っていましたが、それぞれのサーバがどんなふうにつながって働くのかが分からなかったので、ぼんやりと理解していただけでした。
授業後半、演習でサーバを作ったりしてサーバの機能やつながり、働きなどが分かったので、今になってはとても理解しやすいんです。授業内容がサーバのことから始まっていれば、ドッカーでサーバコンテナを作成するときの理解度は深まったんじゃないかなぁ、と思います。
「docker run –name mysql -p “3307:3306” -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7」コマンドを実行しましょう。「-e」は環境変数の設定コマンドです(MySQLのIDをroot、パスワードをrootで設定)。今回、PC側ポート番号を3307にしています。通常は3306でOKです。私のPCではすでに3306番を、別のMySQLサーバで使用しているため、3307番としました。
DBサーバ「MySQLコンテナ」の動作確認
MySQLコンテナの動作確認を行います。「docker exec -it mysql bash」コマンドで「MySQLコンテナ」に入ります。「mysql -u root -p」コマンドでMySQLサーバに入ります。次に「password」を聞かれるので、先ほど設定済みのパスワード「root」を入力すればOKです。以下のようになれば成功。
「show databases;」コマンドでデータベースの内容を覗いてみます。以下のように4つのデータベースが表示されたでしょうか?
「create database gacchan;」コマンドでgacchanという名のデータベースを作成します。皆さんは適当な名前でデータベースを作ってくださいね。
「show databases;」コマンドでgacchanというデータベースができていることを確認。
「use gacchan;」コマンドでgacchanのデータベースを使うべく入っていきましょう。
これから表(テーブル)を作ってMySQLサーバにデータが記録されていくか確認してみましょう。
「create table syokugyoukunren (name varchar(100));」コマンドでsyokugyoukunrenという名前のテーブルを作成、カラム名「name」列を作成、100文字まで入力可能。という意味になりますかね。
「inser into syokugyoukunren values(‘gacchan01’);」コマンドでgacchan01という名前を挿入。
「show tables;」コマンドで作成した表を一覧表示。「syokugyoukunren」という表があることが分かります。
「select * from syokugyoukunren;」コマンドで、syokugyoukunren表の内容を確認。
以下がそれぞれのコマンドを実行した結果の画面になります。
コードエディタで操作できるようにする
ドッカーで作成した「MySQL」コンテナをコードエディタ「Visual Studio Code」(以下、VSC)で編集できるようにします。まずは、「VSC」を起動し、拡張機能で「MySQL」をインストールします。同じ名前のものがたくさんあるので、ここでは以下の画像のものを選んでくださいね。
インストールが完了したら、画面左下に「MySQL」というウインドウができます。「MySQL」欄右側に「+」ボタンがあるのでクリックします。
すると画面上側に入力欄が出現しますので、以下の通り入力していきましょう。
「192.168.99.100」もしくは「localhost」と入力(1番目はホストネームの入力)
「root」と入力(2番目はMySQLサーバのユーザ名の入力を求められます)
「root」と入力(3番目はMySQLさーばのパスワードの入力を求められます)
「3307」もしくは「3306」と入力(4番目はMySQLサーバ側のTCPポート番号の入力を求められます)
最後はSSL認証のことを問われます。ここは何も入力せずに「enter」キーを押して下さい。「MySQLコンテナ」とつながれば、画面右下に以下のとおり、先ほど作成したデータベースやテーブルが見えるのが分かります。つながった時は「192.168.99.100」しか見えてないので、クリックしてたどっていってくださいね。
これでDBサーバの作成は完了です。これでコンテナは「php」という名前のWebサーバと「mysql」という名前のDBサーバ、2つが出来上がりました。これらのコンテナは連動させる設定になっていません。
次回、WebサーバとDBサーバが連動したコンテナを作成し、データベース機能が必要な「映画館予約サイト」の制作に使えるコンテナを準備してみることにします。
というわけで、今まで作成したコンテナはすべて削除しておきましょう。
「docker rm -f $(docker ps -a -q)」コマンドで、コンテナをすべて削除できます。
DBサーバとWebサーバが連動したコンテナを作成
まずはWebサーバイメージのカスタマイズ
これを作成する前に、自分のPCのデスクトップに作った「docker-amp」フォルダ内に「php」フォルダを作成し「Dockerfile」を作成します。
「Dockerfile」にはコードエディタVSCで、以下のような内容を入力します。
1 2 3 |
FROM php:7.2-apache RUN apt-get update && \ docker-php-ext-install pdo_mysql mysqli mbstring |
VSCで実際に入力しているのが、こんな感じです。
「Dockerfile」が出来上がったら「docker Quickstart Terminal」で、作業ディレクトリを次のコマンドで「docker-amp」に移動します。
「cd ~/desktop/docker-amp」
そして次のコマンドを実行し、phpコンテナイメージをカスタマイズします。インストールが始まり、英文字がズラズラと出てきます。終了まで数分かかります。以下のような画面が出れば無事インストール完了です。
「docker build -t php:custom ./php」
「docker images」で確認すると以下の通りです。「TAG」欄に「custom」と書かれたものができていると思います。この時点ではイメージが作成されただけなので「docker ps -a」でコンテナを見ても何もないことが確認できます。
これでWebサーバコンテナイメージのカスタマイズは完成です。
MySQL(DB)サーバコンテナを作成
コンテナ作成の前にコードエディタVSCで、自分のPCのデスクトップに作った「docker-amp」フォルダ内に「mysql」フォルダを作成し「custom.cnf」ファイルを作成して下さい。内容は以下のとおりです。
1 2 |
[mysqld] character-set-server=utf8 |
VSCで実際に入力しているのが、こんな感じです。
「custom.cnf」ファイルが出来上がったら「docker Quickstart Terminal」で、作業ディレクトリは「docker-amp」のままで、以下のコマンドを実行し、「MySQLコンテナ」を作成します。
「docker run –name mysql -v “$(pwd)/mysql:/etc/mysql/conf.d” -p “3307:3306” -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7」
実行結果は以下の通りです。
「docker ps -a」で「MySQL」コンテナができたか確認します。
コードエディタVSCでも確認してみましょう。画面左下の「MYSQL」→「192.168.99.100」にマウスをもっていき、右クリックして「Refresh」を選択します。
すると、以下のようにデータベースが確認できれば「MySQLコンテナ」の完成です。
MySQLと連動するphpコンテナ(Webサーバ)を作成
コンテナ作成の前に、自分のPCのデスクトップに作った「docker-amp」フォルダ内に、phpコンテナとマウント(連動)させるディレクトリ(Web公開用フォルダ)「www」フォルダを作成します(このページの最初のほうで作りましたかね!?)。
次に「Docker Quickstart Terminal」で「docker run -p “80:80” -v “$(pwd)/www:/var/www/html” –link “mysql:mysql” –name php -d php:custom」コマンドを入力します。実行結果は以下の通りです。「docker ps -a」でphpコンテナができたかも確認しましょう。
DBサーバ「MySQLコンテナ」とWebサーバ「phpコンテナ」が連動しているかテスト
コードエディタVSCの画面左下の「MYSQL」→「192.168.99.100」の上にマウスをもっていき、右クリックして「Delete Connection」を選択し、MySQLコンテナを切断します。
切断したら「MySQLコンテナ」と再接続します。接続方法は、上で一度実行したとおりです。戻ってみるのも面倒でしょうから、もう一度以下に掲載しますね。
「MySQL」欄右側に「+」ボタンがあるのでクリックします。
すると画面上側に入力欄が出現しますので、以下の通り入力していきましょう。
「192.168.99.100」もしくは「localhost」と入力(1番目はホストネームの入力)
「root」と入力(2番目はMySQLサーバのユーザ名の入力を求められます)
「root」と入力(3番目はMySQLさーばのパスワードの入力を求められます)
「3307」もしくは「3306」と入力(4番目はMySQLサーバ側のTCPポート番号の入力を求められます)
最後はSSL認証のことを問われます。ここは何も入力せずに「enter」キーを押して下さい。「MySQLコンテナ」とつながれば、画面右下に以下のとおり、先ほど作成したデータベースやテーブルが見えるのが分かります。つながった時は「192.168.99.100」しか見えてないので、クリックしてたどってくださいね。
phpコンテナ単体で動作確認
phpコンテナがキチンと動作するか確認します。上のほうで作成した「index.html」が「www」フォルダに残っていれば、ブラウザでURLを「192.168.99.100」と入力すれば「hello」と出てくるはずです。「index.html」ないよ、という方はもう一度作成してくださいね。
MysQLコンテナ単体で動作確認
自分のPCのデスクトップの「docker-amp」フォルダにコードエディタVSCで「init.sql」ファイルを作成します。
内容は以下の通りです。
1 2 3 |
CREATE DATABASE test; USE test; CREATE TABLE test(name VARCHAR(100)); |
作成したら「init.sql」を実行してみます。VSCの「init.sql」ファイルのどこでもいいので右クリックし「Run MySQL Query」を選択します。
すると、以下のように「result」タブが開き、画面左下の「192.168.99.100」の上でマウスを右クリックし「Refresh」を選択すると「init.sql」を実行して作られた「test」データベースが確認できます。これでMySQLコンテナがキチンと動作していることが確認されました。
両サーバが連動しているかのテスト
自分のPCのデスクトップに作成した「docker-amp」→「www」フォルダにコードエディタVSCで「dbtest.php」ファイルを作成します。
「dbtest.php」の内容は以下の通りです。
1 2 3 4 5 6 |
<meta charset="UTF-8"> <?php $db = new PDO('mysql:host=mysql;dbname=test', 'root', 'root'); $db->query("INSERT INTO test VALUES('テスト次郎')"); $st = $db->query("SELECT * FROM test"); var_dump($st->fetchAll()); |
VSCの画面はこんな感じです。
入力完了したらブラウザソフトでURL「192.168.99.100/dbtest.php」と入力してください。以下のように表示されていればOKです。
DBサーバである「MySQLコンテナ」にこのデータが記録されていればWebサーバ「phpコンテナ」とDBサーバ「MySQLコンテナ」は連動している証拠になります。次のとおり確認しましょう。
コードエディタVSCで画面左下「test」テーブルの上でマウスを右クリックし「select top 1000」を選択します。すると、画面右上に「select * from ‘test’ ~~」タブが表示されます。
そのタブのどこでもいいのでマウスを右クリックし「Run MySQL Query」を選択します。
すると以下のように「Result」タブが表示され、テーブルが見えるのですが、見事に文字化けしてますねぇ。「テスト次郎」にせず英語で名前を入力しておけばよかったと後悔。
気を取り直して「Docker Quickstart Terminal」から「MySQLコンテナ」内の「test」テーブルを覗いてみることにします。次の通りコマンドを打ちこんでいってください。
「docker exec -it mysql bash」(mysqlコンテナに入る)
「mysql -u root -p」(ユーザ名rootでmysqlに入る)
「root」(パスワード入力)
「show databases;」(データベース名の確認)
「use test;」(testデータベースを使用)
「show tables;」(testデータベース内のテーブル(表)を確認)
「select * from test;」(test テーブルの表を一覧表示)
以上の実行結果は以下の通りとなります。どうです!?「testテーブル」に「テスト次郎」の名前があれば見事WebサーバとDBサーバが連動したコンテナの作成に成功です!
コンテナの起動・終了の順序は間違えないでね!
ここで、各コンテナの起動順序、終了順序を追記しておきますね。
・終了時は「MySQLコンテナ」→「phpコンテナ」の順で終了させること。
まとめ
という感じで進めてきてまいりましたDockerの総復習と「Webサーバ」と「DBサーバ」が連動したコンテナ作り。仮想環境Docerでは簡単に様々なサーバ環境を作成できることが分かりました。今後、仕事において仮想環境で試作品を制作する、ということが普及してくれれば、ここで学んだことが有効活用できますね。
クライアントさんのシステム導入環境って色々ありますから、クライアントさんとことお暗示システム環境を仮想環境で作成して、そこで制作するのは仕事の効率化「せっかく作ったけど現場合わせでうまく動かんかった!」というトラブルが予防できていいんじゃないかと思います。
ってか、そのための仮想環境ですもんね。
それでは本日も最後までお付き合いいただき、ありがとうございました!