Comment entrer dans un conteneur Docker?

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 avoir une console sur laquelle je peux parcourir la structure des répertoires 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 à la sortie standard 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  bash 

    Bien entendu, la commande que vous utilisez doit exister dans le système de fichiers du conteneur.

    Dans la commande ci-dessus, est le nom ou l’ID du conteneur cible. Peu importe que vous utilisiez ou non docker compose ; lancez simplement 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é:

     $ 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:  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:  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 exécutant:

     $ 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 entrer 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 sont propres, vous voulez vraiment utiliser SSH. Cela prend quelques étapes, mais cela peut être fait. Voici les commandes que vous utiliseriez 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:

    • openssh-server ne démarre pas dans le conteneur Docker
    • Comment obtenir bash ou ssh dans un conteneur en cours d’exécution en mode d’arrière-plan?
    • Pouvez-vous exécuter des applications graphiques dans un conteneur Docker?
    • Autres approches utiles pour l’access graphique trouvées avec la recherche: Docker X11
    • Si vous utilisez SSHD dans vos conteneurs Docker, vous le faites mal!

    Remarque : cette réponse fait la promotion d’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 ait Bash.

    L’exemple suivant démarre un serveur SSH connecté à 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 sera lancée dans le conteneur avec le nom «my-container».

    Pour plus de conseils 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 à la recherche d’une réponse spécifique à Docker Compose comme je l’ai été, cela vous permet d’accéder facilement à 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 shell Bash pour votre service Web, vous pouvez faire:

     $ docker-compose exec web bash 

    Si vous utilisez Docker sous Windows et que vous souhaitez obtenir un access shell à un conteneur, utilisez ceci:

     winpty docker exec -it  sh 

    Très probablement, vous avez déjà installé Git Bash . Si vous ne le faites pas, assurez-vous de l’installer.

    Utilisation:

     docker attach  

    L’autre façon, bien qu’il y ait un danger, est d’utiliser attach , mais si vous appuyez sur 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 ssortingng 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) 

    Pour vous connecter à cmd dans un conteneur Windows, utilisez

     docker exec -it d8c25fde2769 cmd 

    d8c25fde2769 est l’identifiant du conteneur.

    docker exec sera certainement une solution. Un moyen simple de travailler avec la question que vous avez posée est de monter le répertoire dans Docker dans le répertoire du système local .

    Pour que vous puissiez voir les modifications du chemin local instantanément.

     docker run -v /Users/:/ 

    Pour inspecter les fichiers, exécutez docker run -it /bin/bash pour obtenir un terminal interactif. La liste des images peut être obtenue par des docker images . Contrairement à docker exec cette solution fonctionne également lorsqu’une image ne démarre pas (ou se ferme immédiatement après son exécution).

    Dans certains cas, votre image peut être basée sur les Alpes. Dans ce cas, il lancera:

    OCI runtime exec n’a pas abouti: exec a échoué: container_linux.go: 348: le lancement du processus du conteneur a provoqué “exec: \” bash \ “: fichier exécutable introuvable 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 

    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 consulter le journal des conteneurs et de nombreuses informations sur les conteneurs (dans l’onglet Paramètres) dans cette interface graphique.

    Sélectionnez Kitematic dans le menu

    Cliquez sur exec

    C’est simple !

    Listez toutes vos images Docker:

     sudo docker images 

    Sur mon système, la sortie suivante était affichée:

     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. Maintenant, vous pouvez faire tous les types d’opérations de shell à l’intérieur du conteneur. Tout comme ls , tous les dossiers de la racine du système de fichiers seront ls .

     bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var 

    SOLUTION GOINSIDE

    installer l’outil de ligne de commande goinside avec:

     sudo npm install -g goinside 

    et entrer dans un conteneur de 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 $1 bash -c "stty cols $COLUMNS rows $LINES && bash"; } export -f goinside 

    Non seulement cela permet à tout le monde de pénétrer dans un conteneur en cours d’exécution avec:

     goinside containername 

    Cela résout également un problème de longue date concernant la taille des terminaux de conteneurs Docker fixes . Ce qui est très ennuyeux si vous y faites face.

    En outre, si vous suivez le lien, vous aurez également la possibilité de terminer la commande pour vos noms de conteneur Docker.

    Utilisez cette commande:

     docker exec -it containerid /bin/bash` 

    Une autre option consiste à utiliser nsenter .

     PID=$(docker inspect --format {{.State.Pid}} ) nsenter --target $PID --mount --uts --ipc --net --pid 

    Si vous utilisez Docker Compose, cela vous amènera dans un conteneur Docker.

     docker-compose run container_name /bin/bash 

    À l’intérieur du conteneur, vous accédez à WORKDIR défini dans le fichier Dockerfile. Vous pouvez changer votre répertoire de travail par

     WORKDIR directory_path # Eg /usr/src -> container's path 

    Dans mon cas, pour certaines raisons, je dois vérifier toutes les informations concernant le réseau dans chaque conteneur. Les commandes suivantes doivent donc être valides dans le conteneur …

     ip route netstat ps ... 

    J’ai vérifié toutes ces réponses, pas valide pour moi. J’ai cherché des informations sur d’autres sites. Je n’appendai pas de super lien ici, car ce n’est pas écrit en anglais. Je viens donc de mettre en ligne ce post avec une solution résumée pour les personnes ayant les mêmes exigences que moi.

    Disons que vous avez un conteneur en cours de fonctionnement nommé test de lumière. Suivez les étapes ci-dessous.

    • docker inspect light-test -f {{.NetworkSettings.SandboxKey}} . Cette commande aura la réponse comme /var/run/docker/netns/xxxx .
    • Ensuite, ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx . Le répertoire n’existe peut-être pas, faites d’abord mkdir /var/run/netns .
    • Vous pouvez maintenant exécuter ip netns exec xxxx ip addr show pour explorer le monde réseau dans un 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, à savoir ip netns exec xxxx netstat -antp|grep 8080 .

    Pour docker-composer (Docker4Drupal)

     docker-compose exec php bash 

    J’utilise Docker for Drupal sur un ordinateur portable Linux. Après avoir exécuté le conteneur, j’utilise « docker-compose exec php bash » pour me connecter au conteneur afin que je puisse exécuter des commandos drush. Ça fonctionne bien pour moi.