Docker のコンテナで Apache と MySQL を動かしてみた
前回
前回は、Docker の環境を作りました。
今回は、CentOS6 のコンテナに Apache と MySQL 5.7 をインストールして動かしてみます。
環境
OSX Ysemite 10.10.5
VirtualBox 5.0.4
Docker Machine 0.4.1
Docker 1.8.1
事前作業
Docker 環境
MySQLのインストール
brew install mysql
コンテナ起動
前回作成したコンテナを起動します。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7951e2c1f199 centos:6 "/bin/bash" 1 days ago Exited (137) 1 days ago boring_jones $ docker start boring_jones boring_jones $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7951e2c1f199 centos:6 "/bin/bash" 1 days ago Up 6 seconds boring_jones
Apache の動作確認
Apache のインストール
起動したコンテナに接続し、Apache をインストールします。
$ docker attach boring_jones [root@7951e2c1f199 /]# yum update .... 途中 y 入力 ... Complete! [root@7951e2c1f199 /]# yum install -y httpd .... Complete!
インストールが完了したら、起動確認。
起動時に警告が表示されますが、Apahce の設定の問題なのでとりあえず気にしません。
起動が確認できたら、コンテナ開始時に自動起動するようにします。
[root@7951e2c1f199 /]# service httpd start Starting httpd: httpd: Could not reliably determine the servers fully qualified domain name, using 172.17.0.2 for ServerName [ OK ] [root@7951e2c1f199 /]# chkconfig httpd on [root@7951e2c1f199 /]# chkconfig --list | grep httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@7951e2c1f199 /]# exit exit
コンテナイメージのコミット
Apache のインストールが完了した時点で、イメージをコミットしておきます。
Docker では、コンテナの状態を commit コマンドを使って保存することができます。
docker commit <CONTAINER ID or NAME> <イメージ名>:<タグ名>
今回は、イメージ名を arfyasu/centos6、タグを apache としてコミットします。
$ docker commit boring_jones arfyasu/centos6:apache
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
arfyasu/centos6 apache 9e154c359252 21 seconds ago 423.8 MB
イメージが作成できました。
動作確認
コミットしたイメージを使って起動します。
ポイントは、以下の2つ。
- -d オプションでバックグラウンドで /sbin/init で起動する。
- -p オプションを指定しコンテナにポートフォワーディングしてアクセスできるようにする。今回は、ホストの8080ポートをコンテナの80ポートにマッピングして起動します。
$ docker run -t -i -d -p 8080:80 --name centos6-apache arfyasu/centos6:apache /sbin/init $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc80d2e76117 arfyasu/centos6:apache "/sbin/init" 7 seconds ago Up 7 seconds 0.0.0.0:8080->80/tcp centos6-apache
docker のIPを確認し、ブラウザでアクセスします。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM docker-m * virtualbox Running tcp://192.168.99.100:2376
起動確認できたので、コンテナを停止します。
$ docker stop centos6-apache
引き続き MySQL の動作確認
MySQL のインストール
yum でインストールする際、MySQL のバージョンは 5.1 がデフォルトです。
折角なので、5.7をインストールしましょう。
$ docker start boring_jones $ docker attach boring_jones [root@7951e2c1f199 /]# yum install -y http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm ... Complete! [root@7951e2c1f199 /]# yum install -y --enablerepo=mysql57-community-dmr mysql-community-server .... Complete! [root@7951e2c1f199 /]# mysqld --version mysqld Ver 5.7.8-rc for Linux on x86_64 (MySQL Community Server (GPL))
Apache のインストール同様、起動確認して自動起動するようにします。
[root@7951e2c1f199 /]# service mysqld start Initializing MySQL database: 2015-09-22T02:55:42.819240Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). [ OK ] Starting mysqld: [ OK ] [root@7951e2c1f199 /]# chkconfig mysqld on [root@7951e2c1f199 /]# chkconfig --list | grep mysql mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
root ユーザのパスワードを確認します。
[root@7951e2c1f199 /]# grep password /var/log/mysqld.log 2015-09-22T02:55:43.155996Z 1 [Warning] A temporary password is generated for root@localhost: rPg:)cUoi97a
MySQLサーバーに接続し、ホストから接続可能なユーザーを追加します。
[root@7951e2c1f199 /]# mysql -uroot -p Enter password: ... mysql > ALTER USER root@localhost IDENTIFIED WITH mysql_native_password AS ''; mysql> GRANT ALL ON *.* TO 'user'@'192.168.%' IDENTIFIED BY 'ABcd1"3$';
ユーザーが追加できました。
パスワードは、8文字以上、英大文字小文字数字記号の4種類を含む必要があります。
コンテナイメージのコミット
イメージ名を arfyasu/centos6、タグを apache-mysql としてコミットします。
$ docker commit boring_jones arfyasu/centos6:apache $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE arfyasu/centos6 apache-mysql ef0873c6f23d 28 seconds ago 1.428 GB arfyasu/centos6 apache 9e154c359252 50 minutes ago 423.8 MB
イメージが作成できました。
動作確認
コミットしたイメージを使って起動します。
今回は、ポートフォワーディングを Apache と MySQL ぞれぞれに対して行います。
$ docker run -t -i -d -p 8080:80 -p 13306:3306 --name centos6-web-db arfyasu/centos6:apache-mysql /sbin/init 17581238d073a3edea3e64d1e6a66d225b81042b5ca583ee45dc3223e4c27a5a $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17581238d073 arfyasu/centos6:apache-mysql "/sbin/init" 20 seconds ago Up 20 seconds 0.0.0.0:8080->80/tcp, 0.0.0.0:13306->3306/tcp centos6-web-db bc80d2e76117 arfyasu/centos6:apache "/sbin/init" 46 minutes ago Exited (137) 30 minutes ago centos6-apache
ポートフォワーディングが2つされてることがわかります。
コンテナに起動しているMySQLサーバーへ接続してみましょう。
$ mysql -uuser -h 192.168.99.100 -P 13306 -p Enter password: ... mysql >
接続できました!
ブラウザで「http://192.168.99.100:8080」にアクセスすれば、
Apacheのページが確認できます。
所感
サーバー構築の際、ファイルと同じようにセーブしながら進め、
失敗したら前回保存した場所から再開できたらどんなにいいかと
思ったことがありました。
commit コマンドを使えばそれが可能となるので、かなり便利ですね。
docker file を使った方法はまだ試していませんが、そちらも必要に応じて
勉強したいなと思います。
サービス毎に MySQL のバージョンが異なるアプリケーションを並行
開発する場合にも、困ることがなさそうです。
本当に便利ですね。
もっと早く勉強すればよかったです。
参考
MacでDockerを試してみる - Qiita
日々の覚書: 何も考えずに真っ新なCentOS 6.6にMySQL 5.7をyumで叩き込むメモ
日々の覚書: MySQL 5.7.8以降のrpmパッケージではvalidate_passwordプラグインがデフォルトで有効になっている