티스토리 뷰
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에서 실행)
HOST1
및 HOST2
에서 각각 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를 실행하기 위해서는 secret
과 key
를 발행해야 합니다.
우선, 클러스터에 대한 공유 secret
을 발행합니다. 노드 중 하나에서 한 번만 생성해주면 됩니다. HOST1
에서 다음 명령을 실행합니다.
# 클러스터의 공유 secret 발행(HOST1에서 실행)
od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n' && echo ""
위의 명령의 실행 결과로 다음과 같은 문자열이 출력됩니다. 이 문자열은 각 클러스터 노드로 전달되어 서로 안전하게 통신할 수 있습니다.
# 클러스터의 공유 secret
bd6070b97c8bde57da248206ffb70ceb18347c2df1a0158c7808a8a81d19bd1e
그런 다음, 노드 중 하나에서 클러스터의 각 노드에 대한 peer id
와 private 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==
발행한 공유 secret
및 HOST1
과 HOST2
의 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-cluster
에 peerstore
파일을 작성합니다. 이 파일에는 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-1
과 node-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
참고 사이트
- Distributed Web: host your website with IPFS clusters, Cloudflare, and DevOps
- Quickstart: Starting, enlarging and shrinking a cluster
- Funky Penguin's Geek Cookbook: IPFS Cluster
'Development > IPFS' 카테고리의 다른 글
[IPFS] go-ipfs: 로컬 환경에서 IPFS Private 네트워크 실행 (1) | 2019.03.11 |
---|---|
[IPFS] go-ipfs: 로컬 환경에서 IPFS 네트워크 실행 (0) | 2019.03.08 |
- Total
- Today
- Yesterday
- 블록 체인
- 코테
- 빅데이터
- ubuntu
- 빅데이터 기초
- 직딩잇템
- 알고리즘
- 하이퍼레저 인디
- Hyperledger Fabric v1.1
- Blockchain
- 하이퍼레저 패브릭
- javascript
- Private Data
- 빅데이터 강의
- 기초 of 기초 데이터 개념
- 하이퍼레저 페브릭
- 어서와 데이터는 처음이지
- Hyperledger Indy
- docker
- Hyperledger Fabric v1.2
- Hyperledger Fabric
- 코딜리티
- 문제풀이
- ambrosus
- 암브로셔스
- codility
- DOCs
- 블록체인
- 빅데이터 교육
- 코딩테스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |