三台虚拟机docker互动
创建虚拟机
https://www.bilibili.com/video/BV1na4y1773c?spm_id_from=333.788.videopod.episodes&vd_source=238a0de6ad27aae0047dcc365b98b384&p=3
https://www.bilibili.com/video/BV1na4y1773c/?spm_id_from=333.1391.0.0&p=4&vd_source=238a0de6ad27aae0047dcc365b98b384
打开三台虚拟机,使用ping命令查看是否可以连接
在 VM1 上初始化 Swarm
覆盖网络(Overlay Network)依赖 Docker Swarm 模式,需先初始化集群:
1.1 在 VM1 上初始化 Swarm
# VM1 执行 docker swarm init --advertise-addr <VM1_IP>
-
输出中会显示加入集群的命令(含
--token
),保存供 VM2、VM3 使用。
1.2 在 VM2、VM3 上加入 Swarm
# VM2、VM3 执行(替换为实际 token 和 IP) docker swarm join --token SWMTKN-1-xxxxx <VM1_IP>:2377
验证集群状态
# 在 VM1 执行 docker node ls
-
应看到三个节点状态为
Ready
。
创建覆盖网络并启动容器
2.1 创建覆盖网络
# 在任意管理节点(如 VM1)执行 docker network create --driver overlay --attachable my_overlay_net
-
--attachable
允许非服务容器接入网络。
2.2 在每台 VM 上启动容器并加入网络
# 在 VM1、VM2、VM3 分别启动容器 docker run -d --name container1 --network my_overlay_net alpine tail -f /dev/null docker run -d --name container2 --network my_overlay_net alpine tail -f /dev/null docker run -d --name container3 --network my_overlay_net alpine tail -f /dev/null
-
确保容器名称唯一(如
container1
只在 VM1 上启动)。 -
容器加入覆盖网络后,可通过容器名直接通信(需 Docker DNS 支持)。
开放网络端口
sudo ufw allow 22/tcp
在容器内安装 SSH 服务
# 进入容器(以 container1 为例) docker exec -it container1 sh # 安装 SSH 客户端和服务端 apt add --no-cache openssh-client openssh-server sshpass # 生成主机密钥(重要!) ssh-keygen -A # 启动 SSH 服务 /usr/sbin/sshd -D &
3.2 生成 SSH 密钥对
# 在容器内执行 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
3.3 将公钥复制到其他容器
假设需从 container1
免密登录 container2
和 container3
:
# 在 container1 内执行 ssh-copy-id -i ~/.ssh/id_rsa.pub root@container2 ssh-copy-id -i ~/.ssh/id_rsa.pub root@container3
-
如果提示输入密码,默认 Alpine 的 root 用户密码为空(直接回车)。
-
确保目标容器的
~/.ssh/authorized_keys
文件权限为600
确保远程主机的 SSH 服务支持 SCP
登录远程主机(192.168.44.130
),检查 /etc/ssh/sshd_config
文件:
sudo nano /etc/ssh/sshd_config
确认以下配置未被注释:
Subsystem sftp /usr/lib/openssh/sftp-server # 确保存在此行 AllowTcpForwarding yes PermitTunnel yes
重启 SSH 服务
sudo systemctl restart sshd
# 在容器外创建文件 touch file.txt
创建保存路径,将文件放入容器
docker exec -it container1 mkdir -p /c1
sudo docker cp file.txt container1:/c1
进入 container1 docker exec -it container1 bash # 使用 scp 传输文件 scp /c1/file.txt root@container2:/path # /c1为容器内文件路径,root为用户名,container2为指定容器所属虚拟机ip,:/path为指定传送路径
# 在对应容器查看文件 ls /path