5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

つながるLinuxのしくみを自分なりに整理してみた ─ Dockerと.sockとsystemd

Last updated at Posted at 2025-06-25

はじめに

Linuxで dockerpodman などのコマンドを使っていると、こんな言葉に出会ったことはありませんか?

  • デーモン(daemon)
  • ソケットユニット(.socket
  • ソケットファイル(.sock

「なんとなく聞いたことはあるけど、どれが何の役割だったか曖昧…」
そんな方に向けて、この記事では Docker を例に、これらの 関係性と役割 をやさしく整理してみました。

目指すのは、systemdや各種デーモンを安全に・自信を持って扱うための“第一歩” です!

本記事は、systemdやDockerに関して自分自身が勉強した内容を
初学者の視点で整理・図解した備忘録的なメモです。

正確性には配慮していますが、内容に誤りや認識違いがありましたら、コメントで教えていただけると嬉しいです。

登場人物の紹介

🧞 デーモン

Linux でバックグラウンドに常駐するプログラム。
Docker では dockerd がこれに該当します。
なお、systemd はデーモンたちを統括する司令塔的存在(後述)。

👤「実際の仕事は私が処理しますが、起こされるまでは寝てます」


🚪 ソケットファイル(.sock

UNIXドメインソケットと呼ばれる通信の入口。
CLIや外部アプリはこれを通じてデーモンに話しかけます。

例:/run/docker.sock

🧑‍💻「ここを叩けばデーモンに用件が届く」


🛎️ ソケットユニット(.socket

systemd が持つ、デーモンを起こすための代行者
.sock を先に作って、誰かがアクセスしてきたら .service を起動するという便利な存在です。

👤「デーモンが寝てたら、私が起こしてきます」


systemdとは?── OSの司令塔

systemd は、Linux 起動時に最初に立ち上がる「init システム」(=システム起動時に最初に立ち上がるプロセス)。
システム全体のサービス・マウント・タイマーなどをユニット単位で統一的に管理しています。

たとえば:

ユニット種別 説明
.service デーモンなどの常駐プロセス
.socket ソケット待ち受け(UNIX/TCP 両対応)
.mount マウントポイント管理
.timer タイマー処理(cron の代替のような役割)
.target 複数ユニットのグルーピング

つまり、systemd は単なるデーモン管理ツール にとどまらず、OS 上のリソース・プロセス・起動順序を制御する司令塔 のような偉い存在です。


systemd と Docker の関係を流れで理解する

docker コマンドなどを実行すると、Linux の裏側では何が起きているのか──
ここでは .sock を叩いたときの 具体的な処理の流れを、順を追って説明します。

✅ デーモンが起きているとき

  • CLI が /run/docker.sock を叩くと、デーモン本人が即座に処理します。
  • docker.socket ユニットは反応せず、ぼーっとしてるだけ(仕事なし)。

💤 デーモンが寝ているとき

  • CLI が /run/docker.sock を叩くと、docker.socket ユニットが待ち構えて反応します。
  • systemd が .service を起動 → デーモンが目を覚ます
  • docker.sock ファイルは docker.socket が systemd を通じて自動で作ってくれます。
  • デーモンが起きた後は、以降の通信を引き継いで処理を開始!

流れを図で確認する

docker.socket を有効にしておけば、docker compose up -d したときに
"Cannot connect to the Docker daemon" エラーを回避しやすくなります。

docker.socket を有効にする = 管理の「主導権」を systemd に渡すこと

たとえば docker.socket を有効にするとは、こういうことです:

  • .sock の作成・bind(listen)は systemd が担当
  • .sock にアクセスが来たとき、systemd が .service を起動
  • Docker デーモンは、自分では .sock を作らない

このとき、「Docker のサービスは systemd の管理下にある」と言えます。


補足:「socketを有効にする」は、具体的に何してる?

  • systemctl enable docker.socket
    /etc/systemd/system/sockets.target.wants/ にシンボリックリンクが張られる
  • systemctl start docker.socket
    → systemd が .sock を bind して listen 状態に入る
  • .socket ユニットには [Socket] ListenStream=/run/docker.sock のような記述があり、ここでファイルパスやプロトコル種別が定義されている

さらに詳しく知りたい方は、こちらの記事がとても勉強になります!


よくある疑問

❓ CLI が失敗して「docker.sock がない」と言われるのはなぜ?

  • docker.socket が無効になっている、もしくはデーモンが起きていない可能性があります。

.sock ファイルって消えるもの?

  • はい、揮発性の /run にあるため OS再起動で消えます
  • ただし .socket ユニットが有効なら、再起動時に自動で再生成されます。

.socket は、デーモン起こしたら消える?

  • 消えません。ずっとそこにいます。
  • ただし、デーモンが起きている間は特に仕事をしません(次の出番を待っているだけ)。

用語まとめ

用語 意味 誰が作る? 状態による挙動
デーモン 常駐プロセス systemd または手動で起動 寝てるときは .socket によって起こされる
.sock 通信の入り口(UNIXソケット) systemd(.socket) またはデーモン CLIがここを叩くと通信が始まる
.socket 呼び鈴ユニット(systemd) systemd .sock の作成と、デーモン起動を担当

おわりに:systemd と仲良くなる第一歩として

ここまでの内容で、.sock.socket・デーモンの関係と systemd の仕組みについて基本的なところをお伝えできたと思います。

そして……ちょっと余談ですが、Docker を扱ううえで知っておいてほしい“強さの話” があります👇


🧠 付録:Dockerが「強すぎる」理由と現実的な向き合い方

Docker は、開発者が「簡単に」「何でも」できるように設計された便利ツールです。

しかしその便利さの裏には、「Docker デーモンが root 権限で動いている」という “強すぎる仕組み” が存在します。

つまり docker コマンドを使える人は、事実上ホストの管理者になれてしまう ということ。


⚠️ docker.socket を有効にしているときの注意点

  • docker.socket ユニットが有効だと、systemd が .sock ファイルを作って常に待ち受けます
  • デーモンが停止中でも .sock が存在し続けるため、プロセスやユーザーがいつでも接続を試みることができる状態になります
  • 特に dockerd は root 権限で動作するケースが多く、.sock を通じて制御を奪われると ホスト全体が乗っ取られる危険すら あります

💡 「じゃあ、Dockerを弱くすればいいのでは?」

その発想もアリです。たとえば:

  • Docker を rootless モード で運用する
  • Podman など、rootless を前提とした代替コンテナエンジンを使う

ただし、これらの方法は:

  • ネットワーク設定やパーミッション周りで制限がある
  • 既存の Docker エコシステム(ComposeやCIなど)と完全に互換性がない

といった 運用上のハードルが高く、すぐには採用できない現場も多いです。

※ 実際に某プロダクトでは Podman を使っているが、rootless ではなく rootful モードで運用する判断になったという事例もあります。


現実的な対策は?

Docker の強さは受け入れる。けれど、それを誰でも扱える状態にはしない。

そんな運用が、現実的で安全性と利便性のバランスが取れています。

具体的には:

  • docker.sock にアクセスできるユーザーやグループを 限定する
  • docker コマンドを実行できる人に、明確な運用ルールやアクセス制御を設ける

このようにすることで、Docker の強力な能力を生かしつつ、安全に利用することができます。


✅ まとめ(付録)

  • Docker は便利さと引き換えに「強すぎる力」を持っている
  • docker.socket によって、常に .sock が開かれる=セキュリティリスクにもなる
  • rootless や Podman などの手段もあるが、現実にはハードルがある
  • 使える人を限定するなどのアクセス制御と運用ルールこそが、実践的なセキュリティ対策!

ここまで読んでいただき、ありがとうございました!


🔗 関連記事:セキュリティまわりに興味が湧いたら…

.sock や systemd まわりの仕組みを知ると、次は「じゃあどこに脆弱性が生まれるの?」という話が気になりますよね。

セキュリティ系の記事も書いていますので、興味があればぜひこちらもどうぞ!

👉 DDoS攻撃をちゃんと理解したい人のための入門と設計整理メモ

👉 CORSの誤解を解く:読み取り防御としての本質と限界を整理してみた

👉 CSRF攻撃をちゃんと理解したい人のための入門:CSRFトークンは銀の弾丸ではない!

5
2
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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?