Как я могу получить информацию о контейнере Docker Linux из самого контейнера?

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

[email protected]:/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

Ответ 3

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

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

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

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

GET /containers/4abbef615af7/json HTTP/1.1

Ответ:

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

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

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

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

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

Ответ 4

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

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

Ответ 5

ВНИМАНИЕ: Вы должны понимать риски безопасности этого метода, прежде чем рассмотреть его. Джон резюме риска:

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


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

  • установите пакет docker-io в ваш контейнер с той же версией, что и хост
  • запустите его с --volume/var/run/docker.sock: /var/run/docker.sock --privileged
  • наконец, запустите: docker inspect $(hostname) внутри контейнера

Избегайте этого. Делайте это только в том случае, если вы понимаете риски и имеете четкое снижение рисков.

Ответ 6

Чтобы сделать его простым,

  • Идентификатор контейнера - это имя вашего хоста внутри докеры
  • Информация о контейнере доступна внутри /proc/self/cgroup

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

hostname

или

uname -n

или

cat /etc/host

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

Ответ 7

Комментарий Мэдедди выглядит наиболее элегантно для меня:

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

Ответ 8

Я обнаружил, что в 17.09 есть самый простой способ сделать это в контейнере докеров:

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

Или, как уже было сказано, более короткая версия с

$ cat /etc/hostname
4de1c09d3f19

Или просто:

$ hostname
4de1c09d3f19

Ответ 9

Докер устанавливает по умолчанию имя хоста 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

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

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

Ответ 10

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

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

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

Ответ 11

awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup

Ответ 12

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

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

Для справки, вот фрагменты /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

Ответ 13

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

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

Ответ 14

Самый простой способ, который я нашел, это: docker inspect --format = "{{. Id}}"

Ответ 15

Используйте 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