mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
147 lines
5.2 KiB
ReStructuredText
147 lines
5.2 KiB
ReStructuredText
|
: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.
|