在使用docker搭建hadoop分布式集群的时候,需要各容器之间相互免密登录,传统的方式我想或许会很麻烦,特别是当容器达到几百上千台的时候,这时就需要有一种方式来更简单实现免密登录了。
环境介绍:
宿主机:centos 7
docker 版本:18.09.0
镜像版本:ubuntu:14.04(官方镜像,无ssh,需要自行安装)
方法一:
怎么说呢,第一种方法不是不可以,但很麻烦。这里只是说一下方法:
当容器创建完成以后,拷贝容器里面的主机名和ip映射关系到本地host.file文件,通过这个host.file文件远程到容器执行ssh-keygen命令生成秘钥,然后把每一个容器生成的秘钥拷贝到宿主机的authorized_file,最后把host.file文件上传到容器里面/etc/hosts下,把authorized-file文件拷贝到容器的~/.ssh/authorized_keys,当然,这个需要脚本实现,比较麻烦。其实也可以用docker自带的--add-host命令。下面介绍一种更简单的方式
方法二:
(1)因为官方的ubuntu镜像没有ssh,所以需要在ubuntu里面安装,这里有两种方法,第一种是通过Dockerfile文件,第二种是先docker run 然后安装完ssh在执行doxker commit。我这里使用Dockerfile
FROM ubuntu:14.04
MAINTAINER yjt xxx
RUN sudo apt-get update &&
sudo apt-get install -y net-tools openssh-server psmisc iproute wget vim
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys &&
sed -i 's/PermitEmptyPasswords yes/PermitEmptyPasswords no /' /etc/ssh/sshd_config &&
sed -i 's/PermitRootLogin without-password/PermitRootLogin yes /' /etc/ssh/sshd_config &&
echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&
echo " UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config &&
echo "root:1234" | chpasswd
CMD [ "sh", "-c", "sudo service ssh start; bash"]
接下来,命令行执行:
# docker build -t ubuntu-ssh .
通过刚刚生成的镜像启动两台容器:
# docker run -it --rm --name=yjt1 --net mynetwork --ip 172.20.1.1 --privileged ubuntu-ssh
# docker run -it --rm --name=yjt2 --net mynetwork --ip 172.20.1.2 --privileged ubuntu-ssh
进入到某一台容器执行 ssh yjt1 或者ssh yjt2 如果能成功的免密登录,那说明OK
列:
进入到容器查看hosts文件:
看到没有,这里并没有做ip与主机的映射,接下来ssh 到yjt1 或者 yjt2 试试效果:
到此,docker容器互相免密就OK了,希望能帮助到需要的朋友。