docker”启用ssh连接容器的Dockerfile”教程说明


docker教程中有一个直接切入容器的示例。

Dockerize SSH服务| Docker文档

概述

我没有做任何特别的事情。
它不是类似于docker的解决方案,而是类似于服务器的解决方案。

简而言之,您可以编写从设置服务器到在Dockerfile中启用ssh连接的过程。

Dockefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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"]

Dockerfile的说明

安装SSH服务器

1
RUN apt-get update && apt-get install -y openssh-server

没有服务器就无法建立ssh连接。

为ssh

创建目录

如果没有该目录,sshd似乎无法工作。

1
RUN mkdir /var/run/sshd

设置root用户

的密码

使用

chpasswd命令设置密码。这是基本的Linux命令。
在此示例中,root用户设置为密码screencast

1
RUN echo 'root:screencast' | chpasswd

允许密码以root用户身份登录

通过强制重写sshd_config文件来更改设置。

1
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

根据OpenSSH的版本,默认设置通常禁止您使用密码直接登录到root。

已发布" OpenSSH 7.0",将进行安全性增强,例如更改PermitRootLogin设置| SourceForge杂志

魔法

由于正则表达式很难阅读,但是我正在重写/etc/pam.d/sshd的设置。
如您在注释中看到的那样,如果您不写此内容,则会在登录后被踢。

1
2
# 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
1
2
- session  required  pam_loginuid.so
+ session  optional  pam_loginuid.so

(但是当我尝试删除此行时,我能够登录到ssh而没有任何问题)

ubuntu-为什么需要使用docker将pam_loginuid设置为其optional值?--Stack Overflow

传递环境变量的示例

本教程只是一个示例,似乎没有任何意义。 (即使您删除了这两行,也可以使用)

1
2
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
  • bash-为什么在/ etc / profile中设置VISIBLE = NOW?--Stack Overflow

暴露端口22

1
EXPOSE 22

启动ssh服务器

您必须先启动ssh才能使用它。

1
CMD ["/usr/sbin/sshd", "-D"]

参考

  • 通过ubuntu 11.04 xinetd启动shshd(更改设置):豆腐和魔芋
  • PAM的角色| OpenGroove