Làm thế nào để có được bash hoặc ssh vào một chạy chứa trong chế độ nền?

Tôi muốn ssh hoặc chui vào một chạy docker thùng chứa. Xin vui lòng, xem dụ:

$ sudo docker run -d webserverwebserver is clean image from ubuntu:14.04$ sudo docker psCONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

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

$ sudo docker run -t -i webserver (hoặc có thể 665b4a1e17b6 thay vì)
$ root@665b4a1e17b6:/#

Tuy nhiên, khi tôi chạy các đường phía trên tôi nhận được CHỨA mới ID:

$ root@42f1e37bd0e5:/#

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

Câu trả lời là của Docker attach lệnh. Vì vậy, cho tôi ví dụ trên, các giải pháp sẽ là:

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

Cho Docker phiên bản 1.3 hay muộn: cảm Ơn để dùng WiR3D người đã đề nghị một cách khác để có được một container của vỏ. Nếu chúng ta sử dụng attach chúng tôi chỉ có thể sử dụng một trường hợp của vỏ. Vì vậy, nếu chúng ta muốn mở một nhà ga mới với một ví dụ mới của một container của vỏ trứng, chúng ta chỉ cần phải chạy như sau:

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

hay

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

Từ Docker 1.3 trở đi:

docker exec -it <containerIdOrName> bash

Về cơ bản, nếu Docker container đã bắt đầu sử dụng những /bin/bash lệnh bạn có thể truy cập vào nó sử dụng attach. Nếu không, sau đó anh phải thực hiện lệnh để tạo ra một Bash dụ bên trong thùng sử dụng exec.

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

exit

Vâng, đó là đơn giản.

Mặc dù các tác giả của câu hỏi cụ thể nói rằng họ rất quan tâm đến trong một container, nó cũng đáng chú ý là nếu container không chạy, nhưng bạn muốn chạy nó để chọc xung quanh bạn có thể chạy:

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

Thử này:

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

Nguồn: https://docs.docker.com/engine/reference/commandline/run/

Dựa trên @, Được câu trả lời của tôi đã tạo ra những điều sau đây tiện kịch bản

Thiết lập

Đưa 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 parameterCONTAINER=$1if [[ "$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ú ý: Một container không chứa bash nhưng ash, sh etc. Trong những trường hợp này bash sẽ được thay thế ở trên kịch bản.

Sử dụng

Nếu bạn chỉ có một trường hợp chạy, chỉ cần chạy

$> docker-ssh 

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

$> docker-ssh 50m3r4nd0m1d

Nếu bạn container đó không có bash cài đặt bạn có thể thử sh:

docker exec -it CONTAINER /bin/sh

Hay tìm kiếm đạn trong đầu tiên là::

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

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

Nếu bạn có một container với tên 'web-server1'. Sau docker chạy lệnh sẽ bắt đầu một thứ hai thùng chứa đó sẽ 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

Cho thêm gợi ý, kiểm https://github.com/jeroenpeeters/docker-ssh

@jpetazzo có một tuyệt vời bài về chủ đề này,. Câu trả lời ngắn sẽ được 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 các cuộc thảo luận trong những ý kiến của các bài...

Cheers

Bạn cũng có thể cung cấp cho các Docker chứa một routeable địa chỉ IP với đường Ống, và sau đó SSH vào máy đó mới địa chỉ IP.

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

Đô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. Sau Docker hình ảnh cho phép để ssh vào một container sử dụng một khóa riêng:

UbuntuWithSSH-Docker

Các ý chính trong các Dockerfile là https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.

Lưu ý rằng sử dụng SSH để bash vào chạy container là thực tế nghèo – xem lý do tại đây. ngôi docker g -i-t container-tên là:/bash là một cách để đi.

ngoài ra ngôi docker g -i-t 665b4a1e17b6 /là:/sh để có thể cài đặt khuynh các chương trình và các gói