docker containers
に設定を認識させたいと思います。これは、メタデータを通じてEC2インスタンスに関する情報を取得できるのと同じ方法です。
使用できます(docker
がポート4243
でリッスンしている場合)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
HOSTNAME
は実際には12文字に短縮され、ドッカーは「ベストマッチ」を実行するようですので、データの一部を取得するには、少なくともコンテナの完全なIDを取得するより良い方法があるかどうかを知りたいです。
また、Dockerホストの外部IPを取得するにはどうすればよいですか(AWSに固有のEC2メタデータにアクセスする以外)
コンテナIDは/ proc/self/cgroupにあることがわかりました
そのため、次のようにしてIDを取得できます。
cat /proc/self/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
オーバーライドしない限り、ホスト名は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
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にあります。
これにより、コンテナ内から完全なコンテナIDが取得されます。
cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g'
警告:考慮する前に この方法のセキュリティリスク を理解する必要があります。 John のリスクの要約:
コンテナーに
/var/run/docker.sock
へのアクセス権を付与することにより、Dockerによって提供される封じ込めから抜け出し、ホストマシンへのアクセスを取得する[簡単に]できます。明らかにこれは潜在的に危険です。
コンテナー内のdockerIdはホスト名です。だから、次のことができます:
--volume /var/run/docker.sock:/var/run/docker.sock --privileged
で開始しますdocker inspect $(hostname)
を実行しますこれは避けてください。リスクを理解し、リスクを明確に軽減している場合にのみ実行してください。
17.09には、Dockerコンテナ内で最も簡単な方法があることがわかりました。
$ cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3
4de1c09d3f1979147cd5672571b69abec03d606afcc7bdc54ddb2b69dec3861c
または、すでに言われているように、
$ cat /etc/hostname
4de1c09d3f19
または単に:
$ hostname
4de1c09d3f19
簡単にするために、
ホスト名を取得するには、
hostname
または
uname -n
または
cat /etc/Host
出力は任意のファイルにリダイレクトでき、アプリケーションから読み戻すことができます。例:# hostname > /usr/src//hostname.txt
madeddie によるコメントは私にとって最もエレガントに見えます:
CID=$(basename $(cat /proc/1/cpuset))
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
このコマンドラインを使用して、現在のコンテナID(docker 1.9でテスト済み)を特定できます。
awk -F"-|/." '/1:/ {print $3}' /proc/self/cgroup
次に、すべての情報を取得するためのDocker API(/var/run/docker.sockを共有できます)への小さなリクエスト。
/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
awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup
余談ですが、コンテナの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/"