blog @arfyasu

プログラミングとか趣味のこととか

Docker のコンテナで Apache と MySQL を動かしてみた

f:id:kanz-labs:20150922150817p:plain

前回

前回は、Docker の環境を作りました。

arfyasu.hatenablog.com

今回は、CentOS6 のコンテナに ApacheMySQL 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つ。

  1. -d オプションでバックグラウンドで /sbin/init で起動する。
  2. -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   

f:id:kanz-labs:20150922122456p:plain

起動確認できたので、コンテナを停止します。

$ 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

イメージが作成できました。

動作確認

コミットしたイメージを使って起動します。
今回は、ポートフォワーディングを ApacheMySQL ぞれぞれに対して行います。

$ 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プラグインがデフォルトで有効になっている