2019-11.13更新
经验证,以下方案不仅仅适用于docker,也适用于x86 linux主机或者树莓派等arm架构的linux
公司业务上要求增加数据库,当前生产环境用的是MySQL-cluster集群,非常吃内存且它的高并发性能在新的需求上用不到,要求新搭建一套新的MySQL集群,在此之前要求做一份MySQL各个集群性能测试报告,由于我只有一台测试机,所以要实现多个集群的测试,我准备通过docker实现。PXC的dockers集群搭建之前已经纪录过,目前准备搭建MHA,实现MHA的前提是首先要实现节点之间的ssh互通,废话说多了,这里纪录下docker容器间的SSH互通实现。
之前没玩过,所以测试阶段docker-file就没写,从commit一步一步来
先pull一个centos镜像,这里要特殊说明一点,pull centos镜像的时候记得拉去centos 6系列版本,在7系列版本中,安装ssh服务后,启动ssh会报错权限不足,
ssh-copy-id no identities found error
Failed to get D-Bus connection: Operation not permitted
这两个错误stackoverflow上说是centos7.2官方镜像有变更导致,然而我试了7.5还是有这个问题,时间不等人,我就换成了6.0版本作为基础镜像,相关报错讨论可参考:
https://stackoverflow.com/questions/22530886/ssh-copy-id-no-identities-found-error
要想使用centos7系列镜像,在容器启动的时候必须使用如下命令进行创建:
docker run -d -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name mha-0 --privileged=true -p 33061:3306 -p 50001:22 -p 50010:50010 --net=mha --ip 172.20.0.2 centos7.4:mha /usr/sbin/init
其中的命令和端口映射镜像选择或者其他参数都可以自行添加或者修改,但是这条启动命令的非上述参数必须都要带,目录参数:-v /sys/fs/cgroup:/sys/fs/cgroup:ro 和 启动方式参数:/usr/sbin/init 是必须要带的;且启动容器后不会进入交互界面,需要以下命令进入交互界面:
docker exec -it mha-0 bash
进入后即可执行系统参数,如果没有service服务,只能用systemctl,service命令操作需要yum安装一个:
yum install initscripts -y
docker pull centos:6 镜像后
启动容器前,我们首先要确定几个事:
目的:实现容器互通(数据库访问)
需要:明确ip、SSH服务、SSH端口、权限
需要得到:指定容器IP地址、22端口作为SSH访问端口、3066端口作为MySQL数据库端口
需要容器启动前实现:
IP确定--docker网段技术实现
端口确定--docker端口映射技术
权限--docker 权限参数 --privileged
所以,先创建一个网段,我创建的网段是:
docker network create --subnet=172.20.0.0/24 mha
创建的网段第一个IP都是给网关用的,所以不管创建啥网段 ~0.1这个IP地址都不能使用,从0.2开始才对容器使用
创建好了网段后开始启动容器:
docker run -it --name mha-0 --privileged -p 33061:3306 -p 50001:22 --net=mha --ip 172.20.0.2 centos6:6 /bin/bash
在容器内安装ssh服务:
yum install -y openssh-server
yum install -y openssh-clients
当前,我们的容器还没有root密码,不设置密码ssh是连不进来的通过命令 passwd 设置密码,如果没有passwd命令就yum安装一个
进入配置文件夹 /etc/ssh 修改ssh的配置文件,打开互通访问设置
[root@a6ec07dd0073 ssh]# ls
moduli ssh_config sshd_config ssh_host_dsa_key ssh_host_dsa_key.pub ssh_host_key ssh_host_key.pub ssh_host_rsa_key ssh_host_rsa_key.pub
[root@a6ec07dd0073 ssh]# vim sshd_config
需要修改的参数是:
#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
RSAAuthentication yes ----这一个参数在centos7新版本开始被废除掉了,所以在7.4之类的版本没有这个参数就不要管,强行添加会报错的
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
上图中参数默认是被注释掉的,把这四个被注释掉的打开(去除#号)
启动ssh服务:
service sshd start
以上操作三个镜像都操作一次,像我这么偷懒的人,可以先制作好一个之后,commit一下,另外俩容器直解启动做好的就行了。
安装完了ssh,密码也设置了,退回宿主机,进行ssh链接测试:
ssh root@localhost -p 50001
宿主机上执行ssh连接容器命令,这里我端口是50001映射的22,所以是50001端口,输入此命令后要求输入密码,这个密码就是之前在容器内设置的容器的root密码。输入密码,连接成功,代表ssh单容器设置成功,其他容器按照以上过程,重复就行,容器的root密码最好设置为一致的,免得搞混淆。
各个容器的ssh已经可以单独访问了,接下来实现容器互通,
容器间的互通需要互通的机子上都要有对方的id_rsa和 id_rsa.pub文件公匙,目前连文件都没有,所以首先我们要生成相关rsa文件:
ssh-keygen -t rsa
输入以上命令连续回车就行了,不要设置什么密码,容易混淆,之后会在/root/.ssh下生成rsa文件:
[root@a6ec07dd0073 ssh]# ls
moduli ssh_config sshd_config ssh_host_dsa_key ssh_host_dsa_key.pub ssh_host_key ssh_host_key.pub ssh_host_rsa_key ssh_host_rsa_key.pub
[root@a6ec07dd0073 ssh]# cd /root/.ssh
[root@a6ec07dd0073 .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
接下来把这两个文件写入到authorized_keys文件中:
cat id_rsa.pub>> authorized_keys
这是本机的共享公匙,接下来要写入互通容器的公匙:
ssh [email protected] cat ~/.ssh/id_rsa.pub>> authorized_keys
ssh [email protected] cat ~/.ssh/id_rsa.pub>> authorized_keys
每次输入一个互通容器的密码公匙就会要求输入该容器的root密码进行第一次连接配对,只有正确的输入添加容器的root密码才会添加成功,有多少需要互通的容器就要在第一个容器中写入多少个rsa密码,我搭建只要三个容器互通,所以写入本机一个和互通的两个容器的密码,之后验证是否成功:
[root@a6ec07dd0073 .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwMFWfJa+bMsONMJAOR/wSCl3JwiM51m6IBOtWG6Ny++MxH5uyLke0DXQr7EdH+/bzPP9VhJFT6ZbE+ijN/WsXKkCEfjX7E7R2tsL9efa83YMMXigFMqZD8DSHB1r0C7kCK/Er3QNsLwIiHWjG6kcTof1NebylI1G06qx4Z/Yoq3yRk/zQNgUjJD371N7TTWVgRwFcGoFk+rYFmEd6SphHbcKM0emFDClihRaHBLv5Mu90VrNI1Cc0UZcXXF/5pmmivzxtCzw6oCrP858oCi659g7O3qwIBJL8Tb0+e13NvMW6BmiZjCAyAoCi7WU01M27ii3gVSBq4ry/S2PZa8XOQ== root@a6ec07dd0073
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0l+oOUSYEQ+ocwpmQBB24ArhDsa+m1nxuyVbVOD0nDH8fwrG73Sep6DTV7wbwLc5bGBJGd6CNco6cBhP0mojwtT26DkR3nmYeRtFoBkvAT0eJ17TJuLLN5ebm6EnuzFVmc3wTZP9aPjcYrOpmp9y8dNyyMfwKrpKpqTrrNrvKe0DLjyW/oodL5Vd6bJAbArcs1lz0xiL2HooTSKKJgf4FfzTR4yk8WKmYs/G//BEqhRTBXG2dyTzeKyFG9Efzb9yE1/WOZXyQp+IqxBdDZLjbd0WGH89NDKMU3FQ5zP5NYrRpXhqPvVQOhBHEBzJbj1UHumpfwnGvAMOuVBpHrkyBQ== root@7be94b6ffbe3
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsTCFVilmjVG3uBmVkZY91bEiV3xAtyg5PlqlPVadCAkSGQ9+53FYgEAmWEvSVrz/YajaTA5LnzInOd3T0MrdhJlNFpY6GAoP2j0vayEAJ/buIaGWeAAitqoBo/7sQUn8xI+Ibi8V5aKe6bEidxJgchW6ShbG5i92EApZ7+pdE/NrVBBjMH2Yj3oIY0ECliZdnfyhsj8pxnJc75ixGGQlVE/wKoF8wcwfemrGELyV++rwy3FYvWo2rwhL8GLdCF1bozQYwAejhF0s7H9qxDbzhZq+yeQzBkg6E7CPxgTlYWzXj17sxaBTvwuJ9PKPc/GJcT2Do7xgwx1/Gb1/IGlBlQ== root@7bbd5b7296bd
查看authorized_keys发现已经有其他容器的公匙了,代表成功了,之后直接把这个文件替换到其他容器即可,快捷方法:
ssh [email protected] cat ~/.ssh/authorized_keys>> ~/.ssh/authorized_keys
2019.11.13更新
今天用树莓派4B做互通的时候发现 上面的复制报错:
cat: /root/.ssh/authorized_keys: No such file or directory
所以换了一种复制方法:用scp命令直接把钥匙拷贝到目标机器上就行了
scp authorized_keys [email protected]:/root/.ss
在其他容器中执行配置完成容器的ssh复制命令(如上命令,是在没有配置的容器中执行哦),命令作用是把容器1中配置好的ssh互通密码配置文件复制过来。
最后免密码登陆验证:
[root@7bbd5b7296bd .ssh]# ssh [email protected]
Last login: Mon Feb 11 08:40:53 2019 from 116.228.50.38
[root@a6ec07dd0073 ~]# ^C
[root@a6ec07dd0073 ~]# ls
anaconda-ks.cfg install.log install.log.syslog
[root@a6ec07dd0073 ~]# ls
我在容器3中登陆容器1,成功,实现了容器之间的ssh互通。
经过几天使用,后来我还是换到了centos7.4,通过本文分享的启动方法容器也能操作系统命令。