在这个项目里,我一直在用一个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 教程文档。)