티스토리 뷰

반응형


Docker를 이용해 두 대의 호스트(HOST1, HOST2)에서 각각 IPFS를 실행하고, IPFS Cluster로 두 개의 IPFS 노드를 연결하는 방법에 대해 설명합니다.

※ IPFS는 Raft 알고리즘을 사용하기 때문에 최소 세 대 이상의 IPFS Cluster가 존재해야 합의가 정상적으로 완료됩니다. 두 대만 연결해서 사용할 경우, 오류가 발생할 수 있습니다. 여기에서는 단순히 IPFS Cluster의 동작 방법 확인을 위해 두 대로만 진행합니다.

Docker 네트워크 생성(HOST1, HOST2에서 실행)

ipfs-node와 ipfs-cluster 간의 통신을 위해 사용할 Docker 네트워크를 생성합니다.

네트워크 드라이버는 bridge를 사용합니다. docker network create 명령으로 생성되는 네트워크 드라이버의 default 값이 bridge이기 때문에 따로 설정하지 않고 진행합니다.

각 호스트에서 ipfs라는 이름의 Docker 네트워크를 생성하고 확인합니다.

# Docker 네트워크 생성
docker network create ipfs

# Docker 네트워크 생성 확인
docker network ls


IPFS 실행

ipfs-node 컨테이너 실행(HOST1, HOST2에서 실행)

HOST1HOST2에서 각각 DockerHub의 ipfs/go-ipfs 이미지를 사용해 각 호스트에서 ipfs-node 컨테이너를 실행합니다.

# ipfs-node 컨테이너 실행(HOST1, HOST2에서 실행)
docker run \
 -d \
--restart always \
--name ipfs-node \
-v /data/ipfs:/data/ipfs \
-v /data/ipfs-staging:/staging \
-p 8080:8080 \
-p 4001:4001 \
-p 5001:5001 \
--network="ipfs" \
ipfs/go-ipfs:latest


ipfs-node 컨테이너의 로그를 확인해봅니다.

# ipfs-node 컨테이너 로그 확인(HOST1, HOST2에서 실행)
docker container logs ipfs-node
ipfs version 0.4.19
initializing IPFS node at /data/ipfs
Error: /data/ipfs is not writeable by the current user


위와 같은 오류가 반복되어 발생하는 것을 확인할 수 있습니다. 이 오류는 현재 사용 중인 유저가 /data/ipfs 디렉토리에 파일을 작성할 권한이 없기 때문에 발생하는 오류입니다.

호스트에 볼륨으로 설정한 /data/ipfs 디렉토리가 없을 경우, 디렉토리가 자동으로 생성되고 ipfs-node 컨테이너 내의 /data/ipfs 디렉토리의 내용이 복사됩니다.

해당 디렉토리에 파일을 쓸 수 있도록 디렉토리 소유권을 변경해줍니다. 여기에서 hyper는 현재 사용 중인 유저입니다.

# 디렉토리 소유권 변경(HOST1, HOST2에서 실행)
sudo chown -R hyper:hyper /data
# 또는
sudo chown -R hyper:hyper /data/ipfs
sudo chown -R hyper:hyper /data/ipfs-staging

ipfs-node 컨테이너를 재시작하고 IPFS 데몬이 정상적으로 실행되었는지 확인합니다.

# ipfs-node 컨테이너 재시작(HOST1, HOST2에서 실행)
docker container restart ipfs-node 

# ipfs-node 컨테이너 실행 확인(HOST1, HOST2에서 실행)
docker container logs ipfs-node
initializing IPFS node at /data/ipfs
generating 2048-bit RSA keypair...done
peer identity: QmZN3RaisfoFNiR1dQ44T6U6uUddSmujr8vBqkrAtAG15r
to get started, enter:

	ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Initializing daemon...
go-ipfs version: 0.4.19-52776a7
Repo version: 7
System version: amd64/linux
Golang version: go1.11.5
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/172.20.0.2/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/172.20.0.2/tcp/4001
API server listening on /ip4/0.0.0.0/tcp/5001
WebUI: http://0.0.0.0:5001/webui
Gateway (readonly) server listening on /ip4/0.0.0.0/tcp/8080
Daemon is ready


위와 같은 로그가 출력되면 IPFS 데몬이 정상적으로 실행된 것입니다.

IPFS 구성 프로필 변경(HOST1, HOST2에서 실행)

ipfs-node가 정상적으로 실행된 상태에서 새로운 터미널 창을 켜고 다음 명령을 통해 "server" 프로필로 IPFS를 구성합니다.

# IPFS 구성 프로필 변경(HOST1, HOST2에서 실행)
sudo docker exec \
  ipfs-node \
  ipfs config profile apply server


IPFS Cluster 실행

secret 및 key 발행(HOST1에서 실행)

IPFS Cluster를 실행하기 위해서는 secretkey를 발행해야 합니다.

우선, 클러스터에 대한 공유 secret을 발행합니다. 노드 중 하나에서 한 번만 생성해주면 됩니다. HOST1에서 다음 명령을 실행합니다.

# 클러스터의 공유 secret 발행(HOST1에서 실행)
od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n' && echo ""


위의 명령의 실행 결과로 다음과 같은 문자열이 출력됩니다. 이 문자열은 각 클러스터 노드로 전달되어 서로 안전하게 통신할 수 있습니다.

# 클러스터의 공유 secret
bd6070b97c8bde57da248206ffb70ceb18347c2df1a0158c7808a8a81d19bd1e

그런 다음, 노드 중 하나에서 클러스터의 각 노드에 대한 peer idprivate key를 생성합니다. HOST1에서 다음 명령을 실행합니다.

이 작업은 임시로 실행한 golang 컨테이너 내에서 "ipfs-key" 유틸리티를 사용해 진행합니다.

# HOST1의 IPFS Cluster key 발행(HOST1에서 실행)
sudo docker run --rm -it golang:1.11-alpine sh
## Go 컨테이너 내부에서 실행
apk add git
go get github.com/whyrusleeping/ipfs-key
ipfs-key | base64 | tr -d ' \n' && echo ""
exit


ipfs-key 유틸리티의 실행 결과로 다음과 같은 문자열이 출력됩니다. 해당 key는 HOST1의 IPFS Cluster key로 사용합니다.

# HOST1의 IPFS Cluster key
Generating a 2048 bit RSA key...
Success!
ID for generated key: QmVYVacmo58TCgJLBnT9SuHTgUdo9efiam1qErxw8VRZGn
CAASqQkwggSlAgEAAoIBAQDFRlF2wS6LcGNH0LO0CUYsAauhRntrksLQcL6uzCds7m233MfeV7veG6oApzTkBpYcHINUFs5zp5Y7ZQAgnNA7FUjRRMiA5As9Di11b0+42vbs4XVZXIIG6ZPTCI0m0WWcBL4Sflxw1SpEvi6qdebZ97suAa5Bo9HmxOiIj7dZMQmEru3SPyl46ahNu8WZIlByucOQpEW3zpBQdqT0ABhr3G/ZMlUU99LQ//vBRmOEGE2QZdMv9A6ws4FmigjhZ4YUEUgvXXFjFwzff+TCqzxhVvie75UCUVVEbNeOaaooEILHwcoSnnJTfLUIqTipvLlZr3XsRIhlrf5oR++pNx5NAgMBAAECggEBAJwgUbq1mvuaH8inYIF80X9kdwu1N1pklS/X+uFmC1HHxSe9YKUUNEfNBxdrPY21tLlcy4cSYaPgnyI0hgxJbvdDmhSc5j4zvL0+ajXFuYdoLAI/UNs/PlzwISDkZKmzEUKP8km6nbhizAgJp+8aTnB1Ajuf8uRaHXYQoqPpccbwh3waycmVwLAV99yHmOkHwzp1X+HzYTToC3u50facnnJgs291OvBd2/ErtUPhe/8KAXyOM9QqUthNw7cVKGxCXe6BbFbKZw34wcYbZVinW6ZYFOxeGvC2HbFT3vSRklHPK/F6UDXxlZaaOxRywV9K2z+9YA9jnoULnsD8ZlJcZqECgYEA3HBctPZ6dlY+5/0r7GjgnNGtZ5LLxRzfzQwykEc5DffbvKKPZL820iv4+uwSY9Fik6Vji/lfAyq3itOhUIt7NeOw6SWkIpj5FZu1m2OMxi0DXZeXE3tD8M1ivzO7mv1972+AtOys1HaDZsQ8IxLS4d405iTRRWFJOVfcLYwvBpkCgYEA5RlTGysbaepDdQcqb/OKDYbgT7wQ+xaQ2CVT1QWgisWBVxPx8U8uOR5oaDucO0d/HreQzLFHLemIyJf4AiRdYRvzZYwP65M86LcMPr1kcEh0qJ1NUzjBy5WbvwukViKGYrcLCIV8NWDfGUY1biVHFZXXmcAY/kJzEw4a9tj9SdUCgYEAnZqYLamrlL/E6ghQRw4UyQoAeHSzy5IBUJDP9ed2G06ChDOVYep0P3/A22W9IDCr0fQFYCZCj/kSkOcOBpAy3yyTZ53J5BKKw7A3/4kFNQspxNiE4yDWSmwNlbZfA0kJqQ6HbtNoHd89w1O5yznCHErKd2ELXhdYSu9ONCJt3MECgYEAzY/vlc0UB/D/Hh6T4WewU3rWAjVJN0KELK0xj05BQsL8ztlCmbbmTrIOFJiIEliQo0sqTcAzkeqdpP9WtPVUJDIkLtWB42p1mInGHvVpDaa1piWeoDGpEbbnzH/xsKfB1QlQiRDc5jhJdjAc+PvR0Hhmv7oxstKE1nAtmZgRjRECgYB1gT9FKGGlBUYdR9tgt5Va2PNLmzdrUt7AecwCWukZdGZ+s8gl2/psLVsPh4VZh3TkkTXVPVYnw5o3ueDDvLLxHYY6BcX5G887DmtioEKPEqlH6k/r971y4G6P88UvFY7+WUwAe/+PG3Uq4GLDu/8o/lMR7Cy0/DO9H7afDqN45w==

Go 컨테이너를 빠져나가지 않은 상태에서 ipfs-key 명령을 클러스터의 노드 수만큼 반복합니다. 모든 노드에 대해 key 발행이 완료되면 Go 컨테이너를 빠져나갑니다.

여기에서는 두 개의 클러스터 노드를 구성하기 위해 위의 명령을 한 번 더 실행합니다. 추가로 발행한 key는 HOST2의 IPFS Cluster key로 사용합니다.

# HOST2의 IPFS Cluster key 발행(HOST1에서 실행)
## Go 컨테이너 내부에서 실행
ipfs-key | base64 | tr -d ' \n' && echo ""
## Go 컨테이너 접속 종료 > 모든 key 발행이 끝난 이후에 실행
exit
# HOST2의 IPFS Cluster key
Generating a 2048 bit RSA key...
Success!
ID for generated key: QmPFaVz754bPfdsi25o716yCRFh2uWLb3RArXejGpSh3hr
CAASqQkwggSlAgEAAoIBAQDNWSTIHa+FJzTiOnyRv2V5QAhRUq1p8bZAdhgi4luoba2Xq0hebzMLWn25/f66+jrM4Vbjsc0W871zvI5w1ijP4Kno8fwgZXEQZpBxd0MZwZWbxUj9a/Z9iHi8/ONQh3Zc/gxt5F1YhfLTj1cUHBWY7SAiGAPZ+VwGqG1EB4EtYRZ1StBdtrzT09y4Vc2xTwVck68V1e44xZJbIvddJUPqh59CFlIUZy3/Yw/aynf9KPirbBbeJr6PKRxu0dypjoJBa2n30aru2e3JvzInFgGjrWJ3P0gfJI5pAxb7h40EDRx1hTrmDMoDj9zzsKCaYgkKJ+ZMEJoC5mXbCbzhAnd5AgMBAAECggEBALKi/fBogqxe8w5qurs/uVLFdXbpaZpkf5uMIGsYZ4wZ/Y2Xn5knO0yBKCaI4vRdgpGA5kml/zgcSY9JVNCsPUy5sJXJDQBRvw35a2aJzYG2eiPMeDadmQyTkBU4GbeQYFN9XeqrYtkDjb6lT6da1x72CaIfKhqRZpEULBmmPaXu44mJRrI/TPpwLjngC+mop4eHK1Rcy5zjvLN9UJp0K29xqWXwg6XylJ5cJkMOWMepEaMPeLxcGpyPlv+ue8xl0c/l6tyY7LeUtnLZeFtwdnStsGsrQuwGReIt2BUQTEDl3Pg7/7Rd9vIojUs6VdXyzyCHI9CrELLbhCzXkrTSV5ECgYEA+PYJLDAUGGSktd9YrFc80h1Tprqa9St+azMIYUu6+H3v3r1wKTc2F62a5zOvv+2ZDXmIg8EbxJtB2ApRa/+XAytN6RWGTjbm6J/iaw8O5Mq10iV/gkDFE8jAbpKJAjpZfrvQvHRc/LZno0qjeIx7zkQHmT+C0QBg6g9u4SXVTGcCgYEA0ydw15XNCLixounzrLj5pFj1VmGyIIpztRbHv8HBDm4Ph/FAXeRm8OuPxqkPNOZMEt7U61bbIe5lu8P596oxaUGCs7h7WTImgXBFOanwuX/X4BlMeJXJYyF97/jhFHj5jGItFdGgqe90xy1WN7J5ao2zOLMvLYL/FbPhH9HtsR8CgYEA5c6+ktJiik3EmLls8dCpLM6zW9EenrciP7PgxWcRVLVzSOkW8oSrYtn2hfp4/bJFuGF5+Ry1FBu4gMKtfAJ3FA7SIRikW+hj51FGwEorFlhj03KXq9U71dJWhvqui6bu24Rk3sCO4RtCuUF5eho7Yh/736L3jxNJYmUSlbPFm3sCgYEAwvEBy/dAIRIq5cZqModf6uw6LLLregF4y7IpXg7qRoE0E4SWsViB9WD1DyrboDIR/8X7+v3oN45aHBzVdWKKVaummHf0YSfcxtm4/4C2fvvZeMrCf/2BvOSZ2WgDnRwHACVPjHpJgzpQrOZdV/SNBeOml+1N3A25pPa6G997O28CgYBotLQHG5maaF1R13YHnF+9gyeXTXHGGt0KIB1+7lNQOXg3G4hu9z8xGT7DzZj7BNT5Cw7V98YuH0y/ElXkpRJh08lR78uaLq64RyDeV6EDsIFfC5NNZs2MCpDfM1ShpSLmonI6Kt8MeeCob4HS7qZFFeDMtAQmioYLwLmxCCdetA==

발행한 공유 secretHOST1HOST2의 IPFS Cluster key를 따로 복사해둡니다.


service.json 파일 작성(HOST1, HOST2에서 실행)

이제 각 호스트(HOST1, HOST2)별로 /data/ipfs-cluster/service.json 파일을 작성합니다. 아래의 템플릿을 사용해서 작성합니다.

아래의 템플릿의 예시는 HOST1의 IPFS Cluster를 기준으로 작성되었습니다.

# service.json 파일 작성(HOST1, HOST2에서 실행)
mkdir -p /data/ipfs-cluster
vi /data/ipfs-cluster/service.json
{
  "cluster": {
    "id": "<각 HOST별 클러스터 노드의 ID - ex: QmVYVacmo58TCgJLBnT9SuHTgUdo9efiam1qErxw8VRZGn>",
    "peername": "<클러스터 노드의 이름 - ex: node-1 또는 node-eu>",
    "private_key": "<각 HOST별 클러스터 노드의 Private Key - ex: CAASqQkwggSlAgEAAoIBAQDFRlF2wS6LcGNH0LO0CUYsAauhRntrksLQcL6uzCds7m233MfeV7veG6oApzTkBpYcHINUFs5zp5Y7ZQAgnNA7FUjRRMiA5As9Di11b0+42vbs4XVZXIIG6ZPTCI0m0WWcBL4Sflxw1SpEvi6qdebZ97suAa5Bo9HmxOiIj7dZMQmEru3SPyl46ahNu8WZIlByucOQpEW3zpBQdqT0ABhr3G/ZMlUU99LQ//vBRmOEGE2QZdMv9A6ws4FmigjhZ4YUEUgvXXFjFwzff+TCqzxhVvie75UCUVVEbNeOaaooEILHwcoSnnJTfLUIqTipvLlZr3XsRIhlrf5oR++pNx5NAgMBAAECggEBAJwgUbq1mvuaH8inYIF80X9kdwu1N1pklS/X+uFmC1HHxSe9YKUUNEfNBxdrPY21tLlcy4cSYaPgnyI0hgxJbvdDmhSc5j4zvL0+ajXFuYdoLAI/UNs/PlzwISDkZKmzEUKP8km6nbhizAgJp+8aTnB1Ajuf8uRaHXYQoqPpccbwh3waycmVwLAV99yHmOkHwzp1X+HzYTToC3u50facnnJgs291OvBd2/ErtUPhe/8KAXyOM9QqUthNw7cVKGxCXe6BbFbKZw34wcYbZVinW6ZYFOxeGvC2HbFT3vSRklHPK/F6UDXxlZaaOxRywV9K2z+9YA9jnoULnsD8ZlJcZqECgYEA3HBctPZ6dlY+5/0r7GjgnNGtZ5LLxRzfzQwykEc5DffbvKKPZL820iv4+uwSY9Fik6Vji/lfAyq3itOhUIt7NeOw6SWkIpj5FZu1m2OMxi0DXZeXE3tD8M1ivzO7mv1972+AtOys1HaDZsQ8IxLS4d405iTRRWFJOVfcLYwvBpkCgYEA5RlTGysbaepDdQcqb/OKDYbgT7wQ+xaQ2CVT1QWgisWBVxPx8U8uOR5oaDucO0d/HreQzLFHLemIyJf4AiRdYRvzZYwP65M86LcMPr1kcEh0qJ1NUzjBy5WbvwukViKGYrcLCIV8NWDfGUY1biVHFZXXmcAY/kJzEw4a9tj9SdUCgYEAnZqYLamrlL/E6ghQRw4UyQoAeHSzy5IBUJDP9ed2G06ChDOVYep0P3/A22W9IDCr0fQFYCZCj/kSkOcOBpAy3yyTZ53J5BKKw7A3/4kFNQspxNiE4yDWSmwNlbZfA0kJqQ6HbtNoHd89w1O5yznCHErKd2ELXhdYSu9ONCJt3MECgYEAzY/vlc0UB/D/Hh6T4WewU3rWAjVJN0KELK0xj05BQsL8ztlCmbbmTrIOFJiIEliQo0sqTcAzkeqdpP9WtPVUJDIkLtWB42p1mInGHvVpDaa1piWeoDGpEbbnzH/xsKfB1QlQiRDc5jhJdjAc+PvR0Hhmv7oxstKE1nAtmZgRjRECgYB1gT9FKGGlBUYdR9tgt5Va2PNLmzdrUt7AecwCWukZdGZ+s8gl2/psLVsPh4VZh3TkkTXVPVYnw5o3ueDDvLLxHYY6BcX5G887DmtioEKPEqlH6k/r971y4G6P88UvFY7+WUwAe/+PG3Uq4GLDu/8o/lMR7Cy0/DO9H7afDqN45w==>",
    "secret": "<클러스터의 공유 secret - ex: bd6070b97c8bde57da248206ffb70ceb18347c2df1a0158c7808a8a81d19bd1e>",
    "leave_on_shutdown": false,
    "listen_multiaddress": "/ip4/0.0.0.0/tcp/9096",
    "state_sync_interval": "10m0s",
    "ipfs_sync_interval": "2m10s",
    "replication_factor_min": -1,
    "replication_factor_max": -1,
    "monitor_ping_interval": "15s",
    "peer_watch_interval": "5s",
    "disable_repinning": false
  },
  "consensus": {
    "raft": {
      "init_peerset": [
        "<첫 번째 클러스터 노드의 ID - ex: QmVYVacmo58TCgJLBnT9SuHTgUdo9efiam1qErxw8VRZGn>",
        "<두 번째 클러스터 노드의 ID - ex: QmPFaVz754bPfdsi25o716yCRFh2uWLb3RArXejGpSh3hr>"
      ],
      "wait_for_leader_timeout": "2m",
      "network_timeout": "20s",
      "commit_retries": 1,
      "commit_retry_delay": "200ms",
      "backups_rotate": 6,
      "heartbeat_timeout": "5s",
      "election_timeout": "5s",
      "commit_timeout": "500ms",
      "max_append_entries": 64,
      "trailing_logs": 10240,
      "snapshot_interval": "2m0s",
      "snapshot_threshold": 8192,
      "leader_lease_timeout": "1s"
    }
  },
  "api": {
    "ipfsproxy": {
      "node_multiaddress": "/dns4/ipfs-node/tcp/5001",
      "listen_multiaddress": "/ip4/0.0.0.0/tcp/9095",
      "read_timeout": "0s",
      "read_header_timeout": "5s",
      "write_timeout": "0s",
      "idle_timeout": "1m0s"
    },
    "restapi": {
      "http_listen_multiaddress": "/ip4/0.0.0.0/tcp/9094",
      "read_timeout": "0s",
      "read_header_timeout": "5s",
      "write_timeout": "0s",
      "idle_timeout": "2m0s",
      "basic_auth_credentials": null,
      "headers": {},
      "cors_allowed_origins": ["*"],
      "cors_allowed_methods": ["GET"],
      "cors_allowed_headers": [],
      "cors_exposed_headers": ["Content-Type", "X-Stream-Output", "X-Chunked-Output", "X-Content-Length"],
      "cors_allow_credentials": true,
      "cors_max_age": "0s"
    }
  },
  "ipfs_connector": {
    "ipfshttp": {
      "node_multiaddress": "/dns4/ipfs-node/tcp/5001",
      "connect_swarms_delay": "30s",
      "pin_method": "refs",
      "ipfs_request_timeout": "5m0s",
      "pin_timeout": "24h0m0s",
      "unpin_timeout": "3h0m0s"
    }
  },
  "pin_tracker": {
    "maptracker": { "max_pin_queue_size": 50000, "concurrent_pins": 10 },
    "stateless": { "max_pin_queue_size": 50000, "concurrent_pins": 10 }
  },
  "monitor": {
    "monbasic": { "check_interval": "15s" },
    "pubsubmon": { "check_interval": "15s" }
  },
  "informer": {
    "disk": { "metric_ttl": "30s", "metric_type": "freespace" },
    "numpin": { "metric_ttl": "10s" }
  }
}


/data/ipfs-cluster/service.json 파일에서 ipfs-node와 연결하는 node_multiaddress 부분이 있는데, 이 부분은 다음과 같이 각 경우에 맞는 방법으로 할당해주면 됩니다.

      // 기존 코드
      "node_multiaddress": "/ip4/127.0.0.1/tcp/5001",

      // IP를 강제적으로 할당하는 경우 (포트 오픈 필요)
      "node_multiaddress": "/ip4/<IP주소>/tcp/5001",

      // docker 컨테이너로 할당하는 경우
      "node_multiaddress": "/dns4/ipfs-node/tcp/5001",


peerstore 파일 작성(HOST1, HOST2에서 실행)

각 호스트(HOST1, HOST2)에서 /data/ipfs-clusterpeerstore 파일을 작성합니다. 이 파일에는 public IP 및 peer id가 포함된 각 peer의 multiaddresses 목록이 포함되어 있습니다. 아래의 템플릿을 사용해서 작성합니다.

Format : /ip4/<Public IP>/tcp/9096/ipfs/<클러스터 노드 ID>

# peerstore 파일 작성(HOST1, HOST2에서 실행)
vi /data/ipfs-cluster/peerstore
/ip4/<HOST1의 IP>/tcp/9096/ipfs/<첫 번째 클러스터 노드의 ID - ex: QmVYVacmo58TCgJLBnT9SuHTgUdo9efiam1qErxw8VRZGn>
/ip4/<HOST2의 IP>/tcp/9096/ipfs/<두 번째 클러스터 노드의 ID - ex: QmPFaVz754bPfdsi25o716yCRFh2uWLb3RArXejGpSh3hr>


ipfs-cluster 컨테이너 실행(HOST1, HOST2에서 실행)

이제 각 호스트(HOST1, HOST2)에서 ipfs-cluster를 실행합니다.

# ipfs-cluster 컨테이너 실행(HOST1, HOST2에서 실행)
docker run \
-d \
--restart=always \
--name=ipfs-cluster \
-v /data/ipfs-cluster:/data/ipfs-cluster \
-p "127.0.0.1:9094:9094" \
-p "9096:9096" \
--network="ipfs" \
ipfs/ipfs-cluster:latest

# 디렉토리 소유권 변경(HOST1, HOST2에서 실행)
sudo chown -R hyper:hyper /data/ipfs-cluster


각 호스트(HOST1, HOST2)에서 ipfs-cluster를 실행하고 난 뒤, ipfs-cluster 컨테이너의 로그를 확인합니다. 다음과 같은 로그가 출력되면 정상적으로 설정된 것입니다.

# ipfs-cluster 컨테이너 로그 확인(HOST1, HOST2에서 실행)
docker container logs ipfs-cluster -f


IPFS Cluster 연결 확인(HOST1, HOST2에서 실행)

ipfs-cluster-ctl 명령을 이용해 두 개의 호스트(HOST1, HOST2)에 존재하는 각 IPFS Cluster가 정상적으로 연결되었는지 확인합니다.

# IPFS Cluster 연결 확인(HOST1, HOST2에서 실행)
docker container exec ipfs-cluster ipfs-cluster-ctl peers ls


위와 같이 node-1node-2에 모두 출력되어야 합니다.


IPFS 실행 중지(HOST1, HOST2에서 실행)

이제 IPFS Cluster를 중지해보겠습니다.

각 호스트에서 ipfs-cluster 및 ipfs-node 컨테이너를 제거하고, 볼륨 데이터 및 Docker 네트워크도 제거합니다.

# ipfs-cluster 컨테이너 제거(HOST1, HOST2에서 실행)
docker container rm -f ipfs-cluster

# ipfs-node 컨테이너 제거(HOST1, HOST2에서 실행)
docker container rm -f ipfs-node

# 볼륨 데이터 제거(HOST1, HOST2에서 실행)
sudo rm -rf /data
sudo rm -rf /data/ipfs
sudo rm -rf /data/ipfs-staging
sudo rm -rf /data/ipfs-cluster

# Docker 네트워크 제거(HOST1, HOST2에서 실행)
docker network rm ipfs


참고 사이트


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함