いろいろDockerを試してみて個別にコンテナたてて動かすのはある程度理解出来てきたけど、まだ何も実現出来ていないのもうちょっと実戦に近づきたいところ。
移管したいWEBアプリケーションはmysqlを使っているので、webサーバ用とmysql用のコンテナを分けてlinkする運用を目指してやってみます。
主にこちらを参考にしてます。
http://www.alexecollins.com/docker-linking-containers/
MySQLサーバコンテナ
※ centos6をpullしている必要があります
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
FROM centos:centos6 RUN yum install -y mysql-server RUN echo "NETWORKING=yes" > /etc/sysconfig/network # 外部からmysqlサーバにアクセス可能にする RUN sed -i -e"s/^bind-addresss*=s*127.0.0.1/bind-address = 0.0.0.0/" /etc/my.cnf # パスワードなしrootログインを許可(これがないとmysqld_safeでエラーになる) RUN service mysqld start && sleep 5s && mysql -e "GRANT ALL ON *.* to 'root'@'%'; FLUSH PRIVILEGES" # ポート番号 3306 を外部に公開 EXPOSE 3306 # mysqldを安全に起動 CMD ["/usr/bin/mysqld_safe"] |
イメージをbuildしてコンテナを起動します。
–nameはコンテナに名前をつけられます。これをつけておくコンテナ操作が楽になるのでオススメ。
1 2 3 |
$ sudo docker build -t harada4atsushi/mysql . $ sudo docker run -t -i -d --name mysql harada4atsushi/mysql |
ちゃんと起動してますね。
1 2 3 4 |
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b8caccedb12f harada4atsushi/mysql:latest "/usr/bin/mysqld_saf 23 seconds ago Up 22 seconds 3306/tcp mysql |
ちなみに、DockerfileでMySQLのパスワードなしrootログインを許可しないと下記のようなエラーが発生します。
1 2 3 4 5 6 7 |
$ sudo docker run -t -i --name mysql harada4atsushi/mysql /bin/bash [root@44cc46c0574a /]# /usr/bin/mysqld_safe 141220 04:54:15 mysqld_safe Logging to '/var/log/mysqld.log'. 141220 04:54:16 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 141220 04:54:16 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended |
/var/log/mysqld.log
1 2 |
141220 4:54:16 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist |
次にホストOS側からMySQLコンテナのmysqlに接続してみます。今回はホストOS側にもMySQLが入っていたのでポート13306をMySQLコンテナの3306に転送する設定で起動します。
1 2 |
$ sudo docker run -t -i -d -p 13306:3306 --name mysql harada4atsushi/mysql |
ifconfigでMySQLコンテナへIPアドレスを調べて接続します。成功!
1 2 3 4 |
$ mysql -u root -h 172.17.42.1 --port 13306 mysql> |
クライアント側コンテナ
続いてMySQLサーバコンテナにアクセスするコンテナを作ります。こっちは単純。
Dockerfile
1 2 3 4 5 6 |
FROM centos:centos6 RUN yum -y install mysql CMD ["bash"] |
1 2 3 |
$ sudo docker build -t harada4atsushi/mysql-client . $ sudo docker run -t -i --link mysql:mysql harada4atsushi/mysql-client |
クライアント側コンテナのbashが立ち上がるのでmysql接続を確認する。
1 2 3 4 5 6 7 8 9 10 11 |
# env MYSQL_PORT_3306_TCP_PORT=3306 MYSQL_PORT_3306_TCP=tcp://172.17.0.19:3306 MYSQL_NAME=/cocky_hoover/mysql MYSQL_PORT_3306_TCP_PROTO=tcp MYSQL_PORT_3306_TCP_ADDR=172.17.0.19 MYSQL_PORT=tcp://172.17.0.19:3306 # mysql -u root -h 172.17.0.19 mysql> |
できたああああ!!
おまけ
試行錯誤しながらdocker runをしてるとコンテナが増えまくるのでいらなくなったの削除したくなります。
停止中の全てのコンテナを削除するコマンド
http://blog.n-z.jp/blog/2013-12-24-docker-rm.html
起動中のコンテナはエラーになるので消えません。
1 2 |
$ sudo docker rm `sudo docker ps -a -q` |
あと–nameをつけてrunすると同じ名前でrunできなくなるので古いの消したくなります。
1 2 3 |
$ sudo docker run -t -i --name mysql harada4atsushi/mysql 2014/12/20 14:14:37 Error response from daemon: Conflict, The name mysql is already assigned to 1877e4923691. You have to delete (or rename) that container to be able to assign mysql to a container again. |
これもdocker rmで削除出来ます。
1 2 |
$ sudo docker mysql |

原田 敦

最新記事 by 原田 敦 (全て見る)
- Rails Engineでブログ機能追加するgemを作る - 2015年3月15日
- WEBエンジニア一人だけでサービスを作りきる方法-夫婦のための自動ごはん予定お知らせサービス「GoHaaan」制作でやったこと - 2015年3月7日
- CentOS6でMariaDBのDynamic Columnsを試してみた - 2015年2月28日