十、为镜像添加SSH服务

基于commit命令创建

下载并运行ubuntu镜像

$docker pull ubuntu:18.04
$docker run -it ubuntu:18.04 bash

更新软件源

备份原来的sources.list文件

cp /etc/apt/sources.list /etc/apt/sources.list.bak

再使用echo导入源,不要问我为什么使用echo不用vi

echo "deb http://cn.archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse" >>/etc/apt/sources.list
echo "deb http://cn.archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse">>/etc/apt/sources.list
echo "deb http://cn.archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe multiverse">>/etc/apt/sources.list
echo "deb http://cn.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse">>/etc/apt/sources.list

检查一下宿主机跟容器的DNS是否一致,要让容器的DNS跟宿主机保持一致

root@b1c8b932403e:/# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.100.2

[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 192.168.100.2

update命令更新是访问源列表的每个网址读取其中的软件列表在本地

upgrade是更新所有软件包括内核(生产环境中慎用)

root@b1c8b932403e:/# apt-get update
root@b1c8b932403e:/# apt-get upgrade

安装常用工具

安装ping工具

apt-get install inetutils-ping

安装网络工具如ifconfig

apt-get install net-tools

安装vim命令

apt-get install vim

这里有很多国内源

https://www.cnblogs.com/bfhxt/p/9992015.html

安装配置SSH服务

安装openssh-server作为服务端

root@b1c8b932403e:/# apt-get install openssh-server -y

创建sshd目录不然无法启动ssh服务

root@b1c8b932403e:mkdir -p /var/run/sshd
#-D后台启动,返回SSH服务的进程PID
root@b1c8b932403e:/var/run/sshd# /usr/sbin/sshd -D &

查看容器22端口,已处于监听状态

root@b1c8b932403e:/var/run/sshd# 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      3319/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      3319/sshd

修改SSH服务安全配置,取消pam登陆限制

root@b1c8b932403e:/var/run/sshd# sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd

使用命令在宿主机中生成公钥信息,默认生成路径为本地主机用户目录下的/root/.ssh/id_rsa.pub文件,我是root用户

ssh-keygen -t rsa

复制id_rsa.pub文件到authorized_keys文件中,同时也要复制到容器的/root/.ssh/authorized_keys文件中

root@b1c8b932403e:~/.ssh# cp id_rsa.pub authorized_keys

编写一个自启动SSH服务脚本后赋予权限退出容器

root@b1c8b932403e:~/.ssh# vi /run.sh
#!/bin/bash
/usr/sbin/sshd -D
root@b1c8b932403e:~/.ssh#chmod +x /run.sh

保存镜像为sshd:ubuntu

[root@localhost ~]# docker commit b1c8b932403e sshd:ubuntu
sha256:d646395cbc8197cb7e467abba236aec760f13155fd61d13300f748a03e0dfda3

将宿主机的10022端口映射为容器的22端口并启动

docker run -p 10022:22 -d ubuntu:sshd /run.sh

见证奇迹的时刻,使用命令查看一下容器的IP地址

#显示详细的信息
docker inspect 54d7c82097a8
#只显示容器的IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 54d7c82097a8

使用ssh连接容器,可以看到不用输入密码直接登陆容器

#直连容器
[root@localhost ~]# ssh 172.17.0.4 -p 22
root@54d7c82097a8:~# 
#从宿主机映射出来的端口连接容器
[root@localhost ~]# ssh 192.168.100.129 10022
root@54d7c82097a8:~# 

记录一下我遇到的问题

使用更新命令不能更新,检查宿主机的DNS为192.168.100.2,能ping通,容器ping不通,查看容器的DNS文件为192.168.100.2跟宿主机一致。重启宿主机网络服务失败,提示接口未连接,发现我添加了两块网卡,一块桥接一块NAT,启用桥接网卡,重启宿主机网络服务成功,检查宿主机DNS发现已变为桥接网卡的DNS地址,因为工作环境中连接的WIFI需要认证所以虚拟机桥接是不能上网的,故更改宿主机的DNS为192.168.100.2,重启Ubuntu容器发现还是不能ping通192.168.100.2,重启宿主机之后解决。生产环境中需要重启服务器应该告知相关负责人以免挨揍,除非你打得过当我没说。

使用Dockerfile创建

创建工作目录

工作目录sshd_ubuntu,里面创建Dockerfile和run.sh文件

编写run.sh脚本同上

生成密钥对

编写Dockerfile

imageimage

创建镜像

image

测试镜像

image

posted @ 2021-10-09 15:55  努力吧阿团  阅读(117)  评论(0)    收藏  举报