Ответ 1
Я обнаружил, что идентификатор контейнера можно найти в /proc/self/cgroup
Итак, вы можете получить идентификатор с помощью:
cat /proc/self/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
Я хотел бы сообщить my docker containers
о своей конфигурации так же, как вы можете получить информацию о экземплярах EC2 через метаданные.
Я могу использовать (при условии, что docker
прослушивает порт 4243
)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
чтобы получить некоторые из его данных, но хотелось бы знать, есть ли лучший способ, по крайней мере, получить полный идентификатор контейнера, потому что HOSTNAME
на самом деле сокращен до 12 символов, а докер, похоже, выполняет "лучший матч" на нем.
Кроме того, как я могу получить внешний IP-адрес узла докера (кроме доступа к метаданным EC2, который относится к AWS)
Я обнаружил, что идентификатор контейнера можно найти в /proc/self/cgroup
Итак, вы можете получить идентификатор с помощью:
cat /proc/self/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
Если не переопределено, имя хоста кажется коротким идентификатором контейнера в 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
Вы можете общаться с докере изнутри контейнера с помощью 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 в контейнере.
Это приведет к полному идентификатору контейнера из контейнера:
cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g'
ВНИМАНИЕ: Вы должны понимать риски безопасности этого метода, прежде чем рассмотреть его. Джон резюме риска:
Предоставляя контейнеру доступ к
/var/run/docker.sock
, [тривиально легко] вырваться из/var/run/docker.sock
, предоставленного/var/run/docker.sock
, и получить доступ к хост-машине. Очевидно, это потенциально опасно.
Внутри контейнера dockerId - это ваше имя хоста. Итак, вы могли бы:
--volume/var/run/docker.sock: /var/run/docker.sock --privileged
docker inspect $(hostname)
внутри контейнераИзбегайте этого. Делайте это только в том случае, если вы понимаете риски и имеете четкое снижение рисков.
Чтобы сделать его простым,
Чтобы получить имя хоста,
hostname
или
uname -n
или
cat /etc/host
Вывод может быть перенаправлен на любой файл и считываться с приложения
Например: # hostname > /usr/src//hostname.txt
Комментарий Мэдедди выглядит наиболее элегантно для меня:
CID=$(basename $(cat /proc/1/cpuset))
Я обнаружил, что в 17.09 есть самый простой способ сделать это в контейнере докеров:
$ cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3
4de1c09d3f1979147cd5672571b69abec03d606afcc7bdc54ddb2b69dec3861c
Или, как уже было сказано, более короткая версия с
$ cat /etc/hostname
4de1c09d3f19
Или просто:
$ hostname
4de1c09d3f19
Докер устанавливает по умолчанию имя хоста 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
Вы можете использовать эту командную строку для идентификации текущего идентификатора контейнера (проверенного с помощью докера 1.9).
awk -F"-|/." '/1:/ {print $3}' /proc/self/cgroup
Затем, небольшой запрос к API Docker (вы можете поделиться /var/run/docker.sock), чтобы получить всю информацию.
awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup
Некоторые опубликованные решения перестали работать из-за изменений в формате /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
В стороне, если у вас есть 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/"
Самый простой способ, который я нашел, это: docker inspect --format = "{{. Id}}"
Используйте 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