Как запустить docker-compose на удаленном хосте?

Я создаю файл локально. Как запустить пакет контейнеров на удаленном хосте, например docker-compose up -d с DOCKER_HOST=<some ip>?

Ответ 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.