Correcte manier om los te maken van een container zonder deze te stoppen

Wat is in Docker 1.1.2 (nieuwste) de juiste manier om los te koppelen van een container zonder deze te stoppen?

Dus bijvoorbeeld, als ik probeer:

  • docker run -i -t foo /bin/bashof
  • docker attach foo(voor reeds draaiende container)

die me allebei naar een terminal in de container brengen, hoe verlaat ik de terminal van de container zonder deze te stoppen?

exiten CTR+Cstoppen beide de container.


Antwoord 1, autoriteit 100%

Typ Ctrl+pen vervolgens Ctrl+q. Het zal je helpen om de interactieve modus in de daemon-modus te zetten.

Zie https: //docs.docker.com/engine/reference/commandline/cli/#default-key-sequence-to-detach-from-containers:

Eenmaal gekoppeld aan een container, kunnen gebruikers deze loskoppelen en laten draaien met behulp van de CTRL-p CTRL-qtoetsenreeks. Deze reeks ontkoppeltoetsen kan worden aangepast met de eigenschap detachKeys. […]


Antwoord 2, autoriteit 37%

Update:zoals vermeld in onderstaande antwoorden Ctrl+p, Ctrl+qzal nu de interactieve modus in daemon-modus veranderen.


Nou Ctrl+C(of Ctrl+\) zou u moeten loskoppelen van de container, maar het zal de container dodenomdat je hoofdproces een bash is.

Een kleine les over havenarbeider.
De container is geen echt volledig functioneel besturingssysteem. Wanneer u een container uitvoert, neemt het proces dat u start de PID 1 en neemt u de init-kracht aan. Dus wanneer dat proces wordt beëindigd, stopt de daemon de container totdat een nieuw proces wordt gestart (via docker start) (Meer uitleg hierover http://phusion.github.io/baseimage-docker/#intro)

Als je een container wilt die altijd in de ontkoppelde modus draait, raad ik je aan om

docker run -d foo

Met een ssh-server op de container. (de eenvoudigste manier is om de dockerizing openssh-tutorial https://docs.docker.com/engine/ te volgen voorbeelden/running_ssh_service/)

Of u kunt uw container gewoon opnieuw starten via

docker start foo

(het wordt standaard losgekoppeld)


Antwoord 3, autoriteit 32%

Ik heb me hierin verdiept en alle bovenstaande antwoorden zijn gedeeltelijk juist. Het hangt allemaal af van hoe de container wordt gelanceerd. Het komt op het volgende neer wanneer de container werd gelanceerd:

  • was een TTY toegewezen (-t)
  • was stdin opengelaten (-i)

^P^Qwerkt wel, MAARalleen wanneer -ten -iworden gebruikt om te starten de container:

[berto@g6]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518
[berto@g6]$ docker attach test
# here I typed ^P^Q
read escape sequence
# i'm back to my prompt
[berto@g6]$ docker kill test; docker rm -v test
test
test

ctrl+cwerkt wel, MAARalleen wanneer -t(zonder-i) wordt gebruikt om de container te starten:

[berto@g6]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d
[berto@g6]$ docker attach test
^C
[berto@g6]$    

De derde manier om los te maken

Er is echter een manier om los te maken zonder de container te doden; je hebt nog een schil nodig. Samenvattend, dit in een andere shell uitvoeren, losgekoppeld en de container laten draaien met pkill -9 -f 'docker.*attach':

[berto@g6]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518
[berto@g6]$ docker attach test
# here I typed ^P^Q and doesn't work
^P
# ctrl+c doesn't work either
^C
# can't background either
^Z
# go to another shell and run the `pkill` command above
# i'm back to my prompt
[berto@g6]$

Waarom? Omdat je het proces doodt dat je met de container verbond, niet de container zelf.


Antwoord 4, autoriteit 8%

Als u "docker attach "container id" doet, komt u in de container.
Om de container te verlaten zonder de container te stoppen, moet u Ctrl+P+Q

invoeren


Antwoord 5, autoriteit 6%

Ik beschouw het antwoord van Ashwin als het meest correcte, mijn oude antwoord staat hieronder.


Ik wil hier nog een optie toevoegen, namelijk om de container als volgt uit te voeren

docker run -dti foo bash

Je kunt dan de container invoeren en bash uitvoeren met

docker exec -ti ID_of_foo bash

Het is niet nodig om sshd te installeren 🙂


Antwoord 6, autoriteit 5%

Probeer CTRL+P,CTRL+Qom de interactieve modus in daemon te zetten.

Als dit niet werkt en je hebt bijgevoegd via docker attach, kun je loskoppelen door het proces docker attachte beëindigen.

Een betere manier is om de parameter sig-proxy te gebruiken om te voorkomen dat de CTRL+Cnaar uw container wordt doorgegeven:

docker attach --sig-proxy=false [container-name]

Dezelfde optie is beschikbaar voor de opdracht docker run.


Antwoord 7, autoriteit 4%

De standaardmanier om los te koppelen van een interactieve container is Ctrl+PCtrl+Q, maar u kan het overschrijven bij het uitvoeren van een nieuwe container of bij het koppelen aan een bestaande container met behulp van de --detach-keys vlag.


Antwoord 8, autoriteit 2%

U kunt de optie --detach-keysgebruiken wanneer u docker attachuitvoert om de standaard CTRL+P< te overschrijven /kbd>, CTRL+ Qreeks (dat werkt niet altijd).

Bijvoorbeeld, wanneer u docker attach --detach-keys="ctrl-a" testuitvoert en u drukt op CTRL+Aje verlaat de container zonder hem te doden.

Andere voorbeelden:

  • docker attach --detach-keys="ctrl-a,x" test- druk op CTRL+Aen vervolgens op Xom af te sluiten
  • docker attach --detach-keys="a,b,c" test- druk op a, dan B, dan Com af te sluiten

Uittreksel uit de officiële documentatie:

Als je wilt, kun je een overschrijving van de Docker-toetsreeks voor loskoppelen configureren. Dit is handig als de Docker-standaardreeks in strijd is met de toetsenreeks die u voor andere toepassingen gebruikt. Er zijn twee manieren om uw eigen detach-sleutelreeks te definiëren, als een per-container-overschrijving of als een configuratie-eigenschap voor uw gehele configuratie.

Om de volgorde voor een individuele container te negeren, gebruik je de --detach-keys="<sequence>"vlag met het docker attach commando. Het formaat van de <sequence>is ofwel een letter [a-Z], of de ctrl-gecombineerd met een van de volgende:

  • a-z (een enkele kleine letter )
  • @ (at-teken)
  • [ (linker haakje)
  • \ (twee achterwaartse schuine strepen)
  • _ (onderstrepingsteken)
  • ^ (caret)

Deze a, ctrl-a, Xof ctrl-\\waarden zijn allemaal voorbeelden van geldige toetsenreeksen. Zie Configuratiebestandssectie.

Opmerking: dit werkt sinds docker-versie 1.10+ (op het moment van dit antwoord is de huidige versie 18.03)


Antwoord 9, autoriteit 2%

Als u alleen de uitvoer van het proces vanuit de container wilt zien, kunt u een eenvoudige docker container logs -f <container id>doen.

De vlag -fzorgt ervoor dat de uitvoer van de container followedwordt en in realtime wordt bijgewerkt. Erg handig voor foutopsporing of monitoring.


Antwoord 10

In Docker-container moet ten minste één proces worden uitgevoerd, dan zal alleen de container de docker-image (ubuntu,httd..etc, wat het ook is) uitvoeren op achtergrond zonder af te sluiten

Bijvoorbeeld in ubuntu docker-afbeelding ,

Als u een nieuwe container wilt maken met de ontkoppelmodus (met achtergrond ten minste op proces),

docker run -d -i -t f63181f19b2f /bin/bash

het zal een nieuwe container maken voor deze afbeelding(ubuntu) id f63181f19b2f. De container zal in de ontkoppelde modus draaien (op de achtergrond draaiend) op dat moment zal een klein proces ttybash-shell op de achtergrond draaien. dus de container blijft draaien totdat het bash shell-proces stopt.

Gebruik

. om aan de actieve achtergrondcontainer te bevestigen

docker attach  b1a0873a8647

als je de container wilt loskoppelen zonder te verlaten (zonder de bash-shell te doden),
Standaard kunt u ctrl-p,qgebruiken. het zal uit de container komen zonder de container te verlaten (actieve achtergrond. dat betekent zonder de bash-shell te doden).

U kunt de aangepaste opdracht doorgeven tijdens het koppelen aan de container,

docker attach --detach-keys="ctrl-s" b1a0873a8647

deze keer zal de ctrl-p,qescape-reeks niet werken. in plaats daarvan werkt ctrl-svoor het verlaten van de container. u kunt elke sleutel doorgeven, bijv. (ctrl-*)


Antwoord 11

Je kunt het docker cli-proces eenvoudig beëindigen door SEGKILL te verzenden. Als je de container hebt gestart met

docker run -it some/container

Je kunt zijn pid krijgen

ps -aux | grep docker

user   1234  0.3  0.6 1357948 54684 pts/2   Sl+  15:09   0:00 docker run -it some/container

laten we zeggen dat het 1234 is, je kunt het "loskoppelen" met

kill -9 1234

Het is een beetje een hack, maar het werkt!


Antwoord 12

als je docker op Windows gebruikt, mag je de combinatie 'CTRL + D' gebruiken


Antwoord 13

Oud bericht maar gewoon afsluiten en dan opnieuw starten... het probleem is dat als je op een Windows-machine zit, Ctrl p of Ctrl P verbonden zijn met afdrukken... het verlaten van de container zou geen kwaad moeten doen

Other episodes