配置 docker 集群互相之间的 ssh

新!年!快!乐!从量变到质变的过程总是发生地很短暂。

最近搭建 hadoop 环境(感觉弄出来个还算好的集群,之后再加配置就轻松了!的时候碰上这样的需求——需要让 Docker 集群的不同容器之间能通过 ssh 互相访问,研究了几个晚上后终于是搞定了,相关配置虽然很简单,但是感觉仍旧是学到了一点东西,这里进行一些记录,

镜像使用 fedora,实现的原理是只生成一对密钥,所有机器都使用该密钥来进行 ssh,这样能大大方便 Dockerfile 的编写,本机也可以使用 ssh 来访问容器(但这没有必要,ssh 会导致 Dockerfile 中配置的环境变量失效,应当直接使用docker exec)。

生成密钥对

首先须在本机生成一对密钥,只需在工作目录下执行ssh-keygen -f id_rsa即可(要求输入的地方直接回车),其会生成id_rsaid_rsa.pub文件;然后执行cat id_rsa.pub > authorized_keys,修改authorized_keys,**把最后的user@host改成*@***。

这样修改是说 ssh 服务端将接受所有持有该公钥对应私钥的客户端。

生成完毕后,工作目录的文件列表如下——

1
2
3
id_rsa
id_rsa.pub
authorized_keys

创建 sshd_config

在工作目录下创建sshd_config文件,插入如下内容——

1
2
3
# 允许 root 远程登陆
PermitRootLogin yes
UsePAM yes

编写 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FROM fedora

# 安装 ssh 的服务端和客户端,同时包括 ps 命令来帮助检查运行情况
RUN yum install -y openssh-server procps openssh-clients

# 拷贝各种文件
COPY ./sshd_config /etc/ssh/sshd_config
COPY ./id_rsa /root/.ssh/id_rsa
COPY ./id_rsa.pub /root/.ssh/id_rsa.pub
COPY ./authorized_keys /root/.ssh/authorized_keys

# 需注意修改各种文件的权限!
# .ssh 路径: 700
# 公钥: 644
# 私钥,authorized_keys: 600
RUN chmod 700 /root/.ssh/ &&\
chmod 644 /root/.ssh/id_rsa.pub &&\
chmod 600 /root/.ssh/id_rsa /root/.ssh/authorized_keys &&\
ssh-keygen -A
# ssh-keygen -A 是为了设置服务端自己持有的私钥位置,也可以在 sshd_config 中配置 HostKey /root/.ssh/id_rsa 来使用一样的密钥
# 服务端为什么需要自己的密钥对?可能是需要给客户端证明自己仍旧是自己吧

# 以守护进程的模式运行 sshd
CMD /usr/sbin/sshd -D

集群环境下测试

编写docker-compose.yml文件,只包括 hostname 就可(需要通过 hostname 来获取互相的 ip)——

1
2
3
4
5
6
7
services:
ssh1:
build: .
hostname: ssh1
ssh2:
build: .
hostname: ssh2

启动集群。

1
$ docker-compose up -d --build

进入ssh1,检查 ssh 连接。

1
2
$ docker exec -it ssh1 bash
$ ssh ssh1 # 输入 yes