Могу ли я запустить Docker Exec с внешней виртуальной машины?

#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

https://docs.docker.com/engine/security/https/

Комментарии:

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. Прочитайте контекстную документацию здесь.