Я хотел бы сообщить мне docker containers
об их конфигурации так же, как вы можете получить информацию об экземплярах EC2 через метаданные.
Я могу использовать (при условии docker
прослушивания порта 4243
)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
чтобы получить некоторые из его данных, но хотел бы знать, есть ли лучший способ получить хотя бы полный идентификатор контейнера, потому что HOSTNAME
на самом деле он сокращен до 12 символов, и докер, похоже, выполняет с ним «наилучшее совпадение».
Кроме того, как я могу получить внешний IP-адрес хоста докеров (кроме доступа к метаданным EC2, которые характерны для AWS)
/var/run/docker.sock
, можно (тривиально) вырваться из сдерживания, обеспечиваемого докером, и получить доступ к хост-машине. Очевидно, это потенциально опасно.Ответы:
Я обнаружил, что идентификатор контейнера можно найти в / proc / self / cgroup
Итак, вы можете получить идентификатор с помощью:
источник
cat /proc/self/cgroup | grep "docker" | sed s/\\//\\n/g | tail -1
cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1
cat /proc/1/cgroup | grep 'docker/' | tail -1 | sed 's/^.*\///' | cut -c 1-12
basename "$(cat /proc/1/cpuset)"
иbasename "$(head /proc/1/cgroup)"
Если не переопределить, имя хоста кажется коротким идентификатором контейнера в Docker 1.12.
внешне
источник
const os = require('os'); console.log(os.hostname());
InetAddress.getLocalHost().getHostName()
.$HOSTNAME
(например, в сценариях оболочки).Вы можете общаться с докером изнутри контейнера, используя сокет unix через Docker Remote API:
https://docs.docker.com/engine/reference/api/docker_remote_api/
В контейнере вы можете узнать сокращенный идентификатор докера, проверив
$HOSTNAME
env var. Согласно документу, есть небольшая вероятность столкновения, я думаю, что для небольшого количества контейнеров вам не нужно об этом беспокоиться. Я не знаю, как получить полный идентификатор напрямую.Вы можете проверить контейнер аналогично тому, как указано в ответе баньяна :
Отклик:
Кроме того, вы можете передать идентификатор докера в контейнер в файле. Файл находится на «смонтированном томе», поэтому он переносится в контейнер:
Идентификатор докера (сокращенно) будет в файле /mydir/host1.txt в контейнере.
источник
env
не перечисляетHOSTNAME
, ноecho $HOSTNAME
работает.requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
Это получит полный идентификатор контейнера из контейнера:
источник
Мне кажется, что комментарий madeddie выглядит наиболее элегантно:
источник
ВНИМАНИЕ: вы должны понимать риски безопасности этого метода, прежде чем рассматривать его. Краткое изложение риска Джоном :
Внутри контейнера dockerId - это ваше имя хоста. Итак, вы могли:
--volume /var/run/docker.sock:/var/run/docker.sock --privileged
docker inspect $(hostname)
внутри контейнераИзбегайте этого. Делайте это только в том случае, если вы понимаете риски и имеете четкое представление о снижении рисков.
источник
--hostname
опция запуска докера .--hostname
установлено, вы можете использовать комбинацию из этого ответа и комментария от @Jay Taylor в принятом ответе:docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)
чтобы получить всю информацию о запущенном контейнере.Чтобы было проще,
Чтобы получить имя хоста,
или
или
Вывод может быть перенаправлен в любой файл и считан из приложения. Например:
# hostname > /usr/src//hostname.txt
источник
Я обнаружил, что в 17.09 есть самый простой способ сделать это в контейнере докера:
Или, как уже было сказано, более короткая версия с
Или просто:
источник
Docker по умолчанию устанавливает имя хоста для идентификатора контейнера, но пользователи могут изменить это с помощью
--hostname
. Вместо этого проверьте/proc
:Вот удобный однострочник для извлечения идентификатора контейнера:
источник
Вы можете использовать эту командную строку для определения текущего идентификатора контейнера (проверено с помощью docker 1.9).
Затем небольшой запрос к Docker API (вы можете поделиться /var/run/docker.sock), чтобы получить всю информацию.
источник
Некоторые опубликованные решения перестали работать из-за изменений в формате
/proc/self/cgroup
. Вот одна команда GNU grep, которая должна быть немного более устойчивой к изменениям формата:Для справки, вот фрагменты / proc / self / cgroup из контейнеров докеров, которые были протестированы с помощью этой команды:
Linux 4.4:
Linux 4.8 - 4.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/"
источник
Используйте
docker inspect
.Получить ip можно следующим образом.
источник