Docker技术⼊门与实战第10章为镜像添加SSH服务
在第⼀部分中介绍了⼀些进⼊容器的办法,⽐如attach、exec等命令,但是这些命令都⽆法解决远程管理容器的问题。因此,当⽉读者需要远程登录容器内进⾏⼀些操作的时候,就需要SSH的⽀持了。
本章将具体介绍如何⾃⾏创建⼀个带有SSH服务的镜像,并详细介绍了两种创建容器的⽅法:基于docker commit命令创建和基于Dockerfile 创建。
10.2 基于commit命令创建
Docker提供了docker commit命令,⽀持⽤户提交⾃⼰对制定容器的修改,并⽣成新的镜像。命令格式为docker commit CONTAINER [REPOSITORY][:TAG]。
这⾥将介绍如何⽤docker commit命令。笔者以ubuntu14:04镜像添加SSH服务的操作流程为例。
1.准备⼯作
⾸先,使⽤ubuntu:14.04 镜像创建⼀个容器:
[root@localhost ~]# docker run -it ubuntu:14.04 /bin/bash
更新apt缓存,并安装openssh-server:
root@e99a5814bd95:/# apt-get update; apt-get install openssl-server -y
2配置SSH服务
如果需要正常启动SSH服务,则⽬录/var/run/sshd必须存在。⼿动创建它,并启动SSH服务:
root@684e3d385ffa:/# mkdir -p /var/run/sshd
root@684e3d385ffa:/# /usr/sbin/sshd -D &
[1] 3043
此时查看容器的22端⼝( SSH服务默认监听的端⼝),可见此端⼝已经处于监听状态:
root@684e3d385ffa:/# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3043/sshd
tcp6 0 0 :::22 :::* LISTEN 3043/sshd
修改SSH服务的安全登录配置,取消pam登录限制:
替换⼀⾏中的某部分
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以⽤正则表达式)
root@684e3d385ffa:/# sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
在root⽤户⽬录下创建.ssh⽬录,并复制需要登录的公钥信息(⼀般为本地主机⽤户⽬录下的.ssh/id_rsa.pub⽂件),可由ssh -keygen -t rsa命令⽣成)到authorized_keys⽂件中:
root@684e3d385ffa:/# mkdir root/.ssh
root@684e3d385ffa:/# vi /root/.ssh/authorized_keys
创建⾃动启动SSH服务的可执⾏⽂件run.sh,并添加可执⾏权限:
root@684e3d385ffa:/# chmod +x run.sh
其中,run.sh脚本内容如下:
#!/bin/bash
/usr/sbin/sshd -D
3.保存镜像
将所退出的容器⽤docker commit命令保存为⼀个新的sshd:ubuntu镜像:
[root@localhost ~]# docker commit 684 tjjingpan/ubuntu:14.04
使⽤docker images查看本地⽣成的新镜像sshd:ubuntu,⽬前拥有的镜像如下:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd_html5 v1.0 3094c9c5bce1 Less than a second ago 186MB
httpd latest fb2f3851a971 Less than a second ago 177MB
tjjingpan/ubuntu 14.04 125e22013caf 5 seconds ago 286MB
ubuntu 16.04 c9d990395902 2 weeks ago 113MB
layout工作内容ubuntu latest c9d990395902 2 weeks ago 113MB
ubuntu 14.04 3b853789146f 2 weeks ago 223MB
construction simulator 2014centos latest e934aafc2206 2 weeks ago 199MB
4.使⽤镜像
启动容器,并添加端⼝映射10022-->22。其中10022是宿主主机的端⼝,22是容器的SSH服务监听端⼝:centos和ubuntu
[root@localhost ~]# docker run -p 10022:22 -d tjjingpan/ubuntu:14.04 /run.sh
27fee55e4b71d2da018d649f8f645a5f2e66fc7d51d5b510395cc020eda1159c
启动成功后,可以在宿主主机上看到容器运⾏的详细信息:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27fee55e4b71 tjjingpan/ubuntu:14.04 "/run.sh" 50 seconds ago Up 49 seconds 0.0.0.0:10022->22/tcp zealous_cray 3240e3c603a3 loud/tjjingpan/httpd_html5 "httpd-foreground" 4 hours ago Up 4 hours 0.0.0.0:8080->80/tcp web
在宿主主机或其它主机上,可以通过SSH访问10022端⼝来登录容器:
Centos7创建⽀持ssh服务器的docker容器
1、启动⼀个docker容器:
# docker run -it centos:latest /bin/bash
1
这样就会新建⼀个docker容器,并且进⼊容器的bash中
2、安装sshd:
# yum -y install openssh-server
# yum -y install openssh-clients
1
2
3、启动sshd服务:
# /usr/sbin/sshd -D
1
我的报⼀下错误
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
1
2
idea停止运行快捷键3
此时,依次执⾏下列命令:
⼀路按回车键确认
# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
# ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
# ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
1
2
3
再启动sshd服务,⼀切正常。
4、编辑sshd_config配置⽂件
# vim /etc/ssh/sshd_config
1
到UsePAM yes这⼀段配置,将其改成UsePAM no
UsePAM no
#UsePAM yes
1
2
5、修改root的密码,如果不能passwd,执⾏:# yum -y install passwd
# passwd root
Changing password for user root.
New password:
1delphi怎么没落的
2
3
两次输⼊密码
6、改完密码执⾏exit命令退出,这时会回到宿主机器的shell,执⾏下列命令将容器提交到镜像:
# docker commit containerid imagename
1
这⾥的containerid是容器的id,imagename就是提交时候镜像的名称,第⼀次提交的时候最好使⽤⼀个新的名称,不要覆盖了原有的⼲净的centos镜像。
容器id可以通过docker ps -l命令查看到,启动容器后默认的主机名其实就是容器id。
例如:# docker commit 67bb1912a373 sshd-images
7、通过docker run启动⼀个新的容器,参数-d表⽰后台运⾏,-p表⽰docker到主机的端⼝的映射
# docker run -d -p 10022:22 imagename /usr/sbin/sshd -D
1
如果启动没问题的话,就可以登录到容器了:
# ssh root@localhost -p 10022
1
挂载⼀个主机⽬录作为数据卷
使⽤-v标记也可以指定挂载⼀个本地的已有⽬录到容器中去作为数据卷:
# docker run -d -p 10022:22 --name web -v /usr/webapp:/opt/webapp sshd-images:latest /usr/sbin/sshd -D
1
上⾯的命令加载主机的/usr/webapp⽬录到容器的/opt/webapp⽬录:
这个功能在进⾏测试的时候⼗分⽅便,⽐如⽤户可以放置⼀些程序或数据到本地⽬录中,然后在容器内运⾏和使⽤。另外,本地⽬录的10.2 使⽤Dockerfile创建
在第⼀部分中笔者曾介绍过Dockerfile基础知识,下⾯将介绍如何使⽤Dockerfile来创建⼀个⽀持SSH服务的镜像。
1.创建⼯具⽬录
$mkdir sshd_ubuntu
#ls
sshd_ubuntu
在其中,创建Dockerfile和run.sh⽂件:
#cd sshd_ubuntu/
#touch Dockerfile run sh
#ls
Dockerfile run.sh
2.编写run.sh脚本和authorized_keys⽂件
脚本⽂件run.sh的内容与上⼀⼩节中⼀致:
#!/bin/bash
/usr/sbin/sshd -D
在宿主主机上⽣成SSH密钥对,并创建authorized_keys⽂件:
[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:EQNrdF1ctxniSW127To3xvvB+m9+ZmsRfQOi0CyplsE root@localhost.localdomain
echarts读取excelThe key's randomart image is:
+---[RSA 2048]----+
| . o.B. o.+o.o|
| E * =..+.o=*|
| * + . .o++o|
| = o o+|
| . S ..+|
| +=.|
| .=+|
| .o*|
| .oBO|
+----[SHA256]-----+
3.编写Dockerfile
下⾯是Dockerfile的内容及各部分的注释,要可对⽐上⼀节利⽤docker commit命令创建镜像过程,所进⾏的操作基本⼀致:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论