公式のMySQLイメージの使用いろいろ試行錯誤しているうちにコンテナ連携にはlinkオプションを使うのがよいことを学びました。あるケースとして、データベースコンテナとクライアントコンテナの連携を例に進めていきたいと思います。今回の例では公式のMySQLイメージを使いたいと思います。公式MySQLイメージはすぐにデータベースを使うことができるように設計されています。run時にいくつかの設定をくっつけてあげれば、パスワード設定、データベース作成等を簡単に行うことができます。@MINOのような初心者にはありがたいイメージです。MySQLサーバコンテナの作成・起動まずは公式のMySQLイメージをpullします。テストなので特にバージョンを指定していません。mysqlこれでローカルに公式のMySQLイメージがダウンロードされたはずです。セットアップに使う環境変数の意味pullができたらrunをするのですが、その前に少し説明しておきたいことがあります。公式MySQLイメージでは簡単にデータベースのセットアップをすることができます。具体的には環境変数をつかったセットアップです。公式MySQLイメージいくつかの環境変数が用意されており、runのeオプションでその変数を設定することができます。環境変数の種類と意味は以下です。パスワードなしでログインできるようにするMYSQL_ROOT_PASSWORDMySQLのrootのパスワードを指定します。この変数の設定は必須です。これを設定しないとエラーが出てrunが成功しません。MYSQL_DATABASEイメージ起動時に作成されるデータベースの名前を指定することができます。ユーザー/パスワードを設定した場合(下記参照)、そのユーザーはこのデータベースへのスーパーユーザになります。ALLに相当します)MYSQL_USER・MYSQL_PASSWORD新しいユーザーを作成・パスワード付与のオプションです。このユーザーはMYSQL_DATABASE変数で指定されたデータベースのスーパーユーザになります。ユーザーを作成するためにはMYSQL_USER・MYSQL_PASSWORD両方の変数が必要です。どちらかだけだとエラーになります。上記を踏まえて、MySQLサーバコンテナを起動させます。コンテナに名前をつけるオプション。rootのパスワード設定。ユーザパスワード設定。作成されるデータベースの名前。コンテナの元になるイメージこれでdbというデータベースを持ち、hogeというユーザがいるMySQLサーバコンテナがバックグラウンドで起動しました。psコマンドで確認してみてください。NAMESがdbというコンテナが起動しているのがわかるかと思います。上記の手順で今ホストPC上にはMySQLサーバコンテナがまるでデーモンのように起動しています。このコンテナと連携するのにlinkオプションを使います。linkオプションを使うには、link対象のコンテナが起動している必要があります。そのため、先ほど起動させたMySQLサーバコンテナは起動させたままにしてください。今度はクライアントを起動させます。コンテナに名前をつけるオプション。–linkオプションで連携するコンテナを指定。iオプションはコンテナの標準入力へのアタッチ。tオプションはttyの割り当て。コンテナの中に入れるようになる。コンテナ起動後にbashシェルを起動させる補足クライアントコンテナのイメージもサーバコンテナでつかったイメージと同じものを使っています。最初なんでかなと思いました。クライントコンテナはデータベースサーバコンテナに命令を与えることが役目ですが、MySQLをコマンドラインで操作したいならクライアントコンテナにもコマンドを打つためにMySQLが導入されている必要があります。同じイメージ(MySQLが入っていれば良い)を使います。PHPなどからMySQLを使うならクライアントにMySQLのインストールは必要なく、PDOなどのエクステンションが導入されていればOKです。クライアントからデータベースを見てみるクライントコンテナを起動させた時点でプロンプトが以下のようにクライントに移行しているかと思います。プロンプトの構成は若干違うかもしれません。@の後ろはコンテナのホスト名なので環境ごとに異なる可能性があります。root@a6e4178c5e6d:/#早速DBサーバコンテナに繋げたいと思いますが、その前にDBサーバコンテナのアドレスを確認しておきます。以下を実行するとずらずらと環境変数がでてくると思います。env出力された環境変数MYSQL_ENV_MYSQL_DATABASE=dbMYSQL_ENV_MYSQL_ROOT_PASSWORD=passwordTERM=xtermMYSQL_VERSION=5.7.10-1debian8MYSQL_PORT_3306_TCP_PORT=3306MYSQL_PORT_3306_TCP=tcp://172.17.0.2:3306PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binMYSQL_ENV_MYSQL_USER=hogePWD=/MYSQL_ENV_MYSQL_PASSWORD=hogepassMYSQL_ENV_MYSQL_VERSION=5.7.10-1debian8HOME=/rootSHLVL=1MYSQL_PORT_3306_TCP_PROTO=tcpMYSQL_NAME=/dbclient3/mysqlMYSQL_MAJOR=5.7MYSQL_PORT_3306_TCP_ADDR=172.17.0.2MYSQL_ENV_MYSQL_MAJOR=5.7MYSQL_PORT=tcp://172.17.0.2:3306すごく乱暴なことを言えば、linkオプションとはこれらの環境変数を吐き出すためのオプションと言えますこの中でMYSQL_PORT_3306_TCP_ADDRとして出力されている172.17.0.2がDBサーバコンテナのアドレスになります。実際は以下のように変数として指定してあげれば172.17.0.2を指定したことになります。dbパスワードを入力してログインに成功すると、以下のようにMySQLのコマンドラインに移行します。statement.mysql>あとはテーブルを作るとかユーザを作るとかすればいいよ。補足・ハマりポイント公式MySQLのデータ永続化について公式MySQLではデータが永続的に使えるように設定されています。データベースだからデータはいちいちなくなったら面倒な場合もありますからね。MySQLコンテナがデータを永続化するために、ホストのどこにディレクトリをマウントしているかについては以下のコマンドで調べることができます。コンテナIDどばっといろんな情報が出力されるますが、以下のようなMountsに関する出力があるかと思います。],Sourceがホスト側のディレクトリ、Destinationがコンテナ側のディレクトリです。この場合/var/lib/mysqlには/var/lib/docker/volumes/4b538bd7dec36757b9cd2133a5e66725812b07745eb324012156465f635c4047/_dataがマウントされているということになります。MySQLで書き込みしたデータは実質的にホストのディレクトリに保存されているということになります。これは公式MySQLのDockerfile内で以下のようにVOLUME指定がされている為です。/var/lib/mysqlこの方法ではホストにデータが依存する形になりますので、可搬性に問題がでてきます。そのため、より自由度を高める為、データを格納することを専門とするボリュームコンテナをこしらえてマウントするの定石とされています(と、もっぱらの噂です)。MySQLの設定の変更my.cnfにて設定を変えたい場合があるかもしれません。公式MySQLのDokcerfileでは以下の方法で設定を変更しています。/etc/mysql/my.cnfにファイルを上書きするsedとawkを使ってワンライナーで設定を変更しています。@MINOはsedとawkはほとんど使ったことがないので勉強しなければなりません。Dockerを使いこなすにはこれらのいわゆる「シェル芸」に慣れる必要があるかもしれません。設定ファイルを別途マウントする方法はありますが、Dockerfile内にワンライナーとして記述できたほうが一元的に設定を管理でき便利な気がします。文字コードについてDocker公式のMySQLはマルチバイト向けの設定になっていない(文字コードがUTF8じゃない)ので、設定を変える必要がありそうです。マルチバイト語族をなめるなよ〜。後記コンテナの連携ができるとだんだんDockerの真価がわかってきたような気がします。開発環境がこれほど簡単に操れるのはすごいことですよね。そりゃ話題にもなりますよね。勉強していきたいと思います。mino長年働いていた会社をリストラされてしまったおっさん。なにを思ったか未経験のプログラミングで再起を図ろうとする。プログラミングを勉強していく上で苦しんだこと、ハマったことを中心に記事を書きます。