web-dev-qa-db-fra.com

Comment exécuter docker-compose sur un hôte distant?

J'ai composer un fichier localement. Comment exécuter un ensemble de conteneurs sur un hôte distant comme docker-compose up -d avec DOCKER_Host=<some ip>?

22
Arsen

Si vous n'avez pas besoin d'exécuter le conteneur Docker sur votre ordinateur local, mais toujours sur le même ordinateur distant, vous pouvez le modifier dans votre paramètre Docker.

Sur la machine locale: Vous pouvez contrôler l'hôte distant avec le paramètre -H

docker -H tcp://remote:2375 pull ubuntu

Pour l'utiliser avec docker-compose, vous devez ajouter ce paramètre dans/etc/default/docker

Sur la machine distante

Vous devez changer l'écoute à partir d'une adresse externe et pas seulement de la prise unix.

Voir Lier Docker à un autre hôte/port ou à un socket Unix pour plus de détails.

Si vous devez exécuter le conteneur sur plusieurs hôtes distants, vous devez configurer Docker Swarm

11
Thibaut

Après la sortie de Docker 18.09. et le (à partir de maintenant) à venir docker-compose v1.23.1 relâchez cela sera beaucoup plus facile. Cette version mentionnée de Docker a ajouté la prise en charge du protocole ssh au DOCKER_Host variable d'environnement et -H argument à docker ... commandes respectivement. Le suivant docker-compose release incorporera également cette fonctionnalité .

Tout d'abord, vous aurez besoin de accès SSH à la machine cible (dont vous aurez probablement besoin avec n'importe quelle approche).

Ensuite, soit:

# Re-direct to remote environment.
export DOCKER_Host="ssh://my-user@remote-Host"

# 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

Ou, si vous préférez, tout en un pour une seule commande:

docker-compose -H "ssh://my-user@remote-Host" up

Une grande chose à ce sujet est que toutes vos variables d'environnement local que vous pourriez utiliser dans votre docker-compose.yml le fichier de configuration est disponible sans avoir à les transférer vers remote-Host en quelque sorte.

19
Dirk

À partir de la documentation de composition

Composer les variables d'environnement CLI

DOCKER_Host

Définit l'URL du démon docker. Comme avec le client Docker, la valeur par défaut est unix: ///var/run/docker.sock.

afin que nous puissions faire

export DOCKER_Host=tcp://192.168.1.2:2375
docker-compose up
8
guillem

Encore une autre possibilité que j'ai découverte récemment est de contrôler un socket Docker Unix distant via un tunnel SSH (crédits à https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab16 = où j'ai appris cette approche).

Prérequis

Vous pouvez SSH dans la machine cible. L'accès sans mot de passe, basé sur des clés est préféré pour la sécurité et la commodité, vous pouvez apprendre comment le configurer par exemple ici: https://askubuntu.com/questions/46930/how-can-i-set-up-password-less-ssh-login

En outre, certaines sources mentionnent que la transmission de sockets Unix via des tunnels SSH n'est disponible qu'à partir de OpenSSH v6.7 (exécutez ssh -V Pour vérifier), je n'ai pas essayé cela sur les anciennes versions.

Tunnel SSH

Maintenant, créez un nouveau tunnel SSH entre un emplacement local et le socket Docker Unix sur la machine distante: ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote

Alternativement, il est également possible de se lier à un port local au lieu d'un emplacement de fichier. Assurez-vous que le port est ouvert pour les connexions et n'est pas déjà utilisé. ssh -nNT -L localhost:2377:/var/run/docker.sock user@someremote

Rediriger le client Docker

Laissez le terminal ouvert et ouvrez-en un second. Là, faites parler votre client Docker au socket tunnel nouvellement créé au lieu de votre socket Docker Unix local.

Si vous êtes lié à un emplacement de fichier:

export DOCKER_Host=unix://$(pwd)/docker.sock

Si vous êtes lié à un port local (exemple de port tel qu'utilisé ci-dessus):

export DOCKER_Host=localhost:2377

Maintenant, exécutez certaines commandes Docker comme docker ps Ou démarrez un conteneur, tirez une image, etc. Tout se passera sur la machine distante tant que le tunnel SSH sera actif. Pour exécuter à nouveau les commandes Docker locales:

  • Fermez le tunnel en appuyant sur Ctrl+C Dans le premier terminal.
  • Si vous êtes lié à un emplacement de fichier: supprimez à nouveau le socket de tunnel temporaire. Sinon, vous ne pourrez pas rouvrir le même ultérieurement: rm -f "$(pwd)"/docker.sock
  • Faites à nouveau parler votre client Docker à votre socket Unix local (qui est la valeur par défaut s'il n'est pas défini): unset DOCKER_Host

La grande chose à ce sujet est que vous économisez les tracas de copier des fichiers docker-compose.yml Et d'autres ressources autour ou de définir des variables d'environnement sur une machine distante (ce qui est difficile).

Tunnel SSH non interactif

Si vous souhaitez l'utiliser dans un contexte de script où un terminal interactif n'est pas possible, il existe un moyen de ouvrir et fermer le tunnel SSH en arrière-plan en utilisant les options SSH ControlMaster et 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   
4
Dirk

Étant donné que vous pouvez vous connecter sur la machine distante, une autre approche pour exécuter docker-compose les commandes sur cette machine doivent utiliser SSH.

Copiez votre docker-compose.yml fichier sur l'hôte distant via scp, exécutez le docker-compose commandes sur SSH, enfin nettoyer en supprimant à nouveau le fichier. Cela pourrait ressembler à ceci:

scp ./docker-compose.yml SomeUser@RemoteHost:/tmp/docker-compose.yml
ssh SomeUser@RemoteHost "docker-compose -f /tmp/docker-compose.yml up"
ssh SomeUser@RemoteHost "rm -f /tmp/docker-compose.yml"

Vous pouvez même le raccourcir et omettre l'envoi et la suppression du docker-compose.yml fichier en utilisant le -f - option pour docker-compose qui attendra le docker-compose.yml fichier à transférer depuis stdin. Il suffit de diriger son contenu vers la commande SSH:

cat docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose -f - up"

Si vous utilisez la substitution de variable d'environnement dans votre docker-compose.yml file, la commande mentionnée ci-dessus ne les remplacera pas par vos valeurs locales sur l'hôte distant et vos commandes peuvent échouer en raison de la suppression des variables. Pour surmonter cela, l'utilitaire envsubst peut être utilisé pour remplacer les variables par vos valeurs locales en mémoire avant de diriger le contenu vers la commande SSH:

envsubst < docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose up"
4
Dirk