LoginSignup
10
3

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

0. はじめに

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

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

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

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

image.png

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

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

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

image.png

2-1. nginxコンテナを動かす

docker run --rm -d -it nginx:1.25

実行結果は以下のようになり、コンテナID: d055d527fe9eが起動します。
image.png

以下のような状態です。
image.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
以下のような状態です。
image.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
nginxとUbuntuのsleepプロセスがあるのが分かります。

  • ubuntuのコンテナからプロセスを確認する
docker exec -it e4e3d /bin/sh -c 'ps axwwu'

image.png
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"

同様に確認すると以下のように両方のプロセスが動いているのが確認できます。
image.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なサイドカー

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3