Deploying an RTI Connext DDS Application with Docker

This article assumes familiarity with Docker. For instance, you should know the difference between containers and images, and the purpose of a Dockerfile. If not, visit www.docker.com and get up to speed on Docker basics before reading further.

Introduction

In this example, we’ll build and deploy a complete RTI Connext DDS application using Docker. We’ll use Ubuntu 16.04 (x64) for the target operating system and assume that the host is also using a Linux* OS.

You should already have a Docker image for building DDS applications. (For instructions on how to create this image, see Creating a Docker image with RTI Connext DDS.) We’ll assume this image is named dds-build. We’ll use  dds-build to build our application. Then we’ll create a new docker image, named myapp-deploy, that holds the compiled application. This image will be relatively small because it contains only the Linux image and the final application.

After we build the myapp-deploy image, we’ll run it in two different containers and see that the applications communicate successfully.

Let’s get started!

*The host can be a different version of a Linux, Windows, or Mac operating system.

Building an App

We’ll begin by using the dds-build image to generate and compile an example application.  Our application uses a simple IDL file, named Values.idl.

struct Values {
    unsigned long num;
};

Create a new directory, such as myapp, and add Values.idl to this directory.  We’ll use rtiddsgen to generate example code from this IDL.  Change directory to myapp (if not already there) and run the following command to generate example code based on Values.idl:

$ docker run -it --rm -v `pwd`:/app -w="/app" dds-build \
    rtiddsgen Values.idl -ppDisable -language C \
    -create typefiles -create examplefiles -create makefiles \
    -platform x64Linux3gcc5.4.0


This command starts a container using the dds-build image and runs the rtiddsgen utility (from the image) in the container.  The rtiddsgen utility operates on the myapp directory mounted at /app in the container.

The myapp directory should now contain several more files, including type files, an example publisher, and an example subscriber.  Compile the code using the following command:

$ docker run -it --rm -v `pwd`:/app -w="/app" dds-build \
    make -f makefile_Values_x64Linux3gcc5.4.0

Similar to above, this command runs make on the myapp directory, mounted at /app, all inside a container running the dds-build image.

The compiled applications are now located in myapp/objs/x64Linux3gcc5.4.0.

Creating a Deployment Image

One of the key ideas behind Docker is to bundle an application with everything it needs to run.  We can then easily deploy the application in a variety of environments without having to worry about dependencies.

Now we’ll create a “deployment” Docker image that encapsulates the test applications we just created.  We’ll use a single image to hold the publisher and subscriber applications, but you could put them in separate images.

As above, we need a dockerfile for constructing the new image.  Create the file in your myapp directory and name it Dockerfile.  It is a fairly simple recipe:

FROM ubuntu:16.04

# Store the test apps in /app 
WORKDIR /app

# Copy the apps and QoS file
COPY USER_QOS_PROFILES.xml \
    objs/x64Linux3gcc5.4.0/Values_publisher \
    objs/x64Linux3gcc5.4.0/Values_subscriber \
    rti_license.dat \
    ./

# Add the apps to the PATH
ENV PATH $PATH:/app

This recipe assumes you have a license file named rti_license.dat and that you’ve placed it in the myapp directory.  This will include your license in the deployment image and place it in the working directory of your applications, where RTI Connext DDS will automatically look for it.  Note that if you do not need a license to run your version of RTI Connext DDS, you can leave out the license file.  Also note that if you build your application with shared libraries, the deployment image must also include the target libraries from your RTI Connext DDS installation.

Run the following docker command in the myapp directory to build the image:

$ docker build -t myapp-deploy .

The local Docker registry now has an image named myapp-deploy.  This image contains everything needed to run the publisher and subscriber example applications.

Running the Apps

To keep this example simple, we’ll run the subscriber and publisher on the same machine and use the “bridge” network.  

To start the subscriber application, run:

$ docker run --rm --network=bridge -it myapp-deploy Values_subscriber

To start the publisher, run:

$ docker run --rm --network=bridge -it myapp-deploy Values_publisher

The subscriber should receive the publisher’s samples.

You can use the docker container ls and docker container stop commands to list the container IDs and stop the applications.

Congratulations!  You’ve just successfully compiled and deployed an RTI Connext DDS application using Docker.

Other Topics

For more examples of how to use Docker with RTI Connext DDS, search for “docker” at https://community.rti.com or https://blogs.rti.com.

 
Keywords: