サイドカーコンテナをdocker-compose.ymlで指定する方法

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

コンテナにコンテナをサイドカーで引っ付ける方法って結構メジャーだと思うのですが、docker-compose.ymlでの設定方法の解説があまりないんですよね。
Kubernetesには`Pod`という素晴らしい概念があるので、あまり気にせずそっちを使えばいいのですが、dockerでもコマンドラインで実行する以外にもdocker composeで使いたい時ってあるじゃないですか。
でも、なかったので調べて記事しました。

::: note warn
- この方法は`Compose file version 2 reference`には載っているが、Compose file version 3 referenceやCompose specificationには載っていない。
- 今は使えるかもしれないが将来的に使えなくなる可能性があります。

:::

# 1. サイドカーコンテナってなんやねん？

コンテナ・デザイン・パターンの中の「サイドカーパターン」で、メインコンテナに足りない機能を拡張したり、強化したりするために動かすサブコンテナのことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/1134c126-9abd-9f8c-e601-bbc3f3f98a4d.png)

サイドカーとしてコンテナを動かす場合には、LoggingDriverを使ってログを転送するようなものや、Proxyとして動かしたり

# 2. Dockerコマンドを使ったサイドカー

Dockerコマンドを使ったサイドカーコンテナは以下のようにして動かします。
ここでは、nginxコンテナとUbuntuコンテナを組み合わせてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/9a805821-3b34-487d-9197-2636ec2aee69.png)
## 2-1. nginxコンテナを動かす

```
docker run --rm -d -it nginx:1.25
```
実行結果は以下のようになり、コンテナID： `d055d527fe9e`が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/d4ce1901-39fd-9c1f-cb45-c161171d82c8.png)

以下のような状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/b7ede20f-5dfd-4ee0-66b9-b889cb467a6a.png)

## 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`が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/c62ab493-102e-066a-5b88-aab353a465e4.png)
以下のような状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/47b4810e-434e-03aa-4802-32b52866257d.png)

参考資料
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'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/263ff281-ffff-094a-3bb2-38e8bdb47660.png)
nginxとUbuntuのsleepプロセスがあるのが分かります。

- ubuntuのコンテナからプロセスを確認する

```
docker exec -it e4e3d /bin/sh -c 'ps axwwu'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/7110ff0b-ba27-4280-4d1e-3f5ce59a66d7.png)
nginxとUbuntuのsleepプロセスがあるのが分かります。

# 3. docker-compose.ymlでサイドカーコンテナを指定する

以下のようなdocker-compose.ymlファイルを使います。
```yml
version: '3.8'
services:
  nginx:
    image: nginx:1.25
  ubuntu:
    image: ubuntu:22.04
    command: sleep 3000
    pid: "service:nginx"
```

同様に確認すると以下のように両方のプロセスが動いているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/de040350-7a18-4384-1127-9dc0f6adc20b.png)


# 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なサイドカー