Docker管理の課題
複数コンテナ管理のしにくさ
以前、Dockerfileを使ってコンテナを作成し、runコマンドを使ってコンテナを起動する方法を紹介しました。
関連記事
【簡単サーバー構築】Dockerfileでnginxを立ち上げてみよう!
単体のコンテナを起動して、単一のコンテナだけで完結するのであれば、コマンド一発で起動/停止を実行出来るのでそこまで使いづらさを感じることはありませんが、Docker内に複数のコンテナを起動し、それぞれで連携をするような構成にした場合、コマンドを実行する回数が増えてしまい、とても管理しにくい状態になってしまいます。
例として、以下の記事でやったようなRedmineとMySQLを同時に動かす場合を考えてみましょう。
起動するたびにコンテナの台数分コマンドを投げて動かす必要があるのですが、コンテナ数が増えると毎回コマンドを打つのはとても手間になってしまいます。
また、Shellスクリプトにしてもいいですが、多少複雑なスクリプトを書く必要がありちょっと敷居が高いです。
そんな時にDockerCompose
そんな複数のコンテナ管理を簡単にしてくれるツールが「Docker Compose」です。
docker-composeファイルに各コンテナの情報を記載し、起動コマンドで読み込ませることで一気に複数のコンテナを起動することが可能です。
また、docker-comoposeファイルはyaml形式での記述なので、スマートに設定を記述することが出来ます。
今回は直接dockerコマンドで起動していたRedmineとMySQLをdocker-composeで起動するようにリファクタリングしてみましょう。
手順
前提
- Dockerインストール済み(docker for macでインストール可能)
- DockerComposeインストール済み(docker for macでインストール可能)
- RedmineのDockerイメージ取得済み
- MySQLのDockerイメージ取得済み
参考
関連記事
【楽チン素敵】Homebrew Caskを使ってDocker for macのインストールしてみる
関連記事
【炎上回避】 DockerにRedmineをインストールしてプロジェクト管理ツールを導入してみよう
docker-compose.ymlの作成
dockerコマンドで直接2つのコンテナを起動していた部分をdocker-composeに書き直すと以下のようになります。
※docker-composeで動くように多少変更していますversion: '2'
services:
mysql-redmine:
image: sameersbn/mysql:latest
volumes:
- {任意のディレクトリ}/redmine/datastore/mysql:/var/lib/mysql
environment:
- DB_NAME=redmine_production
- DB_USER=redmine
- DB_PASS=redpass
redmine:
image: sameersbn/redmine:3.3.1
ports:
- "80:80"
environment:
- DB_HOST=mysql-redmine
- DB_NAME=redmine_production
- DB_USER=redmine
- DB_PASS=redpass
volumes:
- {任意のディレクトリ}/redmine/datastore/redmine:/home/redmine/data
links:
- mysql-redmine
確認
では、実際に確認してみましょう。
以下のコマンドで起動が出来ます。docker-compose up -d
以下のようなログが出力されてコンテナが起動されます。Creating dockercomposesample_mysql-redmine_1 ... done
Creating dockercomposesample_mysql-redmine_1 ...
Creating dockercomposesample_redmine_1 ... done
http://localhost/にアクセスして以下の画面が表示されればdocker-composeへのリファクタリング完了です。
終わりに
以上のように、起動オプションをファイル管理出来るようになるので可視性や保守性が上がり、起動もコマンド一発で済むようになりました。
dockerの技術はまだまだ発展しており、複数のコンテナを起動してサービスを実現する事も少なくないので、是非docker-composeの導入をされて見てはいかがでしょうか♪
