依靠docker swarm进行容器间互传

三台虚拟机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 免密登录 container2container3

# 在 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值