在树莓派上用Docker-in-Docker模拟Docker Swarm集群

2024/11/15 21:02:55

本文主要是介绍在树莓派上用Docker-in-Docker模拟Docker Swarm集群,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在这个项目里,我一直在用一个4GB的Raspberry Pi 4B,装上了64位的Raspberry Pi OS Lite,并用上了Docker。建议您先从头到尾读一遍,这不是一个指南,而是一个过程分享。

1) 在您的设备上安装 64位的Raspberry Pi OS Lite 中的 Docker(容器引擎) 2) 设置经理 3),安排工人。 4) 使用 Docker-in-Docker (DinD,即 Docker-in-Docker) 模拟 Docker Swarm 的步骤 在您的 Raspberry Pi OS Lite 64位系统上安装 Docker [在 Debian 上安装 Docker 引擎如何在 Debian 上安装 Docker 引擎。了解不同的安装方法和步骤。更多详情请参阅:Docker 官方文档]
sudo apt-get update && sudo apt-get upgrade -y  
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done  
# 下载 Docker 的官方 GPG 密钥并将其保存到 /etc/apt/keyrings/docker.asc:  
sudo apt-get update  
sudo apt-get install ca-certificates curl  
sudo install -m 0755 -d /etc/apt/keyrings  
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc  
sudo chmod a+r /etc/apt/keyrings/docker.asc  
# 将 Docker 仓库添加到 Apt 仓库列表中,确保使用正确的架构和版本名称:  
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \  
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null  
sudo apt-get update  
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin  
sudo docker run hello-world
设置管理员

建议在接下来的步骤中使用tmux。

因此,我能够复制并为每个工作节点分配一个纵向面板。

试试下面的任意一条命令检查你的IP

ifconfig

ip 地址

你可以使用以下命令初始化Docker Swarm并指定管理节点的IP地址:

docker swarm init --advertise-addr <MANAGER-IP>

请将<MANAGER-IP>替换为实际的管理节点IP地址。

    docker swarm init --advertise-addr 192.168.99.100  
    群集已初始化:現在,該節點 (dxn1zf6l61qsb1josjja83ngz) 成為了一個管理節點。
要添加一个工作节点到这个群集,可以执行以下命令:docker swarm join  
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c  
192.168.99.100:2377要添加一个管理节点,可以运行 'docker swarm join-token manager' 并按照说明操作。

安排工人。

首先,你需要给工人们准备一个系统镜像:

运行这条命令来拉取alpine镜像:```
sudo docker pull alpine

我试着用Arch,但没有找到arch64的构建版本。

(注意一下,`alpine` 镜像一般用 `/bin/sh` 而不是用 `/bin/bash`。)

![](https://imgapi.imooc.com/67369fee09a03e9604820303.jpg)

获取操作系统镜像后,你需要部署工作节点。这里有两种情况,如果你使用命令 _sudo docker run alpine_ 创建容器,容器会有一个随机生成的名字,所以用 _docker ps -a_ 获取名字,然后用命令将其名字改为一个新的名字。
# 使用 `sudo` 获取管理员权限,将容器重命名
sudo docker rename helloworld.1.6mwtenk3wdxik9kpposg6hd3j Worker1  
# 启动容器
sudo docker start Worker1  
# 进入容器的 shell 环境
sudo docker exec -it Worker1 /bin/sh
你直接用自定义名称来设置容器。

运行一个名为worker2的容器并进入其shell终端。  

sudo docker run -itd --name worker2 alpine /bin/sh

切换到名为worker2的容器的shell终端。  

sudo docker exec -it worker2 /bin/sh

这在你使用虚拟机或集群时会适用,但在我这种情况下,我需要在 **Docker 中运行另一个 Docker** :

## 使用 Docker-in-Docker (DinD) 模拟 Docker Swarm 的步骤

要设置 Docker Swarm,工作节点需要是物理机或虚拟机,而不是 Docker 容器。Docker Swarm 通过让每台主机上的 Docker 服务端(无论是物理服务器、虚拟机还是云实例)相互通信来形成集群。容器本身不运行 Docker 服务端,也无法加入集群。

然而,正如我之前说过的,我想在单个主机上使用Docker容器模拟Docker Swarm环境,因此我将使用Docker-in-Docker (简称为DinD)。这需要在Docker容器内运行Docker。
#主机机器  
docker pull docker:19.03-dind  
docker swarm init --advertise-addr Your_IP #如果您已经初始化过群集,无需再次执行  

#如果您忘记了添加工人的令牌,请使用以下命令:  
docker swarm join-token worker  

#worker1 节点:  
docker run -d --privileged --name worker1 docker:19.03-dind  
docker exec -it worker1 /bin/sh  
docker swarm join --token YOUR_TOKEN YOUR_IP_PORT  

#worker2 节点:  
docker run -d --privileged --name worker2 docker:19.03-dind  
docker exec -it worker2 /bin/sh  
docker swarm join --token YOUR_TOKEN YOUR_IP_PORT
![](https://imgapi.imooc.com/67369ff009b6071014000753.jpg)

两个阿尔卑斯山的工人和接待者

这样一来,嵌套的 Docker 容器就可以工作了,但是经过几次尝试后,我没能为每个工作节点的作业正确部署。

![](https://imgapi.imooc.com/67369ff1096a41ea12360421.jpg)

失败的工作

作为尝试,这是一种学习Docker命令和集群管理的有趣方式,但在体验之后,我更推荐使用三个或更多的树莓派,而不是在同一台树莓派上嵌套使用Docker容器。然而,DinD 对许多其他用途来说可能非常有用,能够在同一单板计算机上运行多个操作系统确实令人惊叹。

# **注解:**

在 Alpine 容器里安装 neofetch (需要先启用 Alpine 的社区软件包仓库)
添加仓库地址

echo http://dl-cdn.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories

更新软件包列表

apk update

安装neofetch程序

apk add neofetch

**停用和移除现有的容器**

查看所有Docker容器:
sudo docker ps -a

停止名为worker1和worker2的容器:
sudo docker stop worker1 worker2

删除停止后的worker1和worker2容器:
sudo docker rm worker1 worker2


**部署工人到虚拟机/机器的指南**

<https://docs.docker.com/engine/swarm/swarm-tutorial/> (此链接指向 Docker Swarm 教程文档。)


这篇关于在树莓派上用Docker-in-Docker模拟Docker Swarm集群的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程