1. Simplest Client
Create a config file infinispan-simplest.xml with the following content:
<infinispan
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:16.0 https://infinispan.org/schemas/infinispan-config-16.0.xsd
urn:infinispan:server:16.0 https://infinispan.org/schemas/infinispan-server-16.0.xsd"
xmlns="urn:infinispan:config:16.0"
xmlns:server="urn:infinispan:server:16.0">
<cache-container name="default" statistics="true" default-cache="my-cache">
<local-cache name="my-cache"/>
</cache-container>
<server xmlns="urn:infinispan:server:16.0">
<interfaces>
<interface name="public">
<inet-address value="${infinispan.bind.address:127.0.0.1}"/>
</interface>
</interfaces>
<socket-bindings default-interface="public" port-offset="${infinispan.socket.binding.port-offset:0}">
<socket-binding name="default" port="${infinispan.bind.port:11222}"/>
</socket-bindings>
<security>
<security-realms>
<security-realm name="none"/>
</security-realms>
</security>
<endpoints socket-binding="default" security-realm="none"/>
</server>
</infinispan>
Then in the same folder run:
docker run -v .:/user-config -p 11222:11222 infinispan/server:16.0 \
-c /user-config/infinispan-simplest.xml
2. Authenticated Client
Create a config file infinispan-auth.xml with the following content:
<infinispan
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:16.0 https://infinispan.org/schemas/infinispan-config-16.0.xsd
urn:infinispan:server:16.0 https://infinispan.org/schemas/infinispan-server-16.0.xsd"
xmlns="urn:infinispan:config:16.0"
xmlns:server="urn:infinispan:server:16.0">
<cache-container name="default" statistics="true" default-cache="my-cache">
<security>
<authorization/>
</security>
<local-cache name="my-cache"/>
</cache-container>
<server xmlns="urn:infinispan:server:16.0">
<interfaces>
<interface name="public">
<inet-address value="${infinispan.bind.address:127.0.0.1}"/>
</interface>
</interfaces>
<socket-bindings default-interface="public" port-offset="${infinispan.socket.binding.port-offset:0}">
<socket-binding name="default" port="${infinispan.bind.port:11222}"/>
</socket-bindings>
<security>
<security-realms>
<security-realm name="default">
<properties-realm/>
</security-realm>
</security-realms>
</security>
<endpoints socket-binding="default" security-realm="default" />
</server>
</infinispan>
Then in the same folder run:
docker run -v .:/user-config -p 11222:11222 infinispan/server:16.0 \
-c /user-config/infinispan-simplest.xml
3. Multiple clusters
Create a config file infinispan-auth-dist.xml with the following content:
<infinispan
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:16.0 https://infinispan.org/schemas/infinispan-config-16.0.xsd
urn:infinispan:server:16.0 https://infinispan.org/schemas/infinispan-server-16.0.xsd"
xmlns="urn:infinispan:config:16.0"
xmlns:server="urn:infinispan:server:16.0">
<cache-container name="default" statistics="true" default-cache="my-cache">
<transport cluster="${infinispan.cluster.name:cluster}" stack="${infinispan.cluster.stack:tcp}" node-name="${infinispan.node.name:}"/>
<security>
<authorization/>
</security>
<distributed-cache name="my-cache"/>
</cache-container>
<server xmlns="urn:infinispan:server:16.0">
<interfaces>
<interface name="public">
<inet-address value="${infinispan.bind.address:127.0.0.1}"/>
</interface>
</interfaces>
<socket-bindings default-interface="public" port-offset="${infinispan.socket.binding.port-offset:0}">
<socket-binding name="default" port="${infinispan.bind.port:11222}"/>
</socket-bindings>
<security>
<security-realms>
<security-realm name="default">
<properties-realm/>
</security-realm>
</security-realms>
</security>
<endpoints socket-binding="default" security-realm="default" />
</server>
</infinispan>
Now you need a docker-compose.yml file to start two clusters with two nodes each.
version: '3.8'
services:
# Cluster 1 - Node 1
infinispan-cluster1-node1:
image: infinispan/server:16.0
container_name: infinispan-cluster1-node1
hostname: cluster1-node1
networks:
cluster1_network:
ipv4_address: 172.20.0.11
ports:
- "11222:11222"
environment:
- USER=username
- PASS=changeme
- JAVA_OPTIONS=-Djgroups.bind.address=NON_LOOPBACK
volumes:
- .:/user-config
command: >
-c /user-config/infinispan-auth-dist.xml
-b 0.0.0.0
--cluster-name=cluster1
# Cluster 1 - Node 2
infinispan-cluster1-node2:
image: infinispan/server:16.0
container_name: infinispan-cluster1-node2
hostname: cluster1-node2
networks:
cluster1_network:
ipv4_address: 172.20.0.12
ports:
- "11223:11222"
environment:
- USER=username
- PASS=changeme
- JAVA_OPTIONS=-Djgroups.bind.address=NON_LOOPBACK
volumes:
- .:/user-config
command: >
-c /user-config/infinispan-auth-dist.xml
-b 0.0.0.0
--cluster-name=cluster1
depends_on:
- infinispan-cluster1-node1
# Cluster 2 - Node 1
infinispan-cluster2-node1:
image: infinispan/server:16.0
container_name: infinispan-cluster2-node1
hostname: cluster2-node1
networks:
cluster2_network:
ipv4_address: 172.21.0.11
ports:
- "12222:11222"
environment:
- USER=username
- PASS=changeme
- JAVA_OPTIONS=-Djgroups.bind.address=NON_LOOPBACK
volumes:
- .:/user-config
command: >
-c /user-config/infinispan-auth-dist.xml
-b 0.0.0.0
--cluster-name=cluster2
# Cluster 2 - Node 2
infinispan-cluster2-node2:
image: infinispan/server:16.0
container_name: infinispan-cluster2-node2
hostname: cluster2-node2
networks:
cluster2_network:
ipv4_address: 172.21.0.12
ports:
- "12223:11222"
environment:
- USER=username
- PASS=changeme
- JAVA_OPTIONS=-Djgroups.bind.address=NON_LOOPBACK
volumes:
- .:/user-config
command: >
-c /user-config/infinispan-auth-dist.xml
-b 0.0.0.0
--cluster-name=cluster2
depends_on:
- infinispan-cluster2-node1
networks:
cluster1_network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
cluster2_network:
driver: bridge
ipam:
config:
- subnet: 172.21.0.0/16
Now in the same folder run:
docker compose up -d
You can see the server logs and stop everything with:
docker compose logs
docker compose down -v
4. TLS clusters
To setup a tls cluster a set of certificates is needed so that client and server can verify each other identity. To create all the certs and organized them in trust and key store, run the following
keytool -genkeypair -alias infinispan \
-keyalg RSA -keysize 2048 -keystore server.keystore \
-storepass changeme -keypass changeme -validity 365 \
-dname "CN=infinispan, OU=Test, O=MyOrg, L=City, S=State, C=US" \
-ext SAN=ip:192.168.1.100,ip:127.0.0.1,dns:localhost
keytool -exportcert -alias infinispan \
-keystore server.keystore -storepass changeme \
-rfc -file infinispan.crt
keytool -importcert -alias infinispan \
-file infinispan.crt -keystore client.truststore \
-storepass changeme -noprompt
rm infinispan.crt
keytool -genkeypair -alias infinispan \
-keyalg RSA -keysize 2048 -keystore client.keystore \
-storepass changeme -keypass changeme -validity 365 \
-dname "CN=infinispan, OU=Test, O=MyOrg, L=City, S=State, C=US" \
-ext SAN=ip:192.168.1.100,ip:127.0.0.1,dns:localhost
keytool -exportcert -alias infinispan \
-keystore client.keystore -storepass changeme \
-rfc -file infinispan.crt
keytool -importcert -alias infinispan \
-file infinispan.crt -keystore server.truststore \
-storepass changeme -noprompt
rm infinispan.crt
Create a infinispan-tls.xml configuration file:
<infinispan
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:16.0 https://infinispan.org/schemas/infinispan-config-16.0.xsd
urn:infinispan:server:16.0 https://infinispan.org/schemas/infinispan-server-16.0.xsd"
xmlns="urn:infinispan:config:16.0"
xmlns:server="urn:infinispan:server:16.0">
<cache-container name="default" statistics="true" default-cache="my-cache">
<local-cache name="my-cache"/>
</cache-container>
<server xmlns="urn:infinispan:server:16.0">
<interfaces>
<interface name="public">
<inet-address value="${infinispan.bind.address:127.0.0.1}"/>
</interface>
</interfaces>
<socket-bindings default-interface="public" port-offset="${infinispan.socket.binding.port-offset:0}">
<socket-binding name="default" port="${infinispan.bind.port:11222}"/>
</socket-bindings>
<security>
<security-realms>
<security-realm name="none">
<server-identities>
<ssl>
<keystore path="/user-config/server.keystore" password="changeme"/>
<truststore path="/user-config/server.truststore" password="changeme"/>
</ssl>
</server-identities>
</security-realm>
</security-realms>
</security>
<endpoints>
<endpoint socket-binding="default" security-realm="none" require-ssl-client-auth="true">
<hotrod-connector/>
<rest-connector/>
</endpoint>
</endpoints>
</server>
</infinispan>
docker run -v .:/user-config -p 11222:11222 infinispan/server:16.0 \
-c /user-config/infinispan-tls.xml