誰でもdocker.sockを説明できますか


130

ファイルにマウントする実際の理由を理解しようとしdocker.sockていdocker-compose.ymlます。自動検出用ですか?

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

回答:


130

docker.sockDockerデーモンがリッスンしているUNIXソケットです。これは、Docker APIのメインエントリポイントです。TCPソケットにすることもできますが、デフォルトではセキュリティ上の理由から、DockerはデフォルトでUNIXソケットを使用します。

Docker CLIクライアントは、デフォルトでこのソケットを使用してDockerコマンドを実行します。これらの設定もオーバーライドできます。

コンテナー内にDockerソケットをマウントする必要がある理由はいくつかあります。別のコンテナー内から新しいコンテナーを起動するようなものです。または、自動サービス検出とロギングの目的で。これにより、攻撃対象が増えるため、Dockerソケットをコンテナー内にマウントする場合は注意してください。コンテナー内で信頼されたコードが実行されている場合、Dockerはデフォルトですべてのコンテナーをルートとして起動するため、Dockerデーモンを実行しているホストを危険にさらす可能性があります。

DockerソケットにはほとんどのインストールでDockerグループがあり、そのグループ内のユーザーはroot権限なしでdockerソケットに対してdockerコマンドを実行できますが、Dockerデーモンはrootとして効果的に実行されるため、実際のdockerコンテナーは引き続きroot権限を取得します(名前空間とcgroupにアクセスするにはroot権限が必要です) 。

それがあなたの質問に答えてくれるといいのですが。

詳細:https : //docs.docker.com/engine/reference/commandline/dockerd/#examples


1
リンク切れ。:おそらく予想1と同様の情報はこれですdocs.docker.com/engine/adminは
ボルハBolilla

7
@boynuxが提供した警告に加えて、Docker Security Best-practicesの記事で詳細を確認できます。この1彼らは言う:「マウント/var/run/docker.sock。コンテナ内では一般的な、まだ非常に危険な練習であるアンの攻撃者が任意のコマンドを実行できるドッキングウィンドウのサービスは、一般的にrootとしてドッカサービスの実行としての全体のホストシステムへのアクセスを提供し、実行することができます。 "
アーノルドシュライバー

36

少し遅れていることはわかっていますが、私の回答で多くの洞察が得られることを願っています

最初にUnixソケットについて話しましょう

ソケットという用語は通常、IPソケットを指します。これらはポート(およびアドレス)にバインドされているものであり、TCP要求を送信し、そこから応答を取得します。

別のタイプのソケットはUnixソケットです。これらのソケットはIPC(プロセス間通信)に使用されます。それらは、Unix Domain Sockets(UDS)とも呼ばれます。Unixソケットは通信にローカルファイルシステムを使用し、IPソケットはネットワークを使用します。

Dockerデーモンは、3種類のソケットを介してDocker Engine APIリクエストをリッスンできますunix, tcp, and fd

デフォルトでは、UNIXドメインソケット(またはIPCソケット)は/var/run/docker.sockに作成されます。

いくつかのライブ例を見てみましょう

Dockerサーバーはこのソケットを使用してREST APIをリッスンし、クライアントはソケットを使用してAPIリクエストをサーバーに送信します。

curlは、--unix-socketフラグを介してUnixソケットと通信できます。Docker Server APIはRESTとして公開されているため、HTTP経由でコマンドを送信する必要があります。また、このサーバーはローカル(ファイルシステムを思い出してください)であるため、URLで任意のホスト名を渡すことができます(またはlocalhostに固執することもできます!サーバーはホスト名を気にせず、パスのみを気にします。

curl --unix-socket /var/run/docker.sock http://localhost/images/json | jq

 [
  {
    "Containers": -1,
    "Created": 1525888860,
    "Id": "sha256:24a77bfbb9ee3aeef9e24766ad6e9fa57f85c67596f154e8916e4f314067e149",
    "Labels": null,
    "ParentId": "",
    "RepoDigests": [
      "postgres@sha256:b06cdddba62f1550a1c674270814e72eaa8734d95912019b4ddc288b650ad67d"
    ],
    "RepoTags": null,
    "SharedSize": -1,
    "Size": 39507096,
    "VirtualSize": 39507096
  }
]

いくつかのコマンド

docker.sockで多くのことができます

この美しい記事をチェックしてください


6

基本的には、ホストDockerデーモンをコンテナーに公開します。そのため、コンテナーからdocker api / clientを呼び出して、ホストでこれらのコマンドを直接呼び出すように、イメージ/コンテナーを開始/停止/ビルドすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.