Dockerfile:制作可ssh登录的镜像

我们先手动制作一个可以ssh登录的容器,然后按照操作步骤编写Dockerfile,用docker build根据Dockerfile创建镜像,最后我们可以用这个镜像来生成可ssh登录的容器了。

一、首先创建一个容器并登入

[[email protected] ~]# docker images centos
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos centos7 ae0c2d0bdc10 4 weeks ago 224 MB
centos latest ae0c2d0bdc10 4 weeks ago 224 MB
[[email protected] ~]# docker run -i -t centos:centos7 /bin/bash
[[email protected] /]#

二、在容器里安装ssh服务端

由于centos:centos7镜像里没有安装passwd、openssl和openssh-server,我们用yum安装一下:

[[email protected] /]# yum install passwd openssl openssh-server -y

设置root密码为123456:

[[email protected] /]# echo '123456' | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.

我们如果现在启动sshd,sshd会报错:

Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key

所以我们先生成/etc/ssh/ssh_host_rsa_key和/etc/ssh/ssh_host_ecdsa_key:

[[email protected] /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
[[email protected] /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''

然后查一下容器的IP,以daemon方式启动sshd:

[[email protected] /]# ip addr ls eth0
270: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:81 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.129/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:81/64 scope link
valid_lft forever preferred_lft forever
[[email protected] /]# /usr/sbin/sshd -D

我们看到容器IP为172.17.0.129,从外部远程ssh到这个容器:

[[email protected] ~]# ssh [email protected]
The authenticity of host '172.17.0.129 (172.17.0.129)' can't be established.
RSA key fingerprint is 81:ab:5d:18:88:73:d2:5b:cf:1b:1a:10:1c:e7:b4:1e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.129' (RSA) to the list of known hosts.
[email protected]'s password:
Connection to 172.17.0.129 closed.

发现容器立即关闭了连接,原因是容器的ssh使用了pam_loginuid.so模块,我们把它关掉:

[[email protected] /]# sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd

上述命令的意思是:在/etc/pam.d/sshd文件里注释掉"session required pam_loginuid.so"这一行。

然后重新启动sshd:

[[email protected] /]# /usr/sbin/sshd -D

再次尝试远程ssh登入:

[[email protected] ~]# ssh [email protected]
[email protected]'s password:
Last login: Tue Dec 2 03:00:07 2014 from 172.17.42.1
[[email protected] ~]#

登入成功!

三、编写Dockerfile

根据上面的操作步骤,在docker服务器端创建Dockerfile文件,内容如下:

# 设置基本的镜像,后续命令都以这个镜像为基础
FROM centos:centos7
# 作者信息
MAINTAINER Qicheng, http://qicheng0211.blog.51cto.com
# RUN命令会在上面指定的镜像里执行任何命令
RUN yum install passwd openssl openssh-server -y
RUN echo '123456' | passwd --stdin root
RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
RUN ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
# 暴露ssh端口22
EXPOSE 22
# 设定运行镜像时的默认命令:输出ip,并以daemon方式启动sshd
CMD ip addr ls eth0 | awk '{print $2}' | egrep -o '([0-9]+\.){3}[0-9]+';/usr/sbin/sshd -D

四、根据Dockerfile来创建镜像

用docker build根据Dockerfile创建镜像(centos:autosshd):

[[email protected] ~]# docker build -t centos:autosshd - < Dockerfile
Sending build context to Docker daemon 2.56 kB
Sending build context to Docker daemon
Step 0 : FROM centos:centos7
---> ae0c2d0bdc10
Step 1 : MAINTAINER Qicheng, http://qicheng0211.blog.51cto.com/
---> Running in 26c2fddd9156
---> 1807df1e23db
Removing intermediate container 26c2fddd9156
Step 2 : RUN yum install passwd openssl openssh-server -y
---> Running in e10f052d4263
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
......
Installed:
openssh-server.x86_64 0:6.4p1-8.el7 openssl.x86_64 1:1.0.1e-34.el7_0.6
passwd.x86_64 0:0.79-4.el7

Dependency Installed:
fipscheck.x86_64 0:1.4.1-5.el7 fipscheck-lib.x86_64 0:1.4.1-5.el7
make.x86_64 1:3.82-21.el7 openssh.x86_64 0:6.4p1-8.el7
tcp_wrappers-libs.x86_64 0:7.6-77.el7

Complete!
---> 20e63694ff20
Removing intermediate container e10f052d4263
Step 3 : RUN echo '123456' | passwd --stdin root
---> Running in d0f1b578cc27
Changing password for user root.
passwd: all authentication tokens updated successfully.
---> f1b73ad76b66
Removing intermediate container d0f1b578cc27
Step 4 : RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
---> Running in f31b1aa24883
---> 647bb8cb3fc9
Removing intermediate container f31b1aa24883
Step 5 : RUN ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
---> Running in 401c7e2cf34d
---> f79b9c8bf108
Removing intermediate container 401c7e2cf34d
Step 6 : RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
---> Running in 00c28bea761b
---> 50f7f29c64a9
Removing intermediate container 00c28bea761b
Step 7 : RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
---> Running in a3a94d599b6b
---> f91df92e2194
Removing intermediate container a3a94d599b6b
Step 8 : EXPOSE 22
---> Running in 28ee83c39a27
---> 7a82bca0db6a
Removing intermediate container 28ee83c39a27
Step 9 : CMD ip addr ls eth0 | awk '{print $2}' | egrep -o '([0-9]+\.){3}[0-9]+';/usr/sbin/sshd -D
---> Running in 41d58259b402
---> bd345297137b
Removing intermediate container 41d58259b402
Successfully built bd345297137b
[[email protected] ~]# docker images centos
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos autosshd bd345297137b 3 minutes ago 300 MB
centos centos7 ae0c2d0bdc10 4 weeks ago 224 MB
centos latest ae0c2d0bdc10 4 weeks ago 224 MB

我们看到centos:autosshd镜像已经成功创建了。

用这个镜像创建的容器都是可ssh登入的,我们验证一下:

[[email protected] ~]# docker run -d --name=mytest1 centos:autosshd
614c6573b88451b073ee6aa10b8081337f3f2af8e77bf999bd0537173cf8c1fc
[[email protected] ~]# docker logs mytest1
172.17.0.136
[[email protected] ~]# ssh [email protected]
The authenticity of host '172.17.0.136 (172.17.0.136)' can't be established.
RSA key fingerprint is 35:b2:77:e9:32:ba:74:58:84:66:89:be:1b:78:ec:75.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.136' (RSA) to the list of known hosts.
[email protected]'s password:
[[email protected] ~]#

ssh登入成功!

本文出自 “启程的Linux博客” 博客,请务必保留此出处http://qicheng0211.blog.51cto.com/3958621/1585398

更多相关文章
  • 在无数钟场景下,我们可以对奸商破口大骂.当年还是学生时,想买个PSP玩玩,上网一查,各处论坛讨论的最多的,不是PSP的玩法,而是如何识破奸商的诡计和防止调包.如此的小心谨慎,这才购入一只后来证明质量还不错的PSP.今天和大家说说奸商的逻辑. 首先要澄清的是,那种以次充好,近似欺诈的手法并不是今天的主 ...
  • 原文链接:http://www.jeffjade.com/2015/08/03/2015-08-03-javascript-this/ JavaScript作为一种脚本语言身份的存在,因此被很多人认为是简单易学的.然而情况恰恰相反,JavaScript支持函数式编程.闭包.基于原型的继承等高级功能. ...
  • 51CTO开发频道推出<开发月刊>电子杂志,每月一期.“我们只谈开发”是<开发月刊>的口号,本杂志面向广大程序员.项目经理以及架构师.查看往期杂志,请点击这里. 2013年3月刊下载地址 51CTO下载频道:http://down.51cto.com/data/709619 ...
  • 1.省略dim,方便但也是隐患!申请变量后再使用是标准方法:dim aa = "1"事实上,你不写dim也可以:a = "1"系统并不认为出错,它会自动判断a是不是一个已经存在的变量,存在就继续执行,如果不存在就自动帮你申请!看似系统好聪明好智能好体贴,但是隐 ...
  • 文/未来已来拉手网归宿三胞集团,其实一点也不意外.2012年拉手网撤销IPO,投资人和创始人斗争之后,创始人吴波出走再创业,之后被收购或许已经是其较好的归宿,只是被谁收购的问题.外界一直有评论说拉手是被投资人给搅黄了,曾经的团购霸主,没落了.但笔者想说的顺着拉手网被三胞集团收购,讲讲团购网站的归宿和 ...
  • 计算机系统的安全等级 1985年美国国防部出版了<计算机可信系统的评估准则>(Trusted Computer System Evaluation Criteria, TCSEC),俗称桔皮书.该准则将计算机系统安全从最高的安全特性到最低的安全特性划分为A.B.C.D 4类;由高到低依次 ...
一周排行
  • reactor,这个东西感觉像是一个事件触发器,可以捕捉minion加入master这一动作(当然能捕捉的肯定不止这个动作)然后执行一些操作,我的目的就是利用reactor捕捉Minion加入master时自动执行一 ...
  • 已迁往:http://www.iteblog.com/archives/141题目描述:将一个长度超过100位数字的十进制非负整数转换为二进制数输出.输入:多组数据,每行为一个长度不超过30位的十进制非负整数.(注意 ...
  • 在Xcode中新建一个View-Based应用程序,名叫UsingViews2:在Interface Builder中放置一个Web view:UsingViews2ViewController.h的代码如下: // ...
  • 文/张钧泓去哪儿发布最新财报,财报显示,去哪儿第一季度总营收为人民币6.711亿元(约合1.083亿美元),同比增长100%:归属于去哪儿网股东的净亏损为7.012亿元人民币(约合1.131亿美元),同比扩大.这是去 ...
  • 近期一个通过假冒Word文档图标,迷惑用户下载运行的木马型后门病毒格外值得网友关注.瑞星发布的预警显示,用户一旦双击运行该病毒,电脑将成为受黑客控制的肉鸡,从而使黑客可以盗取用户电脑中的任意文件和隐私数据,并发送指令 ...
  • 传统代理 需要手动设置代理服务器的地址和端口,然后使用代理服务器访问网络 配置squid.conf 主要配置如下 http_port 3128 #用于指定代理服务器监听的地址和端口 cache_mem 64 MB # ...
  • 一.影响Linux服务器性能的因素 1. 操作系统级 Ø CPU Ø 内存 Ø 磁盘I/O带宽 Ø 网络I/O带宽 2. 程序应用级 二.系统性能评估标准 影响性能因素 评判标准 好 坏 糟糕 CPU user% + ...
  • 易网科技讯 1月29日消息,消息称中华英才网裁员工作正在开始,被辞员工将获得Monster的N+3月薪补偿,而大部分员工对公司未来发展前景失去信心,希望被裁以获得赔偿.据齐家网品牌公关总监武兴兵透露,中华英才网裁员今 ...
  • J2ee是我们步入java学习的一个开始,它将开启这趟奇幻之旅,Java是一种简单的,跨平台的,面向对象的,分布式的,解释的,健壮的安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言.不仅仅是免费开源, ...
  • 安装GitHub客户端的时候,会提示失败,如下: An error occurred trying to download 'http://github-windows.s3.amazonaws.com/GitHub ...