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?

Author: Peter Mortensen, 2015-05-11

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
$
 971
Author: larsks,
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
 193
Author: Agustí Sánchez,
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:

 60
Author: nobar,
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

 16
Author: Jeroen Peeters,
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
 13
Author: Tjs,
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
 11
Author: bcmcfc,
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.

 9
Author: Cosmin Ababei,
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.

 5
Author: Aqeel Qureshi,
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> 
 4
Author: Pratik,
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)
 4
Author: rbrooker,
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
 4
Author: Deoxyseia,
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).

 3
Author: igo,
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
 3
Author: Patel Sunil,
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.

Wybierz Kitematic z menu

Kliknij na exec

 2
Author: Alireza Fattahi,
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.

 2
Author: Soorena,
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`
 1
Author: Admin Hack,
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
 0
Author: xuhdev,
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
 0
Author: Sivakumar,
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 wykonaj mkdir /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.

 0
Author: Light.G,
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.
 -3
Author: illutek,
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