概要
現場でdocker-composeを使っており、復習も兼ねて勉強会で取り上げてみました。まず、勉強会にはdockerやコンテナの概念が微妙な方もいらっしゃったため、まずはWordPressを使ってコンテナに接続して、まずは触れてもらいながら学習してもらうことにしました。その学習内容を記事にまとめさせていただきます。
勉強会自体はかなりボリュームになってしまい上記は前半の初心者向けの内容となります。なお後半はdocker-composeでNode.js(Express)とPostgresSQLを使用した簡単なサービスを作成しました。こちらは初めてチャレンジしたモノで、それはそれで面白かったのでそちらの内容も別の記事にて投稿予定です。
それでは以降からは学習内容のまとめになります。
そもそもdockerって何?コンテナって何?
VirtualBoxとの比較がわかりやすかったりします。以下はさくらナレッジの記事を引用です。
VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。
と説明を受けても若干イメージしづらいのが正直なところです。以下のような現実での例で説明してみました。
-
VirtualBoxなどの仮想マシン:一軒家 -
Dockerなどのコンテナ:マンションの1室
あと、仮想マシンは触ったことがある人が多かったので以下のような説明もしました。
- 仮想環境をアプリケーションごとに分けたいな~と思います~
- そのときに共通で使用できそうなOSなどを新しく別に作るのはダルいよね~
- アプリケーションの部分だけ別の環境として作りたいよね~
- それを実現したのが
dockerやコンテナだと思います~
dockerのコンテナってどうやって作られているの?
まずはdocker-hubにあるOfficialのイメージをみてもらいました。いろんなサービスのコンテナのイメージがあり、自分が使いたいプログラミング言語やデータベースのイメージを使用することですぐに動作できる環境を準備できます。
- 例:Node.jsを使いたい!
- Node.jsのイメージを使えばNode.jsを動作できる環境を作れる!
そもそもdockerのコンテナやイメージってどうやって作られているかという話ですがほとんどがDockerfileになると思います。実はOfficialイメージから各バージョンごとのDockerfileを確認することができます。
- Node 14 の Dockerfile
もし独自にコンテナあるいはイメージを作成したい場合にはDockerfileを作ればよいわけです。また既存のイメージから拡張したい内容をDockerfileに追加することも可能です。
複数のサービスを連携してこそのコンテナ
1つのサービスを実行するだけだと普通の仮想マシンと変わりません。やはりコンテナ同士で連携するサービスを構築することで真価が出ると思います。口だけでいうと伝わらないと思ったので、お試しにdocker-composeでWordPressを実行してもらいました。
docker-composeって何?
1つだけのサービスならDockerfileだけで問題ありませんが、複数のコンテナの連携になるとdocker-composeが良いです。
WordPressって何?
WordPressはPHPで作られているCMS(コンテンツ管理システム)でサイトの内容を保存するためにMySQLを使用します。詳細については割愛させていただきますが、「PHPが動作する環境」と「MySQLのデータベース」を準備する必要があります。今回は必要な2つの環境をdocker-composeで構築します。
docker-composeでWordPressを動かす
docker-compose.yml
version: '2'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
image: wordpress:latest
depends_on:
- db
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
実行内容
docker-compose build
docker-compose up -d
実行内容に関する説明
まずは実行内容のbuildでコンテナを作成します。実のところ今回の場合は特に意味はありません。ただし自分でDockerfileを作成した場合はbuildした方がよいです。直接upした場合でもイメージがなければbuildが実行されます。
ここで気を付けてほしいのが以前にbuildしたコンテナがある場合はそのコンテナを実行します。例えばDockerfileで読み込むプログラムを更新した場合でもupだと以前のコンテナを実行するので、更新したプログラムが取り込まれないまま実行されます。新しい状態を作り直す意味でもbuildをすることを意識しておいて損はありません。
docker-compose -d の -d って何?
-dをつけるとバックグラウンドで動作します。逆につけない場合は実行したコンソールでコンテナが稼働するため、実行したコンソールでは他の作業ができなくなります。もし-dをつけ忘れて停止させたいよ~ってなった場合は、Windowsの方はCtrl+C、Macの方はControl+Cで停止させることができます。
docker-compose.ymlに関する説明
注意すべきポイントを抜粋して説明します。
WordPressのポート設定
まずはポートの設定を確認します。
wordpress:
# ~省略~ #
ports:
- "8000:80"
右がコンテナのポートで左がホストのポートです。ホストというのは今自分が操作しているでありコンテナを動かしている端末です。この設定ではWordPressのコンテナのポート80を、ホストのポート8000に転送しています。これはWordPress自体がデフォルトの設定ではポート80に転送されており、それをホストのポート8000に転送しています。
この設定により自分の端末(ホスト)のブラウザから http://localhost:8000 でアクセスすることができます。
最初の頃は何がどうポート転送されているか把握しづらいのが正直なところです。このシンプルな構成でもWordPressのデフォルトのポートが80であることを知らなければ、なぜ8000:80になっているかわからないまま進むことになるので、1つずつ説明しながら理解を深めてもらいました。
環境変数を確認する
環境変数を確認します。
db:
# ~省略~ #
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
# ~省略~ #
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
元のコンテナイメージですでに使用されている環境変数を上書きすることができます。
今回はMySQLというデータベースを使用しており、データベースのパスワードの場合はMYSQL_PASSWORDという環境変数を設定することでパスワードの内容を上書き・変更することができます。使うコンテナのイメージごとに設定されいている環境変数は異なりますので調べる必要はあります。環境変数の調べ方ですがサンプルなどで見つかったりするのと、ちゃんと調べる場合にはコンテナイメージのリポジトリなどを確認するとよいと思います。
今回使うMySQLのコンテナイメージのリポジトリを調べてみるとdocker-entrypoint.shでMYSQL_PASSWORDを使っていることが確認できました。
MySQLの場合はMYSQL_ROOT_PASSWORDなどの環境変数を設定することで、データベース・ユーザーの作成などを自動的に行ってくれるようです。これらの設定はdockerのコンテナの中に入ったときに改めて確認します。
コンテナの中に入ってみる
コンテナの中に入る
コンテナの中に入ってみます。今回はデータベースのコンテナに入ります。
docker-compose exec db bash
もしWindowsの方で以下のようなメッセージが表示された場合は、winptyを頭につければコンテナに入ることができます。
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
winpty docker-compose exec db bash
コンテナ内のデータベース(mysql)に接続する
コンテナの中に入った後は以下のコマンドを実行します。
(root@eb769a915d4d:/# は入力しないでください)
root@eb769a915d4d:/# mysql -U wordpress -D wordpress -p
これはMySQLのデータベースに接続しようとしています。-Uはユーザー名、-Dはデータベース名を示し、-pでパスワードを使用します。ここの設定はdocker-compose.ymlの環境変数で設定したモノになり、ユーザー名などを忘れてしまった場合にはdocker-compose.ymlを確認するとよいと思います。
この実行後パスワードを入力するよう求められるのでwordpressと入力します。
Enter password:
パスワードは入力中の内容が他の人から見られないよう入力したい内容が表示されません。間違ってしまった場合(間違ったような気がした場合)はbackspaceで消しきるか、Ctrl+Cなどで抜けてもう一度MySQLの接続からやり直してみてください。パスワードの入力が正しくできていればデータベースに接続できているはずです。
データベースのテーブルを確認する
テーブルの確認をしてみます。
(mysql> は入力しないでください)
mysql> show tables;
まだWordPressの設定されていないのでテーブルは何も作成されていない状態です。
Empty set (0.00 sec)
データベースから抜ける & コンテナから抜ける
以下のコマンドでデータベースから抜けます。
(mysql> は入力しないでください)
mysql> \q
データベースから抜けるとコンテナの中に入っている状態になりますので以下のコマンドでコンテナから抜けます。
(root@eb769a915d4d:/# は入力しないでください)
root@eb769a915d4d:/# exit
WordPressを設定する
自分のパソコンのブラウザを開いて http://localhost:8000/ に接続します。
接続したら日本語を選択して画面を参考にしながら設定しましょう。
今回はWordPressで何かサイトを作るわけではないので適当に設定します。
無事にWordPressのインストールが完了できたら、改めてデータベースに接続してみます。
WordPressインストール後にデータベースに接続する
いちいちコンテナの中に入ってからデータベースに接続するのは面倒だったりします。以下のコマンドで直接データベースに接続することも可能です。
(the input device is not a TTY. のメッセージが表示されたら頭にwinptyをつけてください)
docker-compose exec db mysql -U wordpress -D wordpress -p
実行できた場合はパスワードを求められると思いますのでwordpressと入力します。
データベースに接続できたらテーブルを取得してみましょう。
mysql> show tables;
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
12 rows in set (0.00 sec)
WordPressのインストールによって必要なテーブルが作成されていることが確認できます。更にユーザーのテーブルを確認してみましょう。
mysql> select * from wp_users \G ;
*************************** 1. row ***************************
ID: 1
user_login: test
user_pass: $P$BTqvOi17OHGROkW0ukBzJk0W356aVu0
user_nicename: test
user_email: test@test.com
user_url: http://localhost:8000
user_registered: 2020-06-23 07:25:13
user_activation_key:
user_status: 0
display_name: test
1 row in set (0.00 sec)
インストール時に設定したユーザー情報があることが確認できました。
確認できたら\qでデータベースから抜けてください。
コンテナを停止させる
以下のコマンドでコンテナを停止させます。
docker-compose down
これでコンテナを停止させることができました。ただし停止するとデータベースの状態が初期化されWordPressの設定などはなくなります。コンテナのデータの永続性については注意する必要があります。永続化させたい場合はdocker-compose.ymlでvolumesの設定を行うなど少し工夫が必要になります。今回は学習内容が多くなってしまうので割愛させていただきます。
学習内容をまとめてみた結果
内容自体は既存のWordPressというサービスを使ってみるだけのカンタンなモノですがdocker-composeを理解しながらとなると学習量は多いと感じました。今回の勉強会ではかなりボリュームがあるとの感想をいただいたので、少し様子を見ながら勉強会の内容を分けていくことも検討しようかなと思います。
といいながらも何か理解しながら作り出すとドンドン進みたく性分なので、そこらへんを上手く付き合いながら取り組んでいきます。
