Câu hỏi Làm thế nào để có được bash hoặc ssh vào một container đang chạy trong chế độ nền?


Tôi muốn ssh hoặc bash vào một container docker chạy. Vui lòng xem ví dụ:

$ sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ sudo docker ps
CONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES
665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

bây giờ tôi muốn nhận được một cái gì đó như thế này (đi vào container chạy):

$ sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

Tôi đã sử dụng Vagrant và tôi muốn có một hành vi tương tự như vagrant ssh.


797
2017-08-01 16:19


gốc


cách khác sudo docker exec -i -t 665b4a1e17b6 /bin/sh để có thể cài đặt các chương trình và gói apt - fonjeekay


Các câu trả lời:


Câu trả lời là Docker attach chỉ huy. Vì vậy, đối với ví dụ của tôi ở trên, giải pháp sẽ là:

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

Đối với Docker phiên bản 1.3 trở lên: Nhờ người dùng WiR3D người đã đề xuất một cách khác để lấy vỏ của thùng chứa. Nếu chúng ta sử dụng attach chúng ta chỉ có thể sử dụng một instance của shell. Vì vậy, nếu chúng ta muốn mở một terminal mới với một instance mới của shell của một container, chúng ta chỉ cần chạy như sau:

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

hoặc là

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

1181
2017-08-05 06:01



Ngoài ra, thực thi sudo docker attach loving_heisenberg - thiagowfx
lệnh đính kèm không hoạt động đối với tôi, nó khiến docker đóng băng .. bất kỳ ý tưởng nào tại sao nó xảy ra? - Mo J. Mughrabi
Lời nhắc cho người dùng boot2docker: xóa sudo :) - Henno
-i -t bằng -it - pasha.zhukov
Đây là một câu trả lời nguy hiểm để được lựa chọn và được bình chọn rất cao. docker attaching vào một cá thể MongoDB, ví dụ, sẽ giết dụ. Như được giải thích chi tiết hơn trong câu hỏi này  attach và exec là những con vật khác nhau. - fwc


Từ Docker 1.3 trở đi:

docker exec -it <containerIdOrName> bash

Về cơ bản, nếu vùng chứa Docker được bắt đầu bằng cách sử dụng /bin/bash lệnh bạn có thể truy cập nó bằng cách sử dụng attach. Nếu không, thì bạn cần thực hiện lệnh để tạo một cá thể Bash bên trong thùng chứa bằng cách sử dụng exec.

Cũng để thoát khỏi Bash mà không để lại Bash đang chạy trong một quá trình giả mạo:

exit

Đúng, nó đơn giản.


586
2017-10-29 07:46



vẫn còn havent tìm ra cách để có được nano để làm việc. Suy nghĩ có thể liên quan đến docker-ssh từ phusion - WiR3D
Có cách nào để thiết lập bash theo mặc định trong dockers? - ipeacocks
@ipeacocks có, nếu RUN lệnh trong dockerfile là /bin/bash. Nhưng phụ thuộc vào ý của bạn. Nếu bạn muốn chạy các thùng chứa và có bash có sẵn ngay lập tức trong cùng một thiết bị đầu cuối sau đó chạy với -it Hãy làm nó - WiR3D
Sử dụng nhóm docker là thực hành không tốt. Bất kỳ người dùng nào trong nhóm docker về cơ bản đều được sử dụng với quyền root mà không cần sử dụng sudo. projectatomic.io/blog/2015/08/… - Maiku Mori
Tôi nghĩ rằng nó không tạo ra nhiều khác biệt, từ quan điểm bảo mật máy chủ, cho dù bạn sử dụng sudo so với docker nhóm. Dù bằng cách nào, có một lỗ hổng bảo mật được tích hợp vào docker có thể cung cấp đầy đủ các đặc quyền trong hệ thống tệp máy chủ từ khách - bất kể bạn có sử dụng nhóm docker hay không sudo để khởi chạy vùng chứa. - nobar


Mặc dù tác giả của câu hỏi đặc biệt nói rằng họ quan tâm đến một thùng chứa đang hoạt động, cũng cần lưu ý rằng nếu vùng chứa không chạy, nhưng bạn muốn chạy nó để poke xung quanh bạn có thể chạy:

docker run -i -t --entrypoint /bin/bash <imageID>


101
2017-11-07 18:46



Điều đó tạo ra một container khác, giống như câu trả lời của @ kraxor. - Blaisorblade


Thử cái này:

sudo docker run -i -t webserver /bin/bash

Nguồn: https://docs.docker.com/articles/basics/#running-an-interactive-shell


24
2017-08-01 16:29



Nó không thích hợp, bởi vì tôi nhận được CONTAINER ID khác nhau (root@42f1e37bd0e5:/# và không root@665b4a1e17b6:/#) - Timur Fayzrakhmanov
liên kết đã chết, bạn nên cập nhật - Ahmet Karakaya


Dựa trên câu trả lời của @ Timur, tôi đã tạo các mục sau kịch bản tiện dụng

Thiết lập

Đặt docker-ssh tập tin của bạn $PATH với các nội dung sau

#!/bin/bash -xe

# docker container id or name might be given as a parameter
CONTAINER=$1

if [[ "$CONTAINER" == "" ]]; then
  # if no id given simply just connect to the first running container
  CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi

# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (alpine), or simply sh
# the -l at the end stands for login shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l

chú thích: Một số vùng chứa không chứa bash, nhưng ash, sh vv Trong những trường hợp này bash sẽ được thay thế trong kịch bản trên.

Sử dụng

Nếu bạn có một cá thể đang chạy, chỉ cần chạy

$> docker-ssh 

Nếu không, hãy cung cấp cho nó với một parmeter docker id mà bạn nhận được từ docker ps (col đầu tiên)

$> docker-ssh 50m3r4nd0m1d

13
2018-04-20 11:39



Tôi có thể biết tại sao chúng ta cần -l ở cuối? - Nam G VU
để bắt đầu bash như một shell đăng nhập, đọc các tham số môi trường (được mô tả trong dòng bên trên lệnh) - Matyas


Tôi đã tạo ra một máy chủ SSH được container chứa các khả năng SSH cho bất kỳ thùng chứa đang chạy nào. Bạn không cần thay đổi vùng chứa của mình. Yêu cầu duy nhất là container có bash.

Nếu bạn có một vùng chứa có tên 'web-server1'. Lệnh docker run sau sẽ bắt đầu một container thứ hai cung cấp SSH cho container đầu tiên.

docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh

Để biết thêm con trỏ, thanh toán https://github.com/jeroenpeeters/docker-ssh


8
2017-10-03 16:20



Đây phải là câu trả lời được chấp nhận ^ - Nam G VU
Bằng cách này, làm thế nào chúng ta có thể có .bashrc tự động nạp khi bắt đầu một phiên ssh bằng cách sử dụng giải pháp của bạn? Cũng đã đăng sự cố về github github.com/jeroenpeeters/docker-ssh/issues/30 - Nam G VU


@jpetazzo có một bài đăng tuyệt vời về chủ đề này. Câu trả lời ngắn gọn sẽ là sử dụng nsenter:

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

Tái bút: Đừng quên kiểm tra cuộc thảo luận trong phần bình luận của bài đăng ...

Chúc mừng


5
2018-03-14 10:12



Đó là một bài đăng khá cũ không còn cần thiết nữa. @ WiR3D's docker exec giải pháp khá thuận tiện hơn. - drevicko


Nếu vùng chứa của bạn không được cài đặt bash (ví dụ như lãnh sự) bạn có thể thử sh:

docker exec -it CONTAINER /bin/sh

Hoặc tìm kiếm các shell trong / bin trước:

docker export CONTAINER|tar -t|egrep ^bin/

3
2017-07-29 13:40



Những gì là "lãnh sự"? Bạn có một tham chiếu cho nó? Ý bạn là "console"? - Peter Mortensen


Bạn cũng có thể cung cấp cho Docker một địa chỉ IP có thể định tuyến với Pipework và sau đó SSH vào máy với địa chỉ IP mới đó.

Điều này sẽ có nhiều "truyền thống" (ssh), thay vì sử dụng một lệnh cụ thể cho ứng dụng như docker attach, và cuối cùng sẽ làm cho nó 'di động' hơn trên các hệ thống và phiên bản.


3
2017-10-29 11:58



Xin vui lòng, thêm cách simples làm thế nào để làm điều đó. Nếu thành thật mà nói, tôi thực sự cần nó, nhưng tôi không có thời gian để tìm kiếm giải pháp đơn giản nhất cho điều đó. Bạn có thể đăng câu trả lời của mình ở đây không? Nó sẽ rất tuyệt.. - Timur Fayzrakhmanov
Có 2 cách để hoàn thành điều này, nhưng nó không đơn giản và sẽ trở thành một bài đăng lớn. Bạn có thể kiểm tra điều này liên kết một mình, để sử dụng đường ống hoặc cái này liên kết, phù thủy về cơ bản hoàn thành giống như Pipework và là một chút đơn giản hơn, nhưng bạn cần phải làm điều đó bằng tay. Vì vậy, nó phụ thuộc vào bao nhiêu máy chủ mà nói chuyện. Nếu bạn không thể tìm ra một cái gì đó cụ thể hơn, hãy cho tôi biết. Nhưng tôi cũng không có thời gian để viết một hướng dẫn đầy đủ. - radriaanse
Bạn nói đúng - không có cách nào rõ ràng và đơn giản để làm điều đó (Cảm ơn bạn đã liên kết, tôi nghĩ tôi sẽ xem lại sau. - Timur Fayzrakhmanov


docker run -it openjdk:8

Những công việc này :-)


2
2017-09-06 15:11





Đôi khi nó sẽ có ích để có thể ssh vào một container Docker, đặc biệt là trong quá trình phát triển. Hình ảnh Docker sau đây cho phép ssh vào một container bằng cách sử dụng một khóa riêng:

UbuntuWithSSH-Docker

Ý chính của Dockerfile là https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.


2
2017-08-26 15:26