:title: Linking to an Redis container :description: Running redis linked into your web app :keywords: docker, example, networking, redis, link .. _linking_redis: Linking Redis ============= .. include:: example_header.inc Building a redis container to link as a child of our web application. Building the redis container ---------------------------- We will use a pre-build version of redis from the index under the name ``crosbymichael/redis``. If you are interested in the Dockerfile that was used to build this container here it is. .. code-block:: bash # Build redis from source # Make sure you have the redis source code checked out in # the same directory as this Dockerfile FROM ubuntu RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y gcc make g++ build-essential libc6-dev tcl ADD . /redis RUN (cd /redis && make) RUN (cd /redis && make test) RUN mkdir -p /redis-data VOLUME ["/redis-data"] EXPOSE 6379 ENTRYPOINT ["/redis/src/redis-server"] CMD ["--dir", "/redis-data"] We need to ``EXPOSE`` the default port of 6379 so that our link knows what ports to connect to our redis container on. If you do not expose any ports for the image then docker will not be able to establish the link between containers. Run the redis container ----------------------- .. code-block:: bash docker run -d -e PASSWORD=docker crosbymichael/redis --requirepass=docker This will run our redis container using the default port of 6379 and using as password to secure our service. Next we will link the redis container to a new name using ``docker link`` and ``docker ls``. Linking an existing container ----------------------------- .. code-block:: bash docker ls NAME ID IMAGE /39588b6a45100ef5b328b2c302ea085624f29e6cbab70f88be04793af02cec89 39588b6a45100ef5b328b2c302ea085624f29e6cbab70f88be04793af02cec89 crosbymichael/redis:latest Docker will automatically create an initial link with the container's id but because the is long and not very user friendly we can link the container with a new name. .. code-block:: bash docker link /39588b6a45100ef5b328b2c302ea085624f29e6cbab70f88be04793af02cec89 /redis docker ls NAME ID IMAGE /redis 39588b6a45100ef5b328b2c302ea085624f29e6cbab70f88be04793af02cec89 crosbymichael/redis:latest /39588b6a45100ef5b328b2c302ea085624f29e6cbab70f88be04793af02cec89 39588b6a45100ef5b328b2c302ea085624f29e6cbab70f88be04793af02cec89 crosbymichael/redis:latest Now we can reference our running redis service using the friendly name ``/redis``. We can issue all the commands that you would expect; start, stop, attach, using the new name. Linking redis as a child ------------------------ Next we can start a new web application that has a dependency on redis and apply a link to connect both containers. If you noticed when running our redis service we did not use the ``-p`` option to publish the redis port to the host system. Redis exposed port 6379 but we did not publish the port. This allows docker to prevent all network traffic to the redis container except when explicitly specified within a link. This is a big win for security. Now lets start our web application with a link into redis. .. code-block:: bash docker run -t -i -link /redis:db ubuntu bash root@4c01db0b339c:/# env HOSTNAME=4c01db0b339c DB_NAME=/4c01db0b339cf19958731255a796ee072040a652f51652a4ade190ab8c27006f/db TERM=xterm DB_PORT=tcp://172.17.0.8:6379 DB_PORT_6379_TCP=tcp://172.17.0.8:6379 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ DB_ENV_PASSWORD=dockerpass SHLVL=1 HOME=/ container=lxc _=/usr/bin/env root@4c01db0b339c:/# When we inspect the environment of the linked container we can see a few extra environment variables have been added. When you specified ``-link /redis:db`` you are telling docker to link the container named ``/redis`` into this new container with the alias ``db``. Environment variables are prefixed with the alias so that the parent container can access network and environment information from the child. .. code-block:: bash # The name of the child container DB_NAME=/4c01db0b339cf19958731255a796ee072040a652f51652a4ade190ab8c27006f/db # The default protocol, ip, and port of the service running in the container DB_PORT=tcp://172.17.0.8:6379 # A specific protocol, ip, and port of various services DB_PORT_6379_TCP=tcp://172.17.0.8:6379 # Get environment variables of the container DB_ENV_PASSWORD=dockerpass Accessing the network information along with the environment of the child container allows us to easily connect to the redis service on the specific ip and port and use the password specified in the environment.