dockerコンテナで構成するLAMP環境 ~初級編~
こんにちは。
開発チームのワイルド担当、まんだいです。
dockerコンテナは本来、一つのdockerコンテナで完結して稼働するものではなく
複数のdockerコンテナが協調して動いて一つのサービスを動かすものです。
まずは、1サーバー内にある2つのdockerコンテナが連携して動くウェブシステムを作ってみたいと思います。
なお、こちらの記事はdockerの基礎をさらってdockerを理解した気になるdocker入門シリーズ、その4となります。
過去のdocker入門シリーズをお読みになりたい場合は、以下のリンクより辿ってみてください。
- 懇切丁寧! コピペでできるdocker入門
- 懇切丁寧! コピペでできるdocker入門 ~Dockerfileとdocker build編~
- PHP実行環境を色々試す! 2016年はDockerコーデで決まり!
今回のゴール
今回は、dockerを使って原始的なLAMP構成を組む事をゴールに進めていきます。
原始的なLAMP構成がどういうものか、僕の頭にある構成を説明すると
- apache+PHPが稼働しているdockerコンテナが一つ
- MySQLが稼働しているdockerコンテナが一つ
- 別々のコンテナを繋いであたかもローカル上にインストールされたように機能し
- VM外から見ると普通のウェブシステムがそれっぽく動いている
こんな状況を想像しています。
これによって
- 複数のコンテナを立ち上げる方法(って程のものではないですが)が分かります
- コンテナ同士を接続する方法が分かります
- これってコンテナを別々のサーバーに置いてもいいんじゃないかと、ふと思い浮かびます
みたいな事がわかればいいなと思います。
適当にwordpressでもインストールしてみて動けばいいなと思っています。
今回も前回同様、virtualboxのubuntu上で作業を進めていきます。
必要なdockerイメージを用意する
今回必要なdockerイメージは
- MySQLのdockerイメージ
- apache + PHPのdockerイメージ
の2つです。
前者は、MySQLの公式dockerイメージ、後者はwordpress入りの公式dockerイメージを使用します。
それでは、MySQLのdockerイメージをdocker hubからpullし、dockerコンテナを起動します。
vagrant@vagrant:~$ docker run --name mymysql -e MYSQL_ROOT_PASSWORD=[mysqlのパスワード] -d mysql:latest Unable to find image 'mysql:latest' locally latest: Pulling from library/mysql 86e6c3163927: Pull complete 68f4b3625ea4: Pull complete 04f7e78a2c8a: Pull complete 1bade56c3b6b: Pull complete dd6387e14c18: Pull complete ca30c0626c9b: Pull complete 0dc5e226a795: Pull complete 6c164b0f04cb: Pull complete 5c74d058f7b5: Pull complete 0fd3b6e12567: Pull complete e8126a9d061e: Pull complete d17cffff8039: Pull complete 1924f4186d05: Pull complete 14961e5db73a: Pull complete Digest: sha256:16de02081c408c41361126aaa718f91693688d39a216a74ac8dab841db050228 Status: Downloaded newer image for mysql:latest 12cb7271b424e8043d7bb36484061f49331a87be25bcd415e4a9a481a6b33c53
dockerコンテナの起動を確認してみます。
vagrant@vagrant:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 12cb7271b424 mysql:latest "/entrypoint.sh mysql" 3 seconds ago Up 3 seconds 3306/tcp mymysql
無事起動していますね。
続いてwordpress入りのdockerイメージをpullし、dockerコンテナを起動します。
vagrant@vagrant:~$ docker run --name mywordpress --link mymysql:mysql -p 8080:80 -d wordpress Unable to find image 'wordpress:latest' locally latest: Pulling from library/wordpress 9482852a6953: Pull complete 81de90fd7f09: Pull complete 57ae0639bf23: Pull complete c4f7968ac19e: Pull complete d06608e0df69: Pull complete 7ab219b6a3ea: Pull complete 049be7b00a71: Pull complete 1ac57811ebb0: Pull complete 5f7f35d35a61: Pull complete e7ff06ab86e9: Pull complete 50cbe3cba4bd: Pull complete ef9f3544f906: Pull complete 0544870563ee: Pull complete 6b7e8b5d0ef6: Pull complete 4fb33229649f: Pull complete d0cabc0feb31: Pull complete 6fb545ed9179: Pull complete 9e9f602b9253: Pull complete 8d3522c82327: Pull complete 26c9007116c8: Pull complete 19faf318b397: Pull complete 04c297e0e874: Pull complete 0b9e66c139d3: Pull complete 52cddd72d1ca: Pull complete 19d7bfb3a2a7: Pull complete 15031c83aa88: Pull complete 9c3238040649: Pull complete 492d7fea8944: Pull complete 676505bb515e: Pull complete eea959e50c85: Pull complete 1029747e7634: Pull complete 155de5677313: Pull complete Digest: sha256:bfd7e102741d73cce4ec58b2d937586c670f31df1c80aeaf4d5c525eb3c6ac06 Status: Downloaded newer image for wordpress:latest 8606df07f39f2a22dbdefd916b42c1747ca1df86f4a012620862c039d110887f
終わったら、dockerコンテナが起動しているか確認してみます。
vagrant@vagrant:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8606df07f39f wordpress "/entrypoint.sh apach" 3 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp mywordpress 12cb7271b424 mysql:latest "/entrypoint.sh mysql" 2 minutes ago Up 2 minutes 3306/tcp mymysql
以上で必要なもののインストールは完了しました。
wordpressのdockerイメージには、MySQLは含まれていませんが、docker hubの説明を読む限り
- 「--link mymysql:mysql」のオプションを追加してインストールすると、mymysqlという名前のdockerコンテナを使用するMySQLのコンテナとしてセットアップされるようです。
- WORDPRESS_DB_HOSTのデフォルト値はリンクしたmysqlコンテナを利用するようになっているので未指定です。
- WORDPRESS_DB_USERは、ひとまずrootユーザーでmymysqlコンテナにアクセスするので未指定です(変更推奨)。
- WORDPRESS_DB_PASSWORDは指定しなかった場合、接続したmysqlコンテナの起動時に設定したMYSQL_ROOT_PASSWORD変数をmysqlコンテナから取得するので改めて指定する必要はないです(変更推奨)。
- WORDPRESS_DB_NAMEはデフォルト値がwordpressになっています。他のDB名がいい場合はその旨記載します。
この辺りを抑えれば、問題なくコンテナを越えてDB接続ができるようです。
ブラウザからwordpressのセットアップを行う
改めてブラウザからwordpressのインストール画面を見てみます。
VMのUbuntu上でdockerを稼働させているので、Vagrantfile内に以下を記述し、ホストPCの18080番ポートをVMの8080番ポートにポートフォワードしています。
config.vm.network "forwarded_port", guest: 8080, host: 18080
VMの8080番ポートは、wordpressのdockerコンテナの80番ポートにポートフォワードしているので、18080番からdockerコンテナの80番に繋がるということになります。
http://localhost:18080/ にアクセスすると、セットアップ画面がぬるっと表示されました。
言語に日本語を選択し、続けるを押下。
ログインに必要な情報を入力すると
完了しました。あら簡単。
続いて、ログインフォームが現れたので、先ほど入力したユーザー名とパスワードを入力すると
ダッシュボードにたどり着きました。
あっという間に終わってしまいましたが、railsなどでちゃんと作ったウェブサービスなら、git clone、rakeコマンドなどもDockerfileに含んでdockerイメージを作ってしまうと、同じようなパターンでデプロイができてしまうのはすごいですね。
また、DBにAWSのRDSを利用するのもIPアドレスを指定するだけで変更できますし、nginxのdockerコンテナを配置してみるなどのアレンジも非常に簡単です。
全てはdockerコンテナをどうリンクさせるか次第です。
以上です。