Skip to content

Docker Compose部署IPFS私有集群

本文使用Docker Compose部署两节点IPFS私有集群。

下载IPFS镜像

bash
docker pull ipfs/go-ipfs

新建文件夹,存放节点数据。

bash
 mkdir -p ipfsTest/node0/data
 mkdir -p ipfsTest/node0/export
 mkdir -p ipfsTest/node1/data
 mkdir -p ipfsTest/node1/export

生成搭建私有网络所需的swarm.key密钥。

bash
go install github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen@latest
# 在$GOPATH/bin/下会有ipfs-swarm-key-gen的二进制文件
cd $GOPATH/bin
./ipfs-swarm-key-gen > swarm.key
cp swarm.key ipfsTest/node0/data
mv swarm.key ipfsTest/node1/data

编写如下docker-compose.yml

yaml
version: "3"
services:
  ipfs_node0:
    container_name: ipfs_node0
    image: ipfs/go-ipfs:latest
    restart: always
    volumes:
      - /path/to/ipfsTest/node0/export:/export      # 修改
      - /path/to/ipfsTest/node0/data:/data/ipfs     # 修改
    ports:
      - 4001:4001 # IPFS节点之间的P2P网络通信
      - 8080:8080 # 用于通过HTTP访问内容的Web网关
      - 5001:5001 # 用于与IPFS节点进行编程交互的RESTful API
  ipfs_node1:
    container_name: ipfs_node1
    image: ipfs/go-ipfs:latest
    restart: always
    volumes:
      - /path/to/ipfsTest/node1/export:/export      # 修改
      - /path/to/ipfsTest/node1/data:/data/ipfs     # 修改
    ports:
      - 4002:4001
      - 8081:8080
      - 5002:5001

以上四处注释修改的地方,把/path/to/改为你的具体路径。

启动集群

bash
docker-compose up -d

开两个终端,分别进入容器内部,

bash
docker exec -it ipfs_node0 /bin/sh #第一个终端
docker exec -it ipfs_node1 /bin/sh #第二个终端

执行

bash
ipfs id

可以在Addresses看到自己的地址信息,因为是通过docker-compose启动,所以我们无法使用/ip4/127.0.0.1/...这个地址连接另外一个节点,使用另外一个容器之间可以ping通的地址。

在ipfs_node1容器中,执行

bash
ipfs bootstrap add /ip4/172.20.0.3/tcp/4001/p2p/12D3KooWP2kkpUd8rRNLnY118B4UcvJB9VjvXoQmeXkxzGxUrChcgTNDLtANKHWLP #这里填写ipfs_node0的Address

来连接ipfs_node0。

ipfs_node0连接ipfs_node1为相同的操作。

在容器中执行

bash
ipfs swarm peers

可以看到已连接节点。

测试一下,node0发布文件,node1通过哈希值获取文件

bash
ipfs add /data/ipfs/version

log:

added QmNtaCdRAmsR2cG4dvhfAc8eZv1kaGYoAPGZjec2KY4yG6 version
 3 B / 3 B [============================================] 100.00%/ #

在node1上获取

bash
ipfs cat QmNtaCdRAmsR2cG4dvhfAc8eZv1kaGYoAPGZjec2KY4yG6

log:

bash
11

成功。

注意这种方法搭建,访问webui页面不会成功,因为webui的文件在docker安装完时本地是没有webui的代码的。加入公网可以访问webui,是因为节点会从其他节点下载对应的资源到节点的blocks目录下。