Mam kontener z uruchomioną usługą Apache na pierwszym planie. Chciałbym mieć dostęp do kontenera z innej powłoki, aby „zajrzeć” do niej i sprawdzić pliki. W tej chwili, jeśli podłączę się do kontenera, pozostanie mi patrząc na demona Apache i nie mogę uruchomić żadnych poleceń.
Czy można dołączyć kolejny tty do działającego kontenera? Być może mogę skorzystać z faktu, że Docker właśnie owija pojemniki LXC? Próbowałem, sudo lxc-console -n [container-id] -t [1-4]
ale wydaje się, że dostępny jest tylko jeden tty i to on uruchamia demona apache. Być może istnieje sposób na włączenie wielu konsol LXC podczas kompilacji?
Wolę nie konfigurować i nie budować kontenera za pomocą usługi openssh, jeśli to możliwe.
docker attach [conainer-id]
?Odpowiedzi:
W dokerze 1.3 pojawiło się nowe polecenie
docker exec
. Umożliwia to wejście do działającego okna dokowanego:źródło
exec
to nie działa jak normalny terminal. Na przykład nie możesz zmienić użytkownika raz w kontenerze.su someuser
do zmiany użytkownika. Uruchamianiedocker exec -it
że w końcu dostarczy w pełni funkcjonalny pseudo tty, ale na razie (wersja Docker 1.9.1) istnieją pewne niedociągnięcia: github.com/docker/docker/issues/8755Powinieneś użyć narzędzia Jérôme Petazzoni o nazwie „nsenter”, aby wejść do kontenera bez użycia SSH. Zobacz: https://github.com/jpetazzo/nsenter
Zainstaluj po prostu uruchamiając:
docker run -v /usr/local/bin:/target jpetazzo/nsenter
Następnie użyj polecenia,
docker-enter <container-id>
aby wejść do kontenera.źródło
docker exec
. Pozwala to wejść do działającego dokera:docker exec -it <container-id> bash
(patrz moja odpowiedź poniżej)docker-enter
nadal istnieje? Daje mi tocommand not found
.Aktualizacja
Począwszy od dokera 0.9, aby poniższe kroki mogły teraz działać, należy teraz zaktualizować
/etc/default/docker
plik za pomocą'-e lxc'
opcji uruchamiania demona dokera przed ponownym uruchomieniem demona (zrobiłem to przez ponowne uruchomienie hosta).To wszystko dlatego, że ...
źródło
Należy pamiętać, że uniemożliwi to „funkcjonowanie” nowej opcjonalnej funkcji dokera 0.11 w sieci tylko dla hosta i będzie widoczny tylko interfejs sprzężenia zwrotnego. Zgłoszenie błędu
Okazuje się, że rozwiązanie innego pytania było również rozwiązaniem tego:
Aktualizacja: wkrótce będziesz musiał użyć
ps --no-trunc
zamiast tegops -notrunc
jest przestarzałe.Znajdź pełny identyfikator kontenera
Wpisz polecenie lxc attach.
Na górze pokazuje mój proces Apache z uruchomionym dokerem.
źródło
Pierwszym krokiem jest uzyskanie identyfikatora kontenera:
docker ps
To pokaże ci coś takiego
1170fe9e9460
jest identyfikatorem kontenera w tym przypadku.Po drugie , wejdź do okna dokowanego:
docker exec -it [container_id] bash
więc w powyższym przypadku:
docker exec -it 1170fe9e9460 bash
źródło
Co z uruchomieniem ekranu tmux / GNU w kontenerze? Wydaje się, że sposób na łatwiejszy dostęp do dowolnej liczby vty jest prosty:
źródło
docker attach
i zauważyłem, że:...the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
nsenter
robi to. Jednak musiałem również wejść do kontenera w prosty sposób i nsenter nie wystarczył na moje potrzeby. W niektórych przypadkach było to błędne (czarny ekran plus flaga -wd nie działa). Ponadto chciałem zalogować się jako konkretny użytkownik w określonym katalogu.W końcu stworzyłem własne narzędzie do wprowadzania pojemników. Można go znaleźć na stronie : https://github.com/Pithikos/docker-enter
Jego użycie jest tak proste, jak
źródło
Sposób „nsinit” to:
zainstaluj nsinit
z wnętrza pojemnika:
z zewnątrz:
Użyj tego
źródło
Zabierze Cię do konsoli kontenerów.
źródło
źródło
Uruchomiłem PowerShell na działającym systemie Microsoft / iOS uruchomionym jako demon
źródło
W systemie Windows 10 mam zainstalowane okno dokowane. Korzystam z Jnekins na kontenerze i napotkałem ten sam komunikat o błędzie. Oto przewodnik krok po kroku, aby rozwiązać ten problem:
Krok 1: Otwórz gitbash i uruchom polecenie docker -p 8080: 8080 -p 50000: 50000 jenkins.
Krok 2: Otwórz nowy terminal.
Krok 3: Wykonaj polecenie „docker ps”, aby uzyskać listę działającego kontenera. Skopiuj identyfikator kontenera.
Krok 4: Teraz jeśli wykonasz polecenie „docker exec -it {identyfikator kontenera} sh” lub „docker exec -it {identyfikator kontenera} bash”, pojawi się komunikat o błędzie podobny do „urządzenie wejściowe nie jest urządzeniem TTY. używając mintty, spróbuj poprzedzić komendę „winpty” ”
Krok 5: Uruchom polecenie „ $ winpty docker exec -it {id kontenera} sh ”
vola !! Jesteś teraz w terminalu.
źródło