2014-04-11 23 views

Trả lời

32

Có một vài điều bạn phải làm để cho phép ssh'ing để một container chạy trong một VM:.

  1. cài đặt và chạy sshd trong container của bạn (example) sshd là không có theo mặc định vì container thường chỉ chạy một quá trình, mặc dù họ có thể chạy như nhiều như bạn muốn
  2. .
  3. EXPOSE một cổng như là một phần của việc tạo hình ảnh, thường là 22, để khi bạn chạy vùng chứa, trình kết nối sẽ kết nối với cổng EXPOSE 'd bên trong thùng chứa và vật gì đó có thể được phơi ra bên ngoài vùng chứa.
  4. Khi bạn chạy vùng chứa, bạn cần quyết định cách ánh xạ cổng đó. Bạn có thể cho phép Docker tự động thực hiện hoặc rõ ràng. Tôi muốn đề xuất rõ ràng: docker run -p 42222:22 ... sẽ ánh xạ cổng 42222 trên máy ảo đến cổng 22 trong vùng chứa.
  5. Thêm cổng vào máy ảo để hiển thị cổng cho máy chủ của bạn. ví dụ. khi VM của bạn không hoạt động, bạn có thể thêm một bản đồ như thế này: VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"

Sau đó từ máy chủ của bạn, bạn sẽ có thể ssh vào cổng 42.222 trên máy chủ để đạt được daemon ssh của container.

Đây là những gì xảy ra khi tôi thực hiện các bước ở trên:

$ VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222" 
$ ./boot2docker start 
[2014-04-11 12:07:35] Starting boot2docker-vm... 
[2014-04-11 12:07:55] Started. 
$ docker run -d -p 42222:22 dhrp/sshd 
Unable to find image 'dhrp/sshd' (tag: latest) locally 
Pulling repository dhrp/sshd 
2bbfe079a942: Download complete 
c8a2228805bc: Download complete 
8dbd9e392a96: Download complete 
11d214c1b26a: Download complete 
27cf78414709: Download complete 
b750fe79269d: Download complete 
cf7e766468fc: Download complete 
082189640622: Download complete 
fa822d12ee30: Download complete 
1522e919ec9f: Download complete 
fa594d99163a: Download complete 
1bd442970c79: Download complete 
0fda9de88c63: Download complete 
86e22a5fdce6: Download complete 
79d05cb13124: Download complete 
ac72e4b531bc: Download complete 
26e4b94e5a13b4bb924ef57548bb17ba03444ca003128092b5fbe344110f2e4c 
$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 
26e4b94e5a13  dhrp/sshd:latest /usr/sbin/sshd -D  6 seconds ago  Up 3 seconds  0.0.0.0:42222->22/tcp loving_einstein  
$ ssh [email protected] -p 42222 
The authenticity of host '[localhost]:42222 ([127.0.0.1]:42222)' can't be established. 
RSA key fingerprint is .... 
Are you sure you want to continue connecting (yes/no)? yes 
Warning: Permanently added '[localhost]:42222' (RSA) to the list of known hosts. 
[email protected]'s password: screencast 
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.12.1-tinycore64 x86_64) 

* Documentation: https://help.ubuntu.com/ 

The programs included with the Ubuntu system are free software; 
the exact distribution terms for each program are described in the 
individual files in /usr/share/doc/*/copyright. 

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by 
applicable law. 

[email protected]:~# exit 
logout 

Vì vậy, cho thấy ssh-> localhost 42222-> cổng VM 42222-> cảng container 22.

1

Nếu bạn chỉ muốn để có được vào vùng chứa đang chạy, bạn có thể xem xét sử dụng nsenter. Đây là một kịch bản bash đơn giản (suggested by Chris Jones) mà bạn có thể sử dụng để nhập vào một vùng chứa docker. Lưu nó ở đâu đó trong $PATH của bạn như Docker nhập và chmod +x

#!/bin/bash 
set-e 
# Check for nsenter. If not found, install it 
boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter' 
# Use bash if no command is specified 
[email protected] 
if[[ $# = 1 ]]; then 
    args+=(/bin/bash) 
fi 

boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter "${args[@]}" 

Sau đó, bạn có thể chạy docker-enter 89af3d (hoặc bất kỳ cấu hình bạn muốn nhập)

0

Một biến thể chút thay đổi câu trả lời của Michael mà chỉ đòi hỏi container bạn muốn nhập tên có tên (APPNAME):

boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter' 

boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter $(docker ps | grep $APPNAME | awk '{ print $1 }') 
32

Docker đã thêm lệnh docker exec vào Docker 1.3.0. Bạn có thể kết nối với vùng chứa đang chạy bằng cách sử dụng các mục sau:

docker exec -it <container id> /bin/bash 

Điều đó sẽ kết nối với dấu nhắc bash trên vùng chứa đang chạy.

+3

Đây là cách dễ dàng hơn câu trả lời được chấp nhận –

+0

Cũng hoạt động với docker-compose dưới dạng 'docker-compose run /bin/bash' –

Các vấn đề liên quan