123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- :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.
|