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>
?
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
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.
À 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
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).
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.
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
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:
Ctrl+C
Dans le premier terminal.rm -f "$(pwd)"/docker.sock
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).
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
É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"