複数のコンテナを連携させたい時は、Docker Composeを使っています。
Docker Composeを実行すると、各コンテナのログが表示されるのですが、1画面に全てのコンテナのログが表示されます。
コンテナ毎にログを追いたいのですが、途中で他のコンテナのログが表示されて見辛いです。
そこで、コンテナ毎にDocker Composeのログをタブに分けて見れるようにしてみました。
方針
Ubuntuに標準でインストールされている、シェルをタブ切り替えできるようにする「Byobu」というアプリを使いました。
「Byobu」の使い方は別記事にまとめました。
Byobu設定
Byobuをタブを設定して起動するには、まず、タブのセットを定義して、下記のファイルに保存しておきます。
~/.byoku/windows.tmux.<タブのセット名>
そして、環境変数「BYOBU_WINDOWS
」に「タブのセット名」をセットして、Byobuを起動すると、セットしたタブでByobuが起動されます。
$ BYOBU_WINDOWS=<タブのセット名> byobu
ファイルの書き方は下記のとおりです。
まずセッションを作成し、その後ウィンドウを追加していきます。
new-session -n <タブ名> <コマンド> new-window -n <タブ名> <コマンド> new-window -n <タブ名> <コマンド> new-window -n <タブ名> <コマンド> …
設定を動的生成
Byotuのタブ設定ファイルは静的ファイルなので、スクリプトで、Docker Composeのログを表示する度に内容を書き換えるようにします。
view-compose-logs.sh
#!/bin/bash svcs=($(docker-compose config --services)) config="" first_svc=1 for svc in "${svcs[@]}" do if [ "$first_svc" = "1" ]; then config="new-session -n $svc docker-compose logs -f $svc;" first_svc=0 else config="${config}\nnew-window -n $svc docker-compose logs -f $svc;" fi done if [ "$config" != "" ]; then echo -e "$config" > ~/.byobu/windows.tmux.docker_compose_log BYOBU_WINDOWS=docker_compose_log byobu fi
実行
docker-compose up -d
でDocker Composeをログと切り離して起動した後、./view-compose-logs.sh
を実行します。
docker-compose up -d
./view-compose-logs.sh
例えば、Docker Composeで「Jenkins」「phpMyAdmin」「MySQL」を立ち上げた場合
Jenkins
phpMyAdmin
MySQL
と、タブが下に表示され、ログがタブに分けて表示されます。
タブの切り替えは「Alt+左右キー」で行い、「Ctrl+c」でタブを閉じます。
感想など
Ubuntuではデスクトップ環境にMATEを使っています。
今まで、Docker Composeのログをタブで分けて表示するのに、下記のようなスクリプトでMATEのターミナルをタブ表示して行っていました。
#!/bin/bash svcs=($(docker-compose config --services)) for svc in "${svcs[@]}" do mate-terminal --profile=hold -e "docker-compose logs -f $svc" -t $svc --tab done
しかし、MATEターミナルが入っている環境でしか動かないので、SSH接続やWindowsのWSLなど、CUI環境でも使えるように、今回Byobuを使った形に変更しました。