Докер, как получить информацию о контейнере из контейнера?
Я хотел бы сделать мой docker containers зная их конфигурацию, таким же образом вы можете получить информацию об экземплярах EC2 через метаданные.
Я могу использовать (при условии docker слушает на порту 4243)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
чтобы получить некоторые из его данных, но хотел бы знать, есть ли лучший способ, по крайней мере, получить полный идентификатор контейнера, потому что HOSTNAME на самом деле сокращается до 12 символов и Докер, кажется, выполняет "лучший матч" на оно.
кроме того, как я могу получить внешний IP-адрес хоста docker (кроме доступа к метаданным EC2, которые специфичны для AWS)
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/
в контейнере вы можете узнать короткий идентификатор докера, изучив
$HOSTNAMEenv 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
чтобы было проще,
- идентификатор контейнера - это имя вашего хоста внутри docker
- информация о контейнере доступна внутри /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.scopeLinux 4.8-4.13:
11:hugetlb:/docker/afe96d48db6d2c19585572f986fc310c92421a3dac28310e847566fb82166013 ... 1:name=systemd:/docker/afe96d48db6d2c19585572f986fc310c92421a3dac28310e847566fb82166013
в стороне, если у вас есть 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