毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
0. はじめに
コンテナにコンテナをサイドカーで引っ付ける方法って結構メジャーだと思うのですが、docker-compose.ymlでの設定方法の解説があまりないんですよね。
KubernetesにはPod
という素晴らしい概念があるので、あまり気にせずそっちを使えばいいのですが、dockerでもコマンドラインで実行する以外にもdocker composeで使いたい時ってあるじゃないですか。
でも、なかったので調べて記事しました。
- この方法は
Compose file version 2 reference
には載っているが、Compose file version 3 referenceやCompose specificationには載っていない。 - 今は使えるかもしれないが将来的に使えなくなる可能性があります。
1. サイドカーコンテナってなんやねん?
コンテナ・デザイン・パターンの中の「サイドカーパターン」で、メインコンテナに足りない機能を拡張したり、強化したりするために動かすサブコンテナのことです。
サイドカーとしてコンテナを動かす場合には、LoggingDriverを使ってログを転送するようなものや、Proxyとして動かしたり
2. Dockerコマンドを使ったサイドカー
Dockerコマンドを使ったサイドカーコンテナは以下のようにして動かします。
ここでは、nginxコンテナとUbuntuコンテナを組み合わせてみます。
2-1. nginxコンテナを動かす
docker run --rm -d -it nginx:1.25
実行結果は以下のようになり、コンテナID: d055d527fe9e
が起動します。
2-2. Ubuntu 22.04をサイドカーで起動する
2-1にUbuntuコンテナをサイドカーで起動します。--pid=container:d055d527fe9e
を付けます。
docker run --rm -d --pid=container:d055d527fe9e -it ubuntu:22.04 /bin/sh -c 'sleep 3000'
実行結果は以下のようになり、コンテナID: e4e3dab55c68
が起動します。
以下のような状態です。
参考資料
docker run コマンドの --pid オプションで PID namespace を共有する - kakakakakku blog
https://kakakakakku.hatenablog.com/entry/2021/07/19/001536
【Docker】デバッグツールを持ったSideCarを別コンテナにつける方法 - (O+P)ut
https://www.mtioutput.com/entry/docker-what-sidecar
2-3. それぞれのコンテナからプロセスを確認する
- nginxのコンテナからプロセスを確認する
docker exec -it d055d /bin/bash -c 'ps axwwu'
nginxとUbuntuのsleepプロセスがあるのが分かります。
- ubuntuのコンテナからプロセスを確認する
docker exec -it e4e3d /bin/sh -c 'ps axwwu'
nginxとUbuntuのsleepプロセスがあるのが分かります。
3. docker-compose.ymlでサイドカーコンテナを指定する
以下のようなdocker-compose.ymlファイルを使います。
version: '3.8'
services:
nginx:
image: nginx:1.25
ubuntu:
image: ubuntu:22.04
command: sleep 3000
pid: "service:nginx"
同様に確認すると以下のように両方のプロセスが動いているのが確認できます。
4. 参考資料
Services top-level element | Docker Documentation
https://docs.docker.com/compose/compose-file/05-services/#pid
Compose file version 3 reference | Docker Documentation
https://docs.docker.com/compose/compose-file/compose-file-v3/#pid
Compose file version 2 reference | Docker Documentation
https://docs.docker.com/compose/compose-file/compose-file-v2/#pid
pid=container:X in docker-compose does not respect depends_on, any workaround? - Stack Overflow
https://stackoverflow.com/questions/70367830/pid-containerx-in-docker-compose-does-not-respect-depends-on-any-workaround
How to run a sidecar in docker-compose | ilhicas
https://ilhicas.com/2023/01/26/How-to-run-a-sidecar-in-docker-compose.html?expand_article=1
ネットワークでサイドカーできるのは分かるけど、プロセスを見られるようにしたいのでこちらはちょっと違う。
Fluent-Bitをdocker-composeでサイドカーとして使う - nullpo.io
https://www.nullpo.io/2021/05/21/logging-docker-compose-fluent-bit/
LoggingDriverを使う方法
deliveroo/nginx-sidecar: An nginx side-car reverse proxy which can be put in front of application containers.
https://github.com/deliveroo/nginx-sidecar
ReverseProxyなサイドカー