Làm thế nào để SSH vào Docker?


89

Tôi muốn tạo luồng cơ sở hạ tầng sau:

Làm thế nào để đạt được điều đó bằng Docker?

Câu trả lời:


69

Trước tiên, bạn cần cài đặt một máy chủ SSH trong các hình ảnh mà bạn muốn chuyển vào. Bạn có thể sử dụng hình ảnh cơ sở cho tất cả vùng chứa của mình khi đã cài đặt máy chủ ssh. Sau đó, bạn chỉ phải chạy từng vùng chứa ánh xạ cổng ssh (mặc định là 22) đến một cổng của máy chủ lưu trữ (Máy chủ từ xa trong hình ảnh của bạn), bằng cách sử dụng -p <hostPort>:<containerPort>. I E:

docker run -p 52022:22 container1 
docker run -p 53022:22 container2

Sau đó, nếu cổng 52022 và 53022 của máy chủ lưu trữ có thể truy cập từ bên ngoài, bạn có thể trực tiếp ssh đến các vùng chứa bằng cách sử dụng ip của máy chủ lưu trữ (Máy chủ từ xa) chỉ định cổng trong ssh với -p <port>. I E:

ssh -p 52022 myuser@RemoteServer -> SSH đến container1

ssh -p 53022 myuser@RemoteServer -> SSH đến container2


Và làm thế nào để đưa các cổng này ra thế giới bên ngoài? Ý tôi là nếu có khả năng cấu hình nó mà không cần nginx?
Kamil Lelonek

2
@squixy: chúng chỉ là các cổng trên máy chủ của bạn; chỉ cần hiển thị chúng theo cách tương tự như đối với các ứng dụng khác. Nó có thể chỉ hoạt động hoặc bạn có thể cần phải mở các cổng trong tường lửa của mình.
Adrian Mouat

Tôi hiểu điều đó, tôi chỉ tự hỏi đâu là cách tốt nhất để ánh xạ tên miền tới các cổng, nhưng tôi tin rằng NginX là giải pháp mà tôi có thể dễ dàng thực hiện.
Kamil Lelonek

Container1 là gì? Khi tôi thực hiện "docker run <name>" thì <name> đang được hiểu là tên hình ảnh, vì vậy docker sẽ tìm kiếm hình ảnh trong repos. ID vùng chứa của tôi không hoạt động khi chạy docker. Tôi sử dụng "docker start <containerID>" để khởi động vùng chứa, nhưng docker start không chấp nhận tham số -p.
mvmn

1
Nếu người dùng Docker là "root" thì bạn sẽ cần cung cấp mật khẩu cho người dùng root thông qua "passwd root". Ngoài ra, tôi cũng tìm thấy điều này hoạt động: docker run -p 52022: 22 container1 dịch vụ ssh start -D FOREGROUND
CMP

42

Lưu ý : câu trả lời này quảng cáo một công cụ tôi đã viết.

Câu trả lời được chọn ở đây đề nghị cài đặt máy chủ SSH vào mọi hình ảnh. Về mặt khái niệm, đây không phải là cách tiếp cận đúng ( https://docs.docker.com/articles/dockerfile_best-practices/ ).

Tôi đã tạo một máy chủ SSH được chứa trong vùng chứa mà bạn có thể 'dính' vào bất kỳ vùng chứa nào đang chạy. Bằng cách này, bạn có thể tạo các tác phẩm với mọi vùng chứa. Yêu cầu duy nhất là vùng chứa có bash.

Ví dụ sau sẽ khởi động một máy chủ SSH được hiển thị trên cổng 2222 của máy cục bộ.

$ 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 -p 2222 localhost

Để biết thêm các gợi ý và tài liệu, hãy xem: https://github.com/jeroenpeeters/docker-ssh

Điều này không chỉ đánh bại ý tưởng về một quy trình trên mỗi vùng chứa mà còn là một cách tiếp cận rườm rà khi sử dụng hình ảnh từ Docker Hub vì chúng thường không (và không nên) chứa máy chủ SSH.


6
Đây phải là câu trả lời chính xác. Cài đặt máy chủ SSH vào mọi hình ảnh bạn muốn đi ngược lại với tác động của docker. Bạn chỉ nên có một dịch vụ cho mỗi vùng chứa và nên soạn các ứng dụng từ các dịch vụ / vùng chứa.
babbata

2
@JeroenPeeters Tôi đoán một điều kiện tiên quyết khác là "Docker socket được ánh xạ vào vùng chứa, điều này cho phép vùng chứa truy cập vào Docker Engine."
Nam G VU

1
'Jeroenpeeters' trong lệnh trên là gì? Đó có phải là tên người dùng trên vùng chứa không?
Pratik Patil

1
@PratikPatil là một phần của tên hình ảnh. hub.docker.com/r/jeroenpeeters/docker-ssh
Jeroen Peeters

13

Các tệp này sẽ mở thành công sshd và chạy dịch vụ để bạn có thể ssh trong cục bộ. (bạn đang sử dụng cyberduck phải không?)

Dockerfile

FROM swiftdocker/swift
MAINTAINER Nobody

RUN apt-get update && apt-get -y install openssh-server supervisor
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 22
CMD ["/usr/bin/supervisord"]

supervisord.conf

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

để xây dựng / chạy bắt đầu daemon / nhảy vào trình bao.

docker build -t swift3-ssh .  
docker run -p 2222:22 -i -t swift3-ssh
docker ps # find container id
docker exec -i -t <containerid> /bin/bash

nhập mô tả hình ảnh ở đây


2
Này, câu trả lời hay đấy. Vùng chứa của tôi xuất hiện và nó nhắc tôi đăng nhập, nhưng thông tin đăng nhập có phải là "root" và "password" không? Điều đó dường như không hiệu quả với tôi, nhưng tôi thích giải pháp của bạn và tôi muốn sử dụng nó.
Jabari Dash

không chắc - tôi đã gặp sự cố khi nhấn vào cổng 22 - hãy đảm bảo rằng bạn sử dụng cổng 2222 vì mọi thứ có thể mở trên thiết bị cục bộ xung đột với cổng đó thường xuyên.
johndpope

dòng này ('PermitRootLogin không có mật khẩu') trong / etc / ssh / sshd_config được nhận xét theo mặc định, vì vậy hãy sử dụng 's / # PermitRootLogin không có mật khẩu / PermitRootLogin yes /' để thay thế. Bạn cũng có thể phải sử dụng 'cấm mật khẩu' thay vì 'không có mật khẩu' cho Ubuntu 16.04+. Bạn có thể chắc chắn điều hành viên vào thùng chứa để kiểm tra trước.
ItsJack

10

Tôi đoán nó là có thể. Bạn chỉ cần cài đặt một máy chủ SSH trong mỗi vùng chứa và hiển thị một cổng trên máy chủ. Sự khó chịu chính sẽ là duy trì / ghi nhớ ánh xạ từ cảng đến container.

Tuy nhiên, tôi phải đặt câu hỏi tại sao bạn muốn làm điều này. SSH vào vùng chứa phải đủ hiếm để không gặp rắc rối khi ssh vào máy chủ sau đó sử dụng trình điều khiển docker để vào vùng chứa.


Vì vậy, tôi muốn mô hình hóa môi trường của mình theo cách tôi tạo vùng chứa cho mỗi dự án. Vì vậy, mỗi dự án có môi trường riêng, người dùng, cơ sở dữ liệu, phiên bản python / ruby, v.v. Tôi muốn cô lập các dự án mà không cần tạo nhiều máy chủ.
Kamil Lelonek

1
@squixy; đồng ý. Thông thường các vùng chứa của docker chỉ chứa một tiến trình duy nhất - nói một cách dễ hiểu là bạn nên có các vùng chứa riêng cho mysql, php và apache. Tôi không chắc điều này sẽ diễn ra tốt như thế nào đối với bạn.
Adrian Mouat

Tôi biết, bạn có biết giải pháp tốt hơn cho trường hợp của tôi?
Kamil Lelonek

1
@squixy nó phụ thuộc vào rất nhiều thứ. Tôi khuyên bạn nên chia nhỏ mỗi thùng chứa thành nhiều thùng chứa. Bạn cần ssh để làm gì? Nếu đó chỉ là bảo trì, tại sao bạn không thể ssh vào máy chủ lưu trữ rồi thực thi docker? Tôi e rằng đó là một câu hỏi quá lớn để trả lời trong một bình luận.
Adrian Mouat

Như Adrian đã viết, một khi bạn quen với việc sử dụng Docker, bạn sẽ nhận ra rằng các container! = Máy ảo. Hầu như (dự định chơi chữ) không cần phải có quyền truy cập tương tác vào các vùng chứa đang chạy.
mzedeler

8

Tạo hình ảnh docker với openssh-servercài đặt sẵn:

Dockerfile

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

Xây dựng hình ảnh bằng cách sử dụng:

$ docker build -t eg_sshd .

Chạy một vùng test_sshdchứa:

$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22

0.0.0.0:49154

Ssh vào vùng chứa của bạn:

$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#

Nguồn: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image


Điều đáng nói là đối với mac os x, bạn có thể thử làm ssh root@localhost -p <ssh_host_port>theo hướng dẫn tại đây
Claudio Santos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.