Jak dostać się do kontenera dokującego?
Zaczynam współpracę z Dockerem. Używam podstawowego obrazu WordPress i Docker-compose.
Próbuję SSH do jednego z kontenerów, aby sprawdzić pliki / katalogi, które zostały utworzone podczas początkowej kompilacji. Próbowałem uciec docker-compose run containername ls -la
, ale to nic nie dało. Nawet gdyby tak było, wolałbym mieć konsolę, w której mogę poruszać się po strukturze katalogów, niż uruchamiać pojedyncze polecenie. Jak to zrobić z Dockerem?
20 answers
docker attach
pozwoli Ci połączyć się z kontenerem Docker, ale to nie to samo co ssh
. Jeśli na przykład twój kontener działa na serwerze WWW, docker attach
prawdopodobnie połączy Cię z stdout procesu serwera www. To niekoniecznie da ci skorupę.
Polecenie docker exec
jest prawdopodobnie tym, czego szukasz; pozwoli Ci to uruchomić dowolne polecenia wewnątrz istniejącego kontenera. Na przykład:
docker exec -it <mycontainer> bash
Oczywiście, jakąkolwiek jesteś komendą uruchamianie musi istnieć w systemie plików kontenera.
W powyższym poleceniu {[9] } jest nazwa lub ID docelowego kontenera. Nie ma znaczenia, czy używasz docker compose
; po prostu uruchom docker ps
i użyj ID (szesnastkowy Ciąg wyświetlany w pierwszej kolumnie) lub nazwy (wyświetlany w ostatniej kolumnie). Np. podane:
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web
Mogę biec:
$ 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
Mógłbym osiągnąć to samo biegnąc:
$ docker exec -it d2d4a89aaee9 ip addr
Podobnie mógłbym uruchomić powłokę w Pojemnik;
$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 16:44:52
Aby wbić do działającego kontenera, wpisz to:
docker exec -t -i container_name /bin/bash
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-11 01:34:24
Powiedzmy, że z powodów, które są Twoje, naprawdę chcesz używać SSH. To wymaga kilku kroków, ale można to zrobić. Oto polecenia, które można uruchomić wewnątrz kontenera, aby go skonfigurować...
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)
Teraz możesz nawet uruchamiać aplikacje graficzne (jeśli są zainstalowane w kontenerze) za pomocą przekierowania X11 do klienta SSH:
ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client
Oto kilka powiązanych zasobów:
- openssh-serwer nie uruchamia się w kontenerze Docker
- Jak uzyskać bash lub ssh do działającego kontenera w trybie tła?
- Czy można uruchamiać aplikacje GUI w kontenerze Docker?
- inne przydatne metody dostępu graficznego znalezione za pomocą wyszukiwania: Docker X11
- jeśli uruchomisz SSHD w kontenerach Docker, robisz to źle!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 13:16:07
Notice: ta odpowiedź Promuje narzędzie, które napisałem.
Stworzyłem kontenerowy serwer SSH, który można 'przykleić' do każdego działającego kontenera. W ten sposób można tworzyć kompozycje z każdym kontenerem. Jedynym wymogiem jest to, że kontener ma Bash.
Poniższy przykład uruchomi serwer SSH dołączony do kontenera o nazwie "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
Po połączeniu się z tą usługą SSH (z wybranym klientem SSH) sesja Bash będzie zaczęło się w kontenerze od nazwy "my-container".
Aby uzyskać więcej wskazówek i dokumentacji zobacz: https://github.com/jeroenpeeters/docker-ssh
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-25 19:19:09
SSH do kontenera dokera używając tego polecenia:
sudo docker exec -i -t (container ID) bash
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-25 19:19:28
Jeśli szukasz odpowiedzi specyficznej dla Dockera, tak jak ja, zapewnia ona łatwy dostęp bez konieczności sprawdzania wygenerowanego identyfikatora kontenera.
docker-compose exec
pobiera nazwę usługi według Pliku docker-compose.yml
.
Więc aby uzyskać powłokę Bash dla usługi 'web', możesz zrobić:
$ docker-compose exec web bash
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 18:34:33
Jeśli używasz Dockera w systemie Windows i chcesz uzyskać dostęp powłoki do kontenera, użyj tego:
winpty docker exec -it <container_id> sh
Najprawdopodobniej masz już zainstalowany Git Bash. Jeśli tego nie zrobisz, upewnij się, że go zainstalujesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 09:04:32
Aby połączyć się z cmd w kontenerze Windows, użyj
docker exec -it d8c25fde2769 cmd
Gdzie d8c25fde2769 jest identyfikatorem kontenera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 13:38:50
docker exec
na pewno będzie rozwiązaniem. Łatwym sposobem pracy z zadanym pytaniem jest zamontowanie katalogu wewnątrz Dockera do katalogu lokalnego systemu .
Tak, że można zobaczyć zmiany w ścieżce lokalnej natychmiast.
docker run -v /Users/<path>:/<container path>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-25 19:17:53
Użycie:
docker attach <container name/id here>
Innym sposobem, choć istnieje niebezpieczeństwo, jest użycie attach
, ale jeśli Ctrl + C aby zakończyć sesję, zatrzymasz również kontener. Jeśli chcesz zobaczyć, co się dzieje, użyj 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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 13:34:48
W niektórych przypadkach obraz może być oparty na Alpach. W tym przypadku rzuci:
Oci runtime Exec failed: exec failed: container_linux.idź do strony:348: początek proces kontenera wywołany "exec: \" bash\": plik wykonywalny nie został znaleziony w $PATH": unknown
Ponieważ /bin/bash
nie istnieje. Zamiast tego powinieneś użyć:
docker exec -it 9f7d99aa6625 ash
Lub
docker exec -it 9f7d99aa6625 sh
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 18:51:29
Aby sprawdzić pliki, uruchom docker run -it <image> /bin/bash
, aby uzyskać interaktywny terminal. Listę obrazów można uzyskać za pomocą docker images
. W przeciwieństwie do {[2] } To rozwiązanie działa również w przypadku, gdy obraz nie uruchamia się (lub kończy się natychmiast po uruchomieniu).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 13:44:09
To proste !
Wyświetl wszystkie zdjęcia dokera:
sudo docker images
Na moim systemie pokazało się następujące wyjście:
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
Mam dwa obrazy dokera na moim komputerze. Powiedzmy, że chcę uruchomić pierwszą.
sudo docker run -i -t ubuntu:latest /bin/bash
To da Ci kontrolę nad kontenerem. Teraz możesz wykonywać wszystkie rodzaje operacji powłoki wewnątrz kontenera. Podobnie jak roing ls
wyświetli wszystkie foldery w katalogu głównym systemu plików.
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 18:54:01
Jeśli masz zainstalowany Docker z Kitematic
, możesz użyć GUI. Otwórz Kitematic
z ikony dokera i w oknie Kitematic
wybierz kontener, a następnie kliknij ikonę exec
.
Możesz zobaczyć dziennik kontenera i wiele informacji o kontenerze (w zakładce Ustawienia)również w tym GUI.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 18:52:43
GOINSIDE SOLUTION
Install goinside
command line tool with:
sudo npm install -g goinside
I wejść do kontenera Dockera o odpowiednim rozmiarze terminala z:
goinside docker_container_name
Stara odpowiedź
Wstawiliśmy ten fragment ~/.profile
:
goinside(){
docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside
To nie tylko sprawia, że każdy może dostać się do działającego kontenera z:
goinside containername
Rozwiązanie to rozwiązuje również długotrwały problem związany ze stałymi rozmiarami terminali kontenerowych Docker. Co jest bardzo irytujące, jeśli napotkasz to.
Również jeśli zastosujesz link , będziesz mieć również Command Command dla nazw kontenerów dokera.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-13 09:58:06
Użyj tego polecenia:
docker exec -it containerid /bin/bash`
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 18:54:18
Inną opcją jest użycie nsenter .
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 19:09:58
Jeśli używasz Dockera Compose, przeniesie cię to do kontenera Dockera.
docker-compose run container_name /bin/bash
Wewnątrz kontenera przeniesie Cię do WORKDIR zdefiniowanego w pliku Dockerfile. Możesz zmienić swój katalog roboczy za pomocą
WORKDIR directory_path # E.g /usr/src -> container's path
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 18:47:32
W moim przypadku z pewnych powodów muszę sprawdzić wszystkie informacje związane z siecią w każdym kontenerze. Tak więc poniższe polecenia muszą być ważne w kontenerze...
ip
route
netstat
ps
...
Sprawdziłem wszystkie odpowiedzi, nie ważne dla mnie. Szukałem informacji na innych stronach internetowych. Nie dodam tu super linku, bo nie jest napisany po angielsku. Więc po prostu umieścić ten post z podsumowaniem rozwiązanie dla ludzi, którzy mają takie same wymagania jak ja.
Powiedzmy, że masz uruchomiony kontener o nazwie test świetlny. Wykonaj poniższe czynności.
-
docker inspect light-test -f {{.NetworkSettings.SandboxKey}}
. To polecenie otrzyma odpowiedź w postaci/var/run/docker/netns/xxxx
.
- następnie
ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx
. Katalog może nie istnieć, najpierw wykonajmkdir /var/run/netns
.
- teraz możesz wykonać
ip netns exec xxxx ip addr show
, aby zbadać świat sieci w kontenerze.
PS. {[6] } jest zawsze tą samą wartością otrzymaną przez pierwsze polecenie. I oczywiście wszelkie inne polecenia są ważne, np. ip netns exec xxxx netstat -antp|grep 8080
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 05:08:29
For docker-compose up (Docker4Drupal)
docker-compose exec php bash
[[2]} używam Docker dla Drupala na laptopie z Linuksem. Po uruchomieniu kontenera używam 'docker-compose exec php bash
', aby połączyć się z kontenerem, aby móc uruchomić drush commandos. Mi pasuje.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-05 13:41:43