Comment entrer dans un conteneur Docker?
je commence à travailler avec Docker. J'utilise L'image de base WordPress et docker-composer.
j'essaie de ssh dans l'un des conteneurs pour inspecter les fichiers/répertoires qui ont été créés pendant la construction initiale. J'ai essayé de courir docker-compose run containername ls -la
, mais ça n'a rien fait. Même si c'était le cas, je préférerais avoir une console où je peux parcourir la structure du répertoire, plutôt que d'exécuter une seule commande. Quelle est la bonne façon de faire avec Docker?
20 réponses
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 utilise un serveur web, par exemple, docker attach
vous connectera probablement au stdout du processus du serveur web. Ça ne vous donnera pas nécessairement une coquille.
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. Par exemple:
docker exec -it <mycontainer> bash
bien sûr, quelle que soit la commande que vous exécutez, elle doit exister dans le système de fichiers 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
; Lancez docker ps
et utilisez soit 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, donnée:
$ 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 courant:
$ docker exec -it d2d4a89aaee9 ip addr
de même, je pourrais démarrer une coque dans le conteneur;
$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
bash en exécution d'un conteneur, tapez ceci:
docker exec -t -i container_name /bin/bash
disons, pour des raisons qui vous sont propres, vous voulez vraiment utiliser SSH. Cela prend quelques mesures, mais cela peut être fait. Voici les commandes que vous exécutez l'intérieur du 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(,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 X11 en redirigeant vers le client SSH:
ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client
voici quelques ressources connexes:
- openssh-server ne démarre pas dans le Panneau contenant
- comment mettre bash ou ssh dans un conteneur courant en mode arrière-plan?
- , vous Pouvez exécuter des applications GUI dans un conteneur Docker?
- autres approches utiles pour l'accès graphique trouvé avec la recherche: Docker X11
- si vous exécutez SSHD dans vos conteneurs Docker, vous êtes de faire le mal!
Notice : cette réponse fait la promotion d'un outil que j'ai écrit.
j'ai créé un serveur SSH containerized 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 a Bash.
l'exemple suivant démarrerait un serveur SSH attaché à un conteneur avec le nom '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
quand vous connectez - vous à ce service SSH (avec votre client SSH de votre choix) une session Bash sera lancée dans le conteneur avec 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'un docker Composez-réponse spécifique comme je l'étais, il fournit un moyen facile d'entrer sans avoir à chercher le conteneur ID généré.
docker-compose exec
prend le nom du service selon votre fichier docker-compose.yml
.
donc pour obtenir un shell Bash pour votre service 'web', vous pouvez faire:
$ docker-compose exec web bash
si vous utilisez Docker sur Windows et que vous voulez 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, veillez à l'installer.
pour se connecter au cmd dans un conteneur Windows, utilisez
docker exec -it d8c25fde2769 cmd
où d8c25fde2769 est le numéro d'identification du conteneur.
docker exec
sera certainement une solution. Une façon facile de travailler avec la question que vous avez demandé est de montage du répertoire à L'intérieur de Docker dans le répertoire du système local .
pour que vous puissiez voir les changements dans le chemin local instantanément.
docker run -v /Users/<path>:/<container path>
Utiliser:
docker attach <container name/id here>
l'autre voie, bien qu'il y ait un danger pour elle, est d'utiliser attach
, mais si vous Ctrl + C pour quitter la session, vous arrêterez également 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)
Dans certains cas, votre image peut être Alpin. Dans ce cas, il lancera:
BEC d'exécution exec a échoué: exec a échoué: container_linux.aller:348: départ processus de conteneur causé "exec: \" bash\": fichier exécutable non trouvé dans $PATH": inconnu
parce que /bin/bash
n'existe pas. Au lieu de cela, vous devez utiliser:
docker exec -it 9f7d99aa6625 ash
ou
docker exec -it 9f7d99aa6625 sh
pour inspecter les fichiers, Lancez 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 aussi dans le cas où une image ne démarre pas (ou cesse immédiatement après le démarrage).
c'est simple !
Liste de toutes vos images Docker:
sudo docker images
sur mon système il a montré 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 courir le premier.
sudo docker run -i -t ubuntu:latest /bin/bash
cela vous donnera le contrôle terminal du conteneur. Maintenant, vous pouvez effectuer tous les types d'opérations shell à l'intérieur du conteneur. Comme faire ls
affichera tous les dossiers à la racine du système de fichiers.
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
si vous avez Docker 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 voir le journal des conteneurs et beaucoup d'informations sur les conteneurs (dans l'onglet Paramètres) dans cette interface graphique aussi.
GOINSIDE SOLUTION
installer goinside
outil en ligne de commande:
sudo npm install -g goinside
et aller à l'intérieur d'un conteneur docker avec une taille de terminal appropriée avec:
goinside docker_container_name
vieille réponse
nous avons mis cet extrait dans ~/.profile
:
goinside(){
docker exec -it bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside
non seulement cela rend tout le monde en mesure d'entrer dans un contenant courant avec:
goinside containername
Elle résout également une longue durée de vie problème fixe sur le Panneau du terminal de conteneurs de tailles . Ce qui est très énervant si tu l'affrontes.
aussi si vous suivez le lien vous aurez la commande completion pour vos noms de conteneur docker aussi.
utilisez cette commande:
docker exec -it containerid /bin/bash`
si vous utilisez Docker Composez alors cela vous conduira à l'intérieur d'un conteneur Docker.
docker-compose run container_name /bin/bash
à l'intérieur du conteneur il vous mènera à WORKDIR défini dans le fichier Dockerfile. Vous pouvez changer votre répertoire de travail par
WORKDIR directory_path # E.g /usr/src -> container's path
dans mon cas, pour certaines raisons, je dois vérifier toutes les informations réseau impliquées dans chaque conteneur. Donc les commandes suivantes doivent être valides dans le conteneur...
ip
route
netstat
ps
...
j'ai vérifié toutes ces réponses, aucune valide pour moi. J'ai recherché des informations dans d'autres sites web. Je n'ajouterai pas de super lien ici, puisqu'il n'est pas écrit en anglais. Donc je viens de mettre en place ce post avec une solution de résumé pour les gens qui ont la même exigence que moi.
Disons que vous avez un container courant appelé light-test. Suivez les étapes ci-dessous.
-
docker inspect light-test -f {{.NetworkSettings.SandboxKey}}
. Cette commande obtiendra la réponse comme/var/run/docker/netns/xxxx
.
- puis
ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx
. Le répertoire peut ne pas exister, faites d'abordmkdir /var/run/netns
.
- maintenant vous pouvez exécuter
ip netns exec xxxx ip addr show
pour explorer le monde du réseau en conteneur.
PS. xxxx
est toujours la même valeur obtenue par la première commande. Et bien sûr, toutes les autres commandes sont valides, i.e. ip netns exec xxxx netstat -antp|grep 8080
.
pour docker-composer (Docker4Drupal)
docker-compose exec php bash
j'utilise Docker pour Drupal sur un Linux ordinateur portable. Après avoir lancé le conteneur, j'utilise ' docker-compose exec php bash
' pour me connecter avec le conteneur afin de pouvoir exécuter des commandos drush. Il fonctionne très bien pour moi.