web-dev-qa-db-ja.com

Docker、コンテナ内からコンテナ情報を取得する方法は?

docker containersに設定を認識させたいと思います。これは、メタデータを通じてEC2インスタンスに関する情報を取得できるのと同じ方法です。

使用できます(dockerがポート4243でリッスンしている場合)

curl http://172.17.42.1:4243/containers/$HOSTNAME/json

HOSTNAMEは実際には12文字に短縮され、ドッカーは「ベストマッチ」を実行するようですので、データの一部を取得するには、少なくともコンテナの完全なIDを取得するより良い方法があるかどうかを知りたいです。

また、Dockerホストの外部IPを取得するにはどうすればよいですか(AWSに固有のEC2メタデータにアクセスする以外)

101
Alessandro

コンテナIDは/ proc/self/cgroupにあることがわかりました

そのため、次のようにしてIDを取得できます。

cat /proc/self/cgroup | grep -o  -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
63
Thomas A.

オーバーライドしない限り、ホスト名はDocker 1.12の短いコンテナーIDのようです

root@d2258e6dec11:/project# cat /etc/hostname
d2258e6dec11

外部的に

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED                 STATUS                      PORTS               NAMES
d2258e6dec11        300518d26271        "bash"              5 minutes ago       

$ docker -v
Docker version 1.12.0, build 8eab29e, experimental
44
ardochhigh

Docker Remote API経由でUNIXソケットを使用して、コンテナ内からdockerと通信できます。

https://docs.docker.com/engine/reference/api/docker_remote_api/

コンテナーでは、$HOSTNAME env varを調べることで、短縮されたドッカーIDを見つけることができます。 docによると、衝突の可能性はわずかです。コンテナの数が少ない場合、心配する必要はないと思います。フルIDを直接取得する方法がわかりません。

banyan回答で概説されているのと同様の方法でコンテナを検査できます。

GET /containers/4abbef615af7/json HTTP/1.1

応答:

HTTP/1.1 200 OK
Content-Type: application/json

{
         "Id": "4abbef615af7......  ",
         "Created": "2013.....",
         ...
}

または、docker idをファイル内のコンテナーに転送できます。ファイルは「マウントされたボリューム」にあるため、コンテナに転送されます。

docker run -t -i -cidfile /mydir/Host1.txt -v /mydir:/mydir ubuntu /bin/bash

ドッカーID(短縮)は、コンテナーのファイル/mydir/Host1.txtにあります。

32
Jiri

これにより、コンテナ内から完全なコンテナIDが取得されます。

cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g'
20
Prisoner

警告:考慮する前に この方法のセキュリティリスク を理解する必要があります。 John のリスクの要約:

コンテナーに/var/run/docker.sockへのアクセス権を付与することにより、Dockerによって提供される封じ込めから抜け出し、ホストマシンへのアクセスを取得する[簡単に]できます。明らかにこれは潜在的に危険です。


コンテナー内のdockerIdはホスト名です。だから、次のことができます:

  • ホストと同じバージョンのコンテナに docker-ioパッケージ をインストールします
  • --volume /var/run/docker.sock:/var/run/docker.sock --privilegedで開始します
  • 最後に、コンテナ内でdocker inspect $(hostname)を実行します

これは避けてください。リスクを理解し、リスクを明確に軽減している場合にのみ実行してください。

18
Omar Marquez

17.09には、Dockerコンテナ内で最も簡単な方法があることがわかりました。

$ cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3
4de1c09d3f1979147cd5672571b69abec03d606afcc7bdc54ddb2b69dec3861c

または、すでに言われているように、

$ cat /etc/hostname
4de1c09d3f19

または単に:

$ hostname
4de1c09d3f19
8
Adrian Antunez

簡単にするために、

  1. コンテナIDは、Docker内のホスト名です
  2. コンテナ情報は/ proc/self/cgroup内で利用可能です

ホスト名を取得するには、

hostname

または

uname -n

または

cat /etc/Host

出力は任意のファイルにリダイレクトでき、アプリケーションから読み戻すことができます。例:# hostname > /usr/src//hostname.txt

7
Tejas jain

madeddie によるコメントは私にとって最もエレガントに見えます:

CID=$(basename $(cat /proc/1/cpuset))
6
sirex

Dockerはデフォルトでホスト名をコンテナIDに設定しますが、ユーザーは--hostnameでこれを上書きできます。代わりに、/procを調べます。

$ more /proc/self/cgroup
14:name=systemd:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
13:pids:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
12:hugetlb:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
11:net_prio:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
10:perf_event:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
9:net_cls:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
8:freezer:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
7:devices:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
6:memory:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
5:blkio:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
4:cpuacct:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
3:cpu:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
2:cpuset:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
1:name=openrc:/docker

コンテナIDを抽出するための便利なワンライナーは次のとおりです。

$ grep "memory:/" < /proc/self/cgroup | sed 's|.*/||'
7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
6
Wilfred Hughes

このコマンドラインを使用して、現在のコンテナID(docker 1.9でテスト済み)を特定できます。

awk -F"-|/." '/1:/ {print $3}' /proc/self/cgroup

次に、すべての情報を取得するためのDocker API(/var/run/docker.sockを共有できます)への小さなリクエスト。

2
Baptiste Donaux

/proc/self/cgroupの形式の変更により、投稿されたソリューションの一部が機能しなくなりました。以下に、フォーマット変更に対してもう少し堅牢な単一のGNU grepコマンドを示します。

grep -o -P -m1 'docker.*\K[0-9a-f]{64,}' /proc/self/cgroup

参考のために、このコマンドでテストされたdockerコンテナ内の/ proc/self/cgroupの抜粋を以下に示します。

Linux 4.4:

11:pids:/system.slice/docker-cde7c2bab394630a42d73dc610b9c57415dced996106665d427f6d0566594411.scope
...
1:name=systemd:/system.slice/docker-cde7c2bab394630a42d73dc610b9c57415dced996106665d427f6d0566594411.scope

Linux 4.8-4.13:

11:hugetlb:/docker/afe96d48db6d2c19585572f986fc310c92421a3dac28310e847566fb82166013
...
1:name=systemd:/docker/afe96d48db6d2c19585572f986fc310c92421a3dac28310e847566fb82166013
1
kanaka
awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup
0
Andrew Wolfe

余談ですが、コンテナのpidがあり、そのコンテナのdocker IDを取得する場合、nsenterを上記のsedマジックと組み合わせて使用​​するのが良い方法です。

nsenter -n -m -t pid -- cat /proc/1/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"

0
anbhat