Я создаю файл локально. Как запустить пакет контейнеров на удаленном хосте, например docker-compose up -d
с DOCKER_HOST=<some ip>
?
Как запустить docker-compose на удаленном хосте?
Ответ 1
Если вам не нужно запускать Docker-контейнер на локальном компьютере, но все же на том же удаленном компьютере, вы можете изменить это в настройке Docker.
На локальном компьютере: Вы можете управлять удаленным хостом с параметром -H
docker -H tcp://remote:2375 pull ubuntu
Чтобы использовать его с docker-compose, вы должны добавить этот параметр в /etc/default/docker
На удаленной машине
Вы должны изменить прослушивание с внешнего адреса, а не только сокета Unix.
См. Привязка Docker к другому хосту/порту или сокету Unix для получения дополнительной информации.
Если вам нужно запустить контейнер на нескольких удаленных хостах, вы должны настроить Docker Swarm.
Ответ 2
Из составленной документации
Составьте переменные среды CLI
DOCKER_HOST
Устанавливает URL-адрес демона Docker. Как и в случае с клиентом Docker, по умолчанию используется unix:///var/run/docker.sock.
так что мы можем сделать
export DOCKER_HOST=tcp://192.168.1.2:2375
docker-compose up
Ответ 3
Учитывая, что вы можете войти на удаленную машину, другой подход к запуску команд docker-compose
на этом компьютере - использовать SSH
.
Скопируйте файл docker-compose.yml
на удаленный хост через scp
, запустите команды docker-compose
по SSH
, и, наконец, очистите, снова удалив файл.
Это может выглядеть следующим образом:
scp ./docker-compose.yml [email protected]:/tmp/docker-compose.yml
ssh [email protected] "docker-compose -f /tmp/docker-compose.yml up"
ssh [email protected] "rm -f /tmp/docker-compose.yml"
Вы даже можете сделать это короче и опустить отправку и удаление файла docker-compose.yml
с помощью параметра -f -
на docker-compose
, который ожидает, что файл docker-compose.yml
будет передан из stdin
. Просто передайте его содержимое команде SSH
:
cat docker-compose.yml | ssh [email protected] "docker-compose -f - up"
Если вы используете замену переменных среды в файле docker-compose.yml
, вышеупомянутая команда не заменит их локальными значениями на удаленном хосте, и ваши команды могут завершиться неудачно из-за того, что переменные не установлены. Чтобы преодолеть это, утилита envsubst может использоваться для замены переменных вашими локальными значениями в памяти до того, как передать содержимое в команду SSH
envsubst < docker-compose.yml | ssh [email protected] "docker-compose up"
Ответ 4
Еще одна возможность, которую я обнаружил недавно, - это управление удаленным сокетом Docker Unix через туннель SSH (см. Https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160, где я узнал об этом подходе).
необходимое условие
Вы можете SSH на целевой машине. Для обеспечения безопасности и удобства предпочтение отдается парольному доступу на основе ключей. Вы можете узнать, как это настроить, например, здесь: https://askubuntu.com/questions/46930/how-can-i-set-up-password-less-ssh. -авторизоваться
Кроме того, в некоторых источниках упоминается, что пересылка Unix-сокетов через SSH-туннели доступна только начиная с OpenSSH
ssh -V
для проверки запустите ssh -V
), хотя я не пробовал это на более старых версиях.
SSH Tunnel
Теперь создайте новый SSH-туннель между локальным расположением и сокетом Docker Unix на удаленном компьютере: ssh -nNT -L $(pwd)/docker.sock: /var/run/docker.sock [email protected]
Кроме того, можно также привязать к локальному порту вместо расположения файла. Убедитесь, что порт открыт для соединений и еще не используется. ssh -nNT -L localhost:2377: /var/run/docker.sock [email protected]
Перенаправить Docker Client
Оставьте терминал открытым и откройте второй. Там ваш клиент Docker может общаться с только что созданным туннельным сокетом, а не с локальным сокетом Unix Docker.
Если вы привязаны к местоположению файла:
export DOCKER_HOST=unix://$(pwd)/docker.sock
Если вы привязаны к локальному порту (пример порта, как указано выше):
export DOCKER_HOST=localhost:2377
Теперь выполните некоторые команды Docker, такие как docker ps
или запустите контейнер, извлеките образ и т.д. Все будет происходить на удаленной машине, пока туннель SSH активен. Чтобы снова запустить локальные команды Docker:
- Закройте туннель, нажав
Ctrl+C
в первом терминале. - Если вы привязаны к местоположению файла: снова удалите временный туннельный сокет. В противном случае вы не сможете открыть тот же
rm -f "$(pwd)"/docker.sock
позже:rm -f "$(pwd)"/docker.sock
- Заставьте ваш Docker-клиент снова общаться с вашим локальным сокетом Unix (который по умолчанию используется, если не установлен):
unset DOCKER_HOST
Самое замечательное в этом то, что вы избавляете себя от необходимости копировать файлы docker-compose.yml
и другие ресурсы вокруг или устанавливать переменные окружения на удаленной машине (что сложно).
Неинтерактивный SSH-туннель
Если вы хотите использовать это в контексте сценариев, где интерактивный терминал невозможен, есть способ открыть и закрыть туннель SSH в фоновом режиме, используя параметры SSH ControlMaster и ControlPath:
# constants
TEMP_DIR="$(mktemp -d -t someprefix_XXXXXX)"
REMOTE_USER=some_user
REMOTE_HOST=some.host
control_socket="${TEMP_DIR}"/control.sock
local_temp_docker_socket="${TEMP_DIR}"/docker.sock
remote_docker_socket="/var/run/docker.sock"
# open the SSH tunnel in the background - this will not fork
# into the background before the tunnel is established and fail otherwise
ssh -f -n -M -N -T \
-o ExitOnForwardFailure=yes \
-S "${control_socket}" \
-L "${local_temp_docker_socket}":"${remote_docker_socket}" \
"${REMOTE_USER}"@"${REMOTE_HOST}"
# re-direct local Docker engine to the remote socket
export DOCKER_HOST="unix://${local_temp_docker_socket}"
# do some business on remote host
docker ps -a
# close the tunnel and clean up
ssh -S "${control_socket}" -O exit "${REMOTE_HOST}"
rm -f "${local_temp_docker_socket}" "${control_socket}"
unset DOCKER_HOST
# do business on localhost again
Ответ 5
После выпуска Docker 18.09.0 и (на данный момент) грядущей docker-compose v1.23.1
это станет намного проще. В упомянутом выпуске Docker добавлена поддержка протокола ssh
для DOCKER_HOST
среды DOCKER_HOST
и аргумента -H
для команд docker...
соответственно. Следующий релиз docker-compose
будет включать эту функцию.
Прежде всего вам понадобится SSH-доступ к целевой машине (который вам, вероятно, понадобится при любом подходе).
Тогда либо:
# Re-direct to remote environment.
export DOCKER_HOST="ssh://[email protected]"
# Run your docker-compose commands.
docker-compose pull
docker-compose down
docker-compose up
# All docker-compose commands here will be run on remote-host.
# Switch back to your local environment.
unset DOCKER_HOST
Или, если вы предпочитаете, все в одном идти только для одной команды:
docker-compose -H "ssh://[email protected]" up
docker-compose.yml
что все ваши локальные переменные окружения, которые вы можете использовать в файле docker-compose.yml
для настройки, доступны без docker-compose.yml
передачи их в remote-Host
.