在使用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了,希望能幫助到需要的朋友。