さくらのDocker入門
Dockerの理解を深めるために、さくらのDocker入門を見ながら実際に手を動かしていきました。すると、早速理解できていないことに気づきました。
1 | docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7 |
この部分です。docker runの--linkオプションの意味を理解していなかったので、手元にあるDocker実践ガイドで--linkオプションの説明を探しました。
linkオプションについて
mw0001というコンテナの起動で--link mariadb0001:db0001オプションを利用しており、その説明は以下のようになっていました。
- これから起動するコンテナ
mw0001は、稼働中のコンテナmariadb0001とリンクを張る - コンテナ
mw0001において、mariadb0001コンテナの環境変数を取得することができる db0001はエイリアス名であるmw0001が取得できるmariadb0001コンテナの環境変数名には、エイリアス名を大文字にした文字列が付与される
ということなので、エイリアス名を大文字にしたDB0001をprefixとした環境変数として、mariadb0001コンテナの環境変数を取得できるのだろうことはわかりました。
上記の説明の次のページになんのためにlinkオプションを利用するのかが記載されていました。
Column linkとは
Dockerにおけるlinkは、単一のDocker環境内で稼働する複数のコンテナ間において、コンテナの環境変数を他のコンテナで利用する機能です。
コンテナは、起動するたびにIPアドレスなどが変わるため、コンテナ間で通信を行う際に、環境変数に定義されたIPアドレスやポート番号を環境変数に定義し、その環境変数を別のコンテナで利用できるようにします。
なるほど、そういう目的なのですね。実際に試してみます。
コンテナmariadb0001の作成
まず、MariaDBのコンテナを作成します。本にしたがって行いますので、ベースイメージはcentos:7.5.1804となります。
yumリポジトリの追加
MariaDBの最新版を導入するため、リポジトリファイルを用意し、yum.mariadb.orgで提供されるリポジトリを使えるようにします。
1 | [mariadb] |
書籍のbaseurlはアクセスできなかったので修正しました。
Dockerfileの作成
Dockerfileは書籍のものを記載(したつもりでした)。
1 | FROM centos:7.5.1804 |
Dockerfileに記載のENTRYPOINTのシェルを準備したり、MariaDBの設定ファイルの準備も行いました。
イメージのビルド
では早速imageをbuildします。Dockerfileがあるディレクトリに移動し、以下のコマンドを実行します。
1 | $ docker image build -f Dockerfile -t centos:mariadb0001 . |
ということで、無事ビルドできました。
コンテナの起動
ビルドしたイメージからコンテナを起動します。
1 | $ docker run -d -e DBNAME=testdb -e MARIADBUSER=root -e MARIADBPASSWORD=mysqlPassword -v /var/lib/mysql:/var/lib/mysql:rw --name mariadb0001 centos:mariadb0001 |
起動したコンテナのIDが返ってきました。
無事起動できていると思いきや
1 | $ docker ps -a |
Exited…止まってしまっています…
起動しない原因の調査
まずはログをみてみます。
1 | $ docker logs 1ad8c112f237 |
DockerfileでCOPYしているはずのファイルがないと言われています。そんなはずはないと思って、なんどか再ビルドしたりしてみましたが全く変化がありません。
検索して出てくる結果は、docker image buildのタイミングでNo such file or directoryエラーが出るというものばかりで、docker container runのタイミングでエラーになるケースは見当たりません。
エラーの原因
もう一度Dockerfileをよくみてみました。すると、書籍はファイルパスがダブルクォートで括られていましたが、自分のDockerfileはシングルクォートになっていました。
もしやと思ってダブルクォートに変更後、再ビルド→起動してみると、無事起動しました!
1 | $ docker ps -a |
ダブルクォートで記載しないといけない点に関しては公式ドキュメントにも記載がありました。
こちらの下の方に注釈があり、その中で記載されています。
1 | exec 形式は JSON 配列として解釈されます。 |
なるほど、JSONなのですね、JSONでは文字列を括るのはダブルクォートでないとエラーになってしまいます。そういうことなのですね。
まとめ
Dockerfileでのexec形式([]で引数を取るパターン)では、文字列をダブルクォートで括るということを忘れないようにします。
次回はちゃんとlinkのテストを行いたいと思います。
その他
この調査でよく使ったコマンド
docker container prune
止まっているコンテナを一括削除docker ps -a
全てのコンテナの一覧表示docker logs <コンテナID>
コンテナのログを出力する。エラーが起こった時には真っ先に確認するdocker image rm <イメージ名>
指定したイメージを削除する