#docker #docker-daemon #docker-exec
#docker #docker-daemon #docker-exec
Вопрос:
У меня есть группа контейнеров docker, запущенных на хосте (172.16.0.1). Из-за ограничений размера хоста, на котором запущены контейнеры docker, я пытаюсь настроить платформу автоматического тестирования на другом хосте (172.16.0.2). Мне нужна моя платформа автоматического тестирования, чтобы иметь доступ к контейнерам docker. Я просмотрел документацию docker и не вижу ничего, что говорит о том, как это сделать.
Можно ли запустить docker exec и указать его на хост docker? Я надеялся сделать что-то вроде следующего, но нет возможности указать хост.:
docker exec -h 172.16.0.1 -it my_container bash
Должен ли я использовать другую команду?
Спасибо!
Комментарии:
1. Можете ли вы описать более широкую среду, в которой вам нужно
docker exec
? Обычно я бы зарезервировал его для инструмента отладки; Я бы избегал его написания сценариев, особенно в среде с несколькими хостами, подобной той, которую вы описываете.2. Мы работаем над настройкой конвейера разработки в среде с воздушным зазором. Цель состоит в том, чтобы заставить Дженкинса запускать тесты Cucumber для служб, запущенных в контейнерах docker.
Ответ №1:
Не уверен, зачем это нужно делать docker exec
удаленно. Но в любом случае это достижимо.
Вам нужно убедиться, что ваш демон docker на вашем хосте, на котором запущены ваши контейнеры, прослушивает сокет.
Что-то вроде этого:
# Running docker daemon which listens on tcp socket
$ sudo dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
Теперь взаимодействуйте с демоном docker удаленно с внешней виртуальной машины, используя:
$ docker -H tcp://<machine-ip>:2375 exec -it my-container bash
OR
$ export DOCKER_HOST="tcp://<machine-ip>:2375"
$ docker exec -it my-container bash
Примечание: публичное раскрытие сокета docker в вашей сети сопряжено с серьезными рисками для безопасности. Хотя есть и другие способы предоставить его в зашифрованном сокете HTTPS или по протоколу ssh.
Пожалуйста, внимательно ознакомьтесь с этими документами, прежде чем предпринимать какие-либо попытки:
https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-socket-option
Комментарии:
1. Любой, кто может получить доступ к сокету Docker таким образом, может тривиально внедрить хост . Будьте невероятно осторожны при включении этой опции. Я бы пошел на крупномасштабный пересмотр моей тестовой настройки, чтобы не нуждаться
docker exec
, прежде чем рассматривать этот путь.
Ответ №2:
Если у вас есть SSH на обеих машинах, вы можете легко выполнять команды на удаленном демоне таким образом:
docker -H "ssh://username@remote_host" <your normal docker command>
# for example:
docker -H "ssh://username@remote_host" exec ...
docker -H "ssh://username@remote_host" ps
# and so on
Другой способ сделать то же самое — сохранить -H
значение ключа в DOCKER_HOST
переменной среды:
export DOCKER_HOST=ssh://username@remote_host
# now you can talk to remote daemon with your regular commands
# these will be executed on remote host:
docker ps
docker exec ...
Без SSH вы можете заставить Docker прослушивать TCP. Это потребует от вас некоторых приготовлений для обеспечения безопасности. В этом руководстве рассказывается о создании сертификатов и некоторых основных способах их использования. После этого у вас будет несколько похожее использование:
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem
-H=172.16.0.1:2376
Наконец, вы можете использовать docker context
для сохранения внешних хостов и их конфигурации. Использование контекста позволяет вам легко взаимодействовать с различными удаленными хостами с помощью --context <name>
option. Прочитайте контекстную документацию здесь.