6 changed files with 175 additions and 0 deletions
@ -0,0 +1,71 @@
|
||||
Docker + ZeroTier SDK |
||||
==== |
||||
|
||||
Welcome! |
||||
|
||||
Imagine a flat, encrypted, no-configuration LAN for all of your Docker containers. |
||||
|
||||
This short tutorial will show you how to enable ZeroTier functionality for your Docker software container with little to no configuration. In this example we aim to build a Docker container with ZeroTier’s Network Container service bundled right in so that it’s effortless to hook any number of your services in the container up to your virtual network. |
||||
|
||||
**Step 1: Build the ZeroTier service binaries** |
||||
|
||||
From the ZeroTier source directory, `make netcon` Optionally, if you'd like to see some debug output during execution, use `make netcon NETCON_DEBUG=1` |
||||
|
||||
**Step 2: Build your Docker image** |
||||
|
||||
`docker build --tag=redis_test .` |
||||
|
||||
The example dockerfile below incorperates a few important elements: |
||||
|
||||
1) The ZeroTier service binaries |
||||
2) Whatever ZeroTier identity keys you plan on using (if you don't already have keys you wish to use, fret not! A new identity will be generated automatically). |
||||
3) The service we've chosen to use. In this case, redis. |
||||
``` |
||||
FROM fedora:23 |
||||
# Install apps |
||||
RUN yum -y update |
||||
RUN yum -y install redis-3.0.4-1.fc23.x86_64 |
||||
RUN yum clean all |
||||
# Add ZT files |
||||
RUN mkdir -p /var/lib/zerotier-one/networks.d |
||||
ADD netcon_identity.public /var/lib/zerotier-one/identity.public |
||||
ADD netcon_identity.secret /var/lib/zerotier-one/identity.secret |
||||
ADD *.conf /var/lib/zerotier-one/networks.d/ |
||||
ADD *.conf / |
||||
ADD *.name / |
||||
EXPOSE 9993/udp 6379/udp |
||||
# Install LWIP library used by service |
||||
ADD liblwip.so /var/lib/zerotier-one/liblwip.so |
||||
# Install syscall intercept library |
||||
ADD libztintercept.so / |
||||
RUN cp libztintercept.so lib/libztintercept.so |
||||
RUN ln -sf /lib/libztintercept.so /lib/libztintercept |
||||
ADD zerotier-cli / |
||||
Add zerotier-netcon-service / |
||||
# Install test scripts |
||||
ADD netcon_entrypoint.sh /netcon_entrypoint.sh |
||||
RUN chmod -v +x /netcon_entrypoint.sh |
||||
# Start ZeroTier-One |
||||
CMD ["./netcon_entrypoint.sh"] |
||||
``` |
||||
|
||||
**Step 3: Start your container** |
||||
|
||||
`docker run -d -it redis_test /bin/bash` |
||||
|
||||
**Step 4: From your container, set up environment variables** |
||||
|
||||
Set our application pre-load with `export LD_PRELOAD=./libztintercept.so`. This dynamically loads our intercept library into your application which allows us to re-direct its network calls to our virtual network. |
||||
|
||||
Tell the ZeroTier Network Containers service which network to connect to with `export ZT_NC_NETWORK=/var/lib/zerotier-one/nc_XXXXXXXXXXXXXXXX`. |
||||
|
||||
**Step 5: Run your new ZeroTier-enabled service** |
||||
|
||||
At this point, simply run your application as you normally would. It will be automatically intercepted and linked to the ZeroTier service (and hence your virtual networks!) |
||||
|
||||
`/usr/bin/redis-server --port 6379` |
||||
|
||||
*** |
||||
**Additional info** |
||||
If you'd like to know the IP address your service can be reached at on this particular virtual network, use the following: |
||||
`zerotier-cli -D/var/lib/zerotier-one/nc_XXXXXXXXXXXXXXXX listnetworks` |
||||
@ -0,0 +1,84 @@
|
||||
Unity3D + ZeroTier SDK |
||||
==== |
||||
|
||||
Welcome! |
||||
|
||||
We want your Unity apps to talk *directly* over a flat, secure, no-config virtual network without sending everything into the "cloud". Thus, we introduce the ZeroTier-Unity3D integration! |
||||
|
||||
Our implementation currently intends to be the bare minimum required to get your Unity application to talk over ZeroTier virtual networks. As a result, we've created an API that is very similar to the built-in Unity LLAPI. It's possible that higher-level functionality could be added in the future. |
||||
|
||||
*** |
||||
## Adding ZeroTier to your Unity app |
||||
|
||||
**Step 1: Create virtual ZeroTier [virtual network](https://my.zerotier.com/)** |
||||
|
||||
**Step 2: Add plugin** |
||||
- Create a folder called `Plugins` in `Assets` |
||||
- Place `ZeroTierUnity.bundle` in that folder |
||||
|
||||
**Step 3: Add script to some `GameObject`** |
||||
- Drag our `ZeroTier.cs` native plugin wrapper onto any `GameObject` |
||||
|
||||
|
||||
*** |
||||
## Examples |
||||
|
||||
Calling `ZeroTier.Init()` will start the network service in a separate thread. You can check if the service is running by checking `ZeroTier.IsRunning()`. Then, connecting and sending data to another endpoint would look something like the following: |
||||
|
||||
``` |
||||
public void zt_sample_network_test_thread() |
||||
{ |
||||
// Prepare sample data buffer |
||||
byte[] buffer = new byte[1024]; |
||||
Stream stream = new MemoryStream(buffer); |
||||
BinaryFormatter f = new BinaryFormatter(); |
||||
f.Serialize ( stream , "Welcome to the machine! (from Unity3D)" ); |
||||
|
||||
// Connect and send |
||||
int error; |
||||
Connect (0, "192.168.0.6", 8887, out error); |
||||
Send(connfd,buffer,0, out error); |
||||
} |
||||
``` |
||||
|
||||
Finally, when you're done running the service you can call `ZeroTier.Terminate()` |
||||
|
||||
*** |
||||
## API |
||||
|
||||
The API is designed to resemble the Unity LLAPI, so you'll see a few familiar functions but with a slight twist. |
||||
|
||||
- `Join(nwid)`: Joins a ZeroTier virtual network |
||||
- `Leave(nwid)`: Leaves a ZeroTier virtual network |
||||
- `AddHost(port)`: Creates a socket, and binds to that socket on the address and port given |
||||
- `Connect(fd, ip_address, port, out error)`: Connects to an endpoint associated with the given `fd` |
||||
- `Send(fd, buf, pos, out error)`: Sends data to the endpoint associated with the given `fd` |
||||
- `Recv(fd, buf, out error)`: Receives data from an endpoint associated with the given `fd` |
||||
- `Disconnect(fd)`: Closes a connection with an endpoint |
||||
|
||||
*** |
||||
## Design and structure of the ZeroTier Unity OSX Bundle |
||||
|
||||
XCode: |
||||
New XCode project |
||||
Select Cocoa bundle as target |
||||
Add C linkages to external functions |
||||
Build as 64bit (not universal) |
||||
|
||||
Unity: |
||||
Select x86_64 build target in `Build Settings` |
||||
In new C# script asset: |
||||
|
||||
``` |
||||
[DllImport ("ZeroTierUnity")] |
||||
private static extern int unity_start_service (); |
||||
``` |
||||
|
||||
Add asset to GameObject |
||||
Start ZT service |
||||
|
||||
*** |
||||
## Future Roadmap |
||||
With the ZeroTier sockets API in place, higher-level functionality such as lobbies, chat, and object synchronization could easily be built on top. |
||||
|
||||
|
||||
Loading…
Reference in new issue