Skip to content

Commit d02b953

Browse files
feat: dynamic members docker packaging and compose setup (#130)
* add docker file for single node * create a 3-node cluster with docker compose * feat: Add static bootstrap example's docker-compose.yml * chore: Add whitespace on file end --------- Co-authored-by: Gyubong <[email protected]>
1 parent 99e0c0a commit d02b953

File tree

6 files changed

+133
-1
lines changed

6 files changed

+133
-1
lines changed

.dockerignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
.dockerignore
2+
Dockerfile
3+
.git
4+
.gitignore
5+
6+
target/

Dockerfile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM rust:latest AS builder
2+
3+
WORKDIR /raftify
4+
5+
COPY . .
6+
7+
RUN apt-get update && apt-get install -y protobuf-compiler
8+
RUN cargo clean
9+
RUN cargo build --workspace
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Docker-compose example for running a 3-node cluster.
2+
services:
3+
node1:
4+
build:
5+
context: ../../../
6+
dockerfile: ./Dockerfile
7+
image: raftify_img
8+
container_name: node1
9+
command: ["./target/debug/memstore-dynamic-members", "--raft-addr=node1:60061", "--web-server=0.0.0.0:8001"]
10+
ports:
11+
- "8001:8001"
12+
expose:
13+
- "8001"
14+
15+
node2:
16+
build:
17+
context: ../../../
18+
dockerfile: ./Dockerfile
19+
container_name: node2
20+
command: ["./target/debug/memstore-dynamic-members", "--raft-addr=node2:60062", "--web-server=0.0.0.0:8002", "--peer-addr=node1:60061"]
21+
ports:
22+
- "8002:8002"
23+
expose:
24+
- "8002"
25+
depends_on:
26+
- node1
27+
28+
node3:
29+
build:
30+
context: ../../../
31+
dockerfile: ./Dockerfile
32+
container_name: node3
33+
command: ["./target/debug/memstore-dynamic-members", "--raft-addr=node3:60063", "--web-server=0.0.0.0:8003", "--peer-addr=node1:60061"]
34+
ports:
35+
- "8003:8003"
36+
expose:
37+
- "8003"
38+
depends_on:
39+
- node2
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Docker-compose example for running a 3-node cluster.
2+
services:
3+
node1:
4+
build:
5+
context: ../../../
6+
dockerfile: ./Dockerfile
7+
container_name: node1
8+
entrypoint: ["/bin/sh","-c"]
9+
command:
10+
- |
11+
./misc/generate-static-cluster-config.sh node1 node2 node3 > ./examples/memstore/static-members/cluster_config.toml
12+
./target/debug/memstore-static-members --raft-addr=node1:60061 --web-server=0.0.0.0:8001
13+
ports:
14+
- "8001:8001"
15+
expose:
16+
- "8001"
17+
18+
node2:
19+
build:
20+
context: ../../../
21+
dockerfile: ./Dockerfile
22+
container_name: node2
23+
entrypoint: ["/bin/sh","-c"]
24+
command:
25+
- |
26+
./misc/generate-static-cluster-config.sh node1 node2 node3 > ./examples/memstore/static-members/cluster_config.toml
27+
./target/debug/memstore-static-members --raft-addr=node2:60062 --web-server=0.0.0.0:8002
28+
ports:
29+
- "8002:8002"
30+
expose:
31+
- "8002"
32+
33+
node3:
34+
build:
35+
context: ../../../
36+
dockerfile: ./Dockerfile
37+
container_name: node3
38+
entrypoint: ["/bin/sh","-c"]
39+
command:
40+
- |
41+
./misc/generate-static-cluster-config.sh node1 node2 node3 > ./examples/memstore/static-members/cluster_config.toml
42+
./target/debug/memstore-static-members --raft-addr=node3:60063 --web-server=0.0.0.0:8003
43+
ports:
44+
- "8003:8003"
45+
expose:
46+
- "8003"

examples/memstore/static-members/src/utils.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::io::ErrorKind;
55
use std::net::SocketAddr;
66
use std::path::Path;
77
use std::str::FromStr;
8+
use tokio::net::lookup_host;
89
use toml;
910

1011
#[derive(Deserialize, Debug)]
@@ -54,7 +55,14 @@ pub async fn load_peers(
5455
let mut peers = Peers::with_empty();
5556

5657
for peer_info in raft_config.raft.peers {
57-
let addr = SocketAddr::new(peer_info.ip.parse().unwrap(), peer_info.port);
58+
let addr = match peer_info.ip.parse() {
59+
Ok(ip) => SocketAddr::new(ip, peer_info.port),
60+
Err(_) => {
61+
let mut addrs = lookup_host((peer_info.ip.as_str(), peer_info.port)).await?;
62+
addrs.next().expect("Hostname resolution failed!")
63+
}
64+
};
65+
5866
let role = InitialRole::from_str(&peer_info.role).expect("Invalid role!");
5967
peers.add_peer(peer_info.node_id, addr, Some(role));
6068
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#!/bin/bash
2+
# Generate `cluster_config.toml` used in static bootstrap example.
3+
# Used in `docker-compose.yml` of the static members example.
4+
5+
if [ "$#" -lt 1 ]; then
6+
echo "Usage: $0 addr1 addr2 addr3 ..."
7+
exit 1
8+
fi
9+
10+
port=60061
11+
node_id=1
12+
13+
for ip in "$@"
14+
do
15+
echo "[[raft.peers]]"
16+
echo "ip = \"$ip\""
17+
echo "port = $port"
18+
echo "node_id = $node_id"
19+
echo "role = \"voter\""
20+
echo ""
21+
22+
port=$((port + 1))
23+
node_id=$((node_id + 1))
24+
done

0 commit comments

Comments
 (0)