Докер, как получить информацию о контейнере из контейнера?



Я хотел бы сделать мой docker containers зная их конфигурацию, таким же образом вы можете получить информацию об экземплярах EC2 через метаданные.



Я могу использовать (при условии docker слушает на порту 4243)



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


чтобы получить некоторые из его данных, но хотел бы знать, есть ли лучший способ, по крайней мере, получить полный идентификатор контейнера, потому что HOSTNAME на самом деле сокращается до 12 символов и Докер, кажется, выполняет "лучший матч" на оно.



кроме того, как я могу получить внешний IP-адрес хоста docker (кроме доступа к метаданным EC2, которые специфичны для AWS)

642   13  

13 ответов:

я узнал, что идентификатор контейнера можно найти в /proc / self / cgroup

таким образом, вы можете получить идентификатор с помощью :

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

вы можете общаться с docker изнутри контейнера с помощью сокета unix через Docker Remote API:

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

в контейнере вы можете узнать короткий идентификатор докера, изучив $HOSTNAME env var. По словам дока, есть небольшой шанс столкновения, я думаю, что для небольшого количества контейнера вам не нужно беспокоиться об этом. Я не знаю, как получить полный код непосредственно.

вы можете проверить контейнер аналогичным образом, как описано в баньян ответ:

GET /containers/4abbef615af7/json HTTP/1.1

ответ:

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

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

кроме того, вы можете перенести идентификатор docker в контейнер в файле. Файл расположен на "смонтированном томе", поэтому он передается в контейнер:

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

идентификатор докера (сокращенный) будет находиться в файле /mydir/host1.txt в контейнер.

Если не переопределено, имя хоста кажется коротким идентификатором контейнера в Docker 1.12

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

Это позволит получить полный идентификатор контейнера в контейнер:

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

предупреждение: вы должны понять риски безопасности этого метода прежде чем вы это рассмотрите. Джонрезюме риск:

дать доступ в контейнер /var/run/docker.sock, это [тривиально легко] вырваться из сдерживания, предоставляемого docker, и получить доступ к главной машине. Очевидно, что это потенциально опасно.


внутри контейнера dockerId - это ваше имя хоста. Так, вы могли бы:

  • установить докер-io пакет в вашем контейнере с той же версией, что и хост
  • начните с --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

чтобы было проще,

  1. идентификатор контейнера - это имя вашего хоста внутри docker
  2. информация о контейнере доступна внутри /proc / self / cgroup

чтобы получить имя хоста,

hostname

или

uname -n

или

cat /etc/host

вывод может быть перенаправлен в любой файл и считан из приложения Например:# hostname > /usr/src//hostname.txt

Docker устанавливает имя хоста в идентификатор контейнера по умолчанию, но пользователи могут переопределить это с помощью --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

вот удобный однострочный для извлечения идентификатора контейнера:

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

вы можете использовать эту командную строку для идентификации текущего идентификатора контейнера (проверено с помощью docker 1.9).

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

затем небольшой запрос к Docker API (вы можете поделиться /var/run/docker.носок), чтобы получить всю информацию.

некоторые опубликованные решения перестали работать из-за изменений в формате /proc/self/cgroup. Вот одна команда GNU grep, которая должна быть немного более надежной для изменения формата:

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

для справки, вот фрагменты /proc / self/cgroup из внутренних контейнеров docker, которые были протестированы с помощью этой команды:

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'[:/]' '(( == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup

в стороне, если у вас есть pid контейнера и вы хотите получить идентификатор docker этого контейнера, хороший способ-использовать nsenter в сочетании с магией sed выше:

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

использовать docker inspect.

$ docker ps # get conteiner id
$ docker inspect 4abbef615af7
[{
    "ID": "4abbef615af780f24991ccdca946cd50d2422e75f53fb15f578e14167c365989",
    "Created": "2014-01-08T07:13:32.765612597Z",
    "Path": "/bin/bash",
    "Args": [
        "-c",
        "/start web"
    ],
    "Config": {
        "Hostname": "4abbef615af7",
...

можно получить ip следующим образом.

$ docker inspect -format="{{ .NetworkSettings.IPAddress }}" 2a5624c52119
172.17.0.24

Comments

    Ничего не найдено.