十、为镜像添加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文件





浙公网安备 33010602011771号