Je commence à travailler avec Docker. J'utilise l'image de base WordPress et docker-compose.
J'essaie de ssh dans l'un des conteneurs pour inspecter les fichiers/répertoires créés lors de la construction initiale. J'ai essayé d'exécuter docker-compose run containername ls -la
, mais cela n'a rien fait. Même si c'était le cas, je préférerais disposer d'une console permettant de parcourir la structure de répertoire plutôt que d'exécuter une seule commande. Quelle est la bonne façon de faire cela avec Docker?
docker attach
vous permettra de vous connecter à votre conteneur Docker, mais ce n'est pas vraiment la même chose que ssh
. Si votre conteneur exécute un serveur Web, par exemple, docker attach
vous connectera probablement au processus stdout du processus du serveur Web. Cela ne vous donnera pas nécessairement un shell.
La commande docker exec
est probablement ce que vous recherchez; cela vous permettra d'exécuter des commandes arbitraires à l'intérieur d'un conteneur existant. Par exemple:
docker exec -it <mycontainer> bash
Bien sûr, quelle que soit la commande que vous exécutez doit exister dans le système de fichiers du conteneur.
Dans la commande ci-dessus, <mycontainer>
est le nom ou l'ID du conteneur cible. Peu importe que vous utilisiez ou non docker compose
; Il suffit d'exécuter docker ps
et d'utiliser l'ID (une chaîne hexadécimale affichée dans la première colonne) ou le nom (affiché dans la dernière colonne). Par exemple, étant donné:
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web
Je peux courir:
$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope Host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope Host
valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:3/64 scope link
valid_lft forever preferred_lft forever
Je pourrais accomplir la même chose en lançant:
$ docker exec -it d2d4a89aaee9 ip addr
De même, je pourrais démarrer un shell dans le conteneur;
$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
Pour bash dans un conteneur en cours d'exécution, tapez ceci:
docker exec -t -i container_name /bin/bash
Disons que, pour des raisons qui vous appartiennent, vous voulez vraiment utiliser SSH. Cela prend quelques étapes, mais cela peut être fait. Voici les commandes que vous exécuteriez dans le conteneur pour le configurer.
apt-get update
apt-get install openssh-server
mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd
useradd --create-home --Shell /bin/bash --groups Sudo username ## includes 'Sudo'
passwd username ## Enter a password
apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)
Maintenant, vous pouvez même exécuter des applications graphiques (si elles sont installées dans le conteneur) en utilisant le transfert X11 vers le client SSH:
ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client
Voici quelques ressources connexes:
Remarque: cette réponse promeut un outil que j'ai écrit.
J'ai créé un serveur SSH conteneurisé que vous pouvez «coller» à n'importe quel conteneur en cours d'exécution. De cette façon, vous pouvez créer des compositions avec chaque conteneur. La seule exigence est que le conteneur possède Bash.
L'exemple suivant démarre un serveur SSH associé à un conteneur nommé "my-container".
docker run -d -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock \
-e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
jeroenpeeters/docker-ssh
ssh localhost -p 2222
Lorsque vous vous connectez à ce service SSH (avec le client SSH de votre choix), une session Bash est lancée dans le conteneur sous le nom 'my-container'.
Pour plus de pointeurs et de documentation, voir: https://github.com/jeroenpeeters/docker-ssh
SSH dans un conteneur Docker en utilisant cette commande:
Sudo docker exec -i -t (container ID) bash
Si vous êtes ici à la recherche d'une réponse spécifique à Docker Compose comme moi, elle fournit un moyen simple d'entrer sans avoir à rechercher l'ID de conteneur généré.
docker-compose exec
prend le nom du service selon votre fichier docker-compose.yml
.
Donc, pour obtenir un Bash Shell pour votre service Web, vous pouvez faire:
$ docker-compose exec web bash
Si vous utilisez Docker sous Windows et souhaitez obtenir un accès Shell à un conteneur, utilisez ceci:
winpty docker exec -it <container_id> sh
Très probablement, vous avez déjà Git Bash installé. Si vous ne le faites pas, assurez-vous de l'installer.
Dans certains cas, votre image peut être alpine. Dans ce cas, il lancera:
Échec de l'exécution de l'exécution OCI: échec de l'exécution: conteneur_linux.go: 348: démarrage de le processus de conteneur a provoqué "exec: \" bash\": fichier exécutable introuvable dans $ PATH": inconnu
Parce que /bin/bash
n'existe pas. Au lieu de cela, vous devriez utiliser:
docker exec -it 9f7d99aa6625 ash
ou
docker exec -it 9f7d99aa6625 sh
C'est simple !
Répertoriez toutes vos images Docker:
Sudo docker images
Sur mon système, il affiche la sortie suivante:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
bash latest 922b9cc3ea5e 9 hours ago
14.03 MB
ubuntu latest 7feff7652c69 5 weeks ago 81.15 MB
J'ai deux images Docker sur mon PC. Disons que je veux lancer le premier.
Sudo docker run -i -t ubuntu:latest /bin/bash
Cela vous donnera le contrôle terminal du conteneur. Vous pouvez maintenant effectuer tous les types d'opérations Shell à l'intérieur du conteneur. Comme si vous utilisiez ls
, tous les dossiers de la racine du système de fichiers seront affichés.
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
installez l'outil de ligne de commande goinside
avec:
Sudo npm install -g goinside
et entrez dans un conteneur de menu fixe avec une taille de terminal appropriée avec:
goinside docker_container_name
Nous avons mis cet extrait dans ~/.profile
:
goinside(){
docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside
Cela permet non seulement à tout le monde d'entrer dans un conteneur en cours d'exécution avec:
goinside containername
Cela résout également un problème de longue date concernant les tailles fixes des terminaux de conteneurs Docker . Ce qui est très énervant si vous y faites face.
De même, si vous suivez le lien , vous aurez également la commande terminée pour les noms de vos conteneurs Docker.
Pour vous connecter à cmd dans un conteneur Windows, utilisez
docker exec -it d8c25fde2769 cmd
Oùd8c25fde2769est l'identifiant du conteneur.
Utilisez cette commande:
docker exec -it containerid /bin/bash
Utilisation:
docker attach <container name/id here>
L’autre façon, même si elle présente un danger, consiste à utiliser attach
name__, mais si vous Ctrl + C pour quitter la session, vous devez également arrêter le conteneur. Si vous voulez juste voir ce qui se passe, utilisez docker logs -f
.
:~$ docker attach --help
Usage: docker attach [OPTIONS] CONTAINER
Attach to a running container
Options:
--detach-keys string Override the key sequence for detaching a container
--help Print usage
--no-stdin Do not attach STDIN
--sig-proxy Proxy all received signals to the process (default true)
docker exec
sera certainement une solution. Un moyen simple de traiter la question que vous avez posée consiste à monter le répertoire dans Docker dans le répertoire du système local .
Vous pouvez ainsi visualiser instantanément les modifications apportées au chemin local.
docker run -v /Users/<path>:/<container path>
Pour inspecter les fichiers, exécutez docker run -it <image> /bin/bash
pour obtenir un terminal interactif. La liste des images peut être obtenue par docker images
. Contrairement à docker exec
, cette solution fonctionne également dans le cas où une image ne démarre pas (ou se ferme immédiatement après son exécution).
Si Docker est installé avec Kitematic
, vous pouvez utiliser l'interface graphique. Ouvrez Kitematic
à partir de l'icône Docker et dans la fenêtre Kitematic
, sélectionnez votre conteneur, puis cliquez sur l'icône exec
.
Vous pouvez également voir le journal du conteneur et de nombreuses informations sur le conteneur (dans l'onglet Paramètres) dans cette interface graphique.
Si le conteneur est déjà sorti (peut-être à cause d'une erreur), vous pouvez le faire
$ docker run --rm -it --entrypoint /bin/ash image_name
ou
$ docker run --rm -it --entrypoint /bin/sh image_name
ou
$ docker run --rm -it --entrypoint /bin/bash image_name
créer un nouveau conteneur et y insérer un shell. Puisque vous avez spécifié --rm, le conteneur sera supprimé lorsque vous quitterez le shell.
Dans mon cas, pour une ou plusieurs raisons, je dois vérifier toutes les informations relatives au réseau impliqué dans chaque conteneur. Donc, les commandes suivantes doivent être valides dans un conteneur ...
ip
route
netstat
ps
...
J'ai vérifié toutes ces réponses, aucune ne m'a été utile. J'ai recherché des informations sur d'autres sites. Je n’ajouterai pas de super lien ici, car il n’est pas écrit en anglais. Donc, je viens de mettre en ligne ce post avec une solution de synthèse pour les personnes qui ont les mêmes exigences que moi.
Supposons que vous avez un conteneur en cours d'exécution nommé light-test. Suivez les étapes ci-dessous.
docker inspect light-test -f {{.NetworkSettings.SandboxKey}}
. Cette commande obtiendra une réponse semblable à /var/run/docker/netns/xxxx
.ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx
. Le répertoire peut ne pas exister, faites d'abord mkdir /var/run/netns
.ip netns exec xxxx ip addr show
pour explorer le monde réseau dans un conteneur. PS. xxxx
est toujours la même valeur reçue de la première commande. Et bien sûr, toutes les autres commandes sont valides, c'est-à-dire ip netns exec xxxx netstat -antp|grep 8080
.
J'ai créé une fonction de terminal pour faciliter l'accès au terminal du conteneur. C'est peut-être utile pour vous aussi:
Le résultat est donc, au lieu de taper:
docker exec -it [container_id] /bin/bash
tu écriras:
dbash [container_id]
Mettez ce qui suit dans votre ~/.bash_profile (ou tout ce qui vous convient), puis ouvrez une nouvelle fenêtre de terminal et profitez du raccourci:
#usage: dbash [container_id]
dbash() {
docker exec -it "$1" /bin/bash
}
vous pouvez interagir avec le terminal dans le conteneur Docker en passant l'option -ti
docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu
-t signifie terminal -i signifie interactif
Si vous utilisez Docker Compose, cela vous mènera dans un conteneur Docker.
docker-compose run container_name /bin/bash
À l'intérieur du conteneur, vous serez dirigé vers WORKDIR défini dans le fichier Dockerfile. Vous pouvez changer votre répertoire de travail en
WORKDIR directory_path # E.g /usr/src -> container's path
Une autre option consiste à utiliser nsenter .
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
docker exec -it <Container-Id> /bin/bash
Ou en fonction de la coquille, il peut être
docker exec -it <Container-Id> /bin/sh
Vous pouvez obtenir la commande container-Id via docker ps
-i
= interactif
-t
= pour allouer un téléimprimeur