Merge pull request #16801 from aidanhs/aphs-add-socat-t

Update ambassador image, use the socat -t option
This commit is contained in:
Sven Dowideit 2015-10-20 14:24:25 +10:00
commit b826215c57
2 changed files with 40 additions and 35 deletions

View File

@ -81,42 +81,43 @@ On the Docker host (192.168.1.52) that Redis will run on:
^D ^D
# add redis ambassador # add redis ambassador
$ docker run -t -i --link redis:redis --name redis_ambassador -p 6379:6379 busybox sh $ docker run -t -i --link redis:redis --name redis_ambassador -p 6379:6379 alpine:3.2 sh
In the `redis_ambassador` container, you can see the linked Redis In the `redis_ambassador` container, you can see the linked Redis
containers `env`: containers `env`:
$ env / # env
REDIS_PORT=tcp://172.17.0.136:6379 REDIS_PORT=tcp://172.17.0.136:6379
REDIS_PORT_6379_TCP_ADDR=172.17.0.136 REDIS_PORT_6379_TCP_ADDR=172.17.0.136
REDIS_NAME=/redis_ambassador/redis REDIS_NAME=/redis_ambassador/redis
HOSTNAME=19d7adf4705e HOSTNAME=19d7adf4705e
SHLVL=1
HOME=/root
REDIS_PORT_6379_TCP_PORT=6379 REDIS_PORT_6379_TCP_PORT=6379
HOME=/
REDIS_PORT_6379_TCP_PROTO=tcp REDIS_PORT_6379_TCP_PROTO=tcp
container=lxc
REDIS_PORT_6379_TCP=tcp://172.17.0.136:6379 REDIS_PORT_6379_TCP=tcp://172.17.0.136:6379
TERM=xterm TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/ PWD=/
/ # exit
This environment is used by the ambassador `socat` script to expose Redis This environment is used by the ambassador `socat` script to expose Redis
to the world (via the `-p 6379:6379` port mapping): to the world (via the `-p 6379:6379` port mapping):
$ docker rm redis_ambassador $ docker rm redis_ambassador
$ sudo ./contrib/mkimage-unittest.sh $ CMD="apk update && apk add socat && sh"
$ docker run -t -i --link redis:redis --name redis_ambassador -p 6379:6379 docker-ut sh $ docker run -t -i --link redis:redis --name redis_ambassador -p 6379:6379 alpine:3.2 sh -c "$CMD"
[...]
$ socat TCP4-LISTEN:6379,fork,reuseaddr TCP4:172.17.0.136:6379 / # socat -t 100000000 TCP4-LISTEN:6379,fork,reuseaddr TCP4:172.17.0.136:6379
Now ping the Redis server via the ambassador: Now ping the Redis server via the ambassador:
Now go to a different server: Now go to a different server:
$ sudo ./contrib/mkimage-unittest.sh $ CMD="apk update && apk add socat && sh"
$ docker run -t -i --expose 6379 --name redis_ambassador docker-ut sh $ docker run -t -i --expose 6379 --name redis_ambassador alpine:3.2 sh -c "$CMD"
[...]
$ socat TCP4-LISTEN:6379,fork,reuseaddr TCP4:192.168.1.52:6379 / # socat -t 100000000 TCP4-LISTEN:6379,fork,reuseaddr TCP4:192.168.1.52:6379
And get the `redis-cli` image so we can talk over the ambassador bridge. And get the `redis-cli` image so we can talk over the ambassador bridge.
@ -127,8 +128,8 @@ And get the `redis-cli` image so we can talk over the ambassador bridge.
## The svendowideit/ambassador Dockerfile ## The svendowideit/ambassador Dockerfile
The `svendowideit/ambassador` image is a small `busybox` image with The `svendowideit/ambassador` image is based on the `alpine:3.2` image with
`socat` built in. When you start the container, it uses a small `sed` `socat` installed. When you start the container, it uses a small `sed`
script to parse out the (possibly multiple) link environment variables script to parse out the (possibly multiple) link environment variables
to set up the port forwarding. On the remote host, you need to set the to set up the port forwarding. On the remote host, you need to set the
variable using the `-e` command line option. variable using the `-e` command line option.
@ -139,19 +140,21 @@ Will forward the local `1234` port to the remote IP and port, in this
case `192.168.1.52:6379`. case `192.168.1.52:6379`.
# #
# # do
# first you need to build the docker-ut image # docker build -t svendowideit/ambassador .
# using ./contrib/mkimage-unittest.sh
# then
# docker build -t SvenDowideit/ambassador .
# docker tag SvenDowideit/ambassador ambassador
# then to run it (on the host that has the real backend on it) # then to run it (on the host that has the real backend on it)
# docker run -t -i --link redis:redis --name redis_ambassador -p 6379:6379 ambassador # docker run -t -i -link redis:redis -name redis_ambassador -p 6379:6379 svendowideit/ambassador
# on the remote host, you can set up another ambassador # on the remote host, you can set up another ambassador
# docker run -t -i --name redis_ambassador --expose 6379 sh # docker run -t -i -name redis_ambassador -expose 6379 -e REDIS_PORT_6379_TCP=tcp://192.168.1.52:6379 svendowideit/ambassador sh
# you can read more about this process at https://docs.docker.com/articles/ambassador_pattern_linking/
FROM docker-ut # use alpine because its a minimal image with a package manager.
MAINTAINER SvenDowideit@home.org.au # prettymuch all that is needed is a container that has a functioning env and socat (or equivalent)
FROM alpine:3.2
MAINTAINER SvenDowideit@home.org.au
RUN apk update && \
apk add socat && \
rm -r /var/cache/
CMD env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' | sh && top CMD env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \& wait/' | sh

View File

@ -78,18 +78,20 @@ the `Using cache` message in the console output.
(For more information, see the [Build cache section](../articles/dockerfile_best-practices.md#build-cache)) in the (For more information, see the [Build cache section](../articles/dockerfile_best-practices.md#build-cache)) in the
`Dockerfile` best practices guide: `Dockerfile` best practices guide:
$ docker build -t SvenDowideit/ambassador . $ docker build -t svendowideit/ambassador .
Uploading context 10.24 kB Sending build context to Docker daemon 15.36 kB
Uploading context Step 0 : FROM alpine:3.2
Step 1 : FROM docker-ut ---> 31f630c65071
---> cbba202fe96b Step 1 : MAINTAINER SvenDowideit@home.org.au
Step 2 : MAINTAINER SvenDowideit@home.org.au
---> Using cache ---> Using cache
---> 51182097be13 ---> 2a1c91448f5f
Step 3 : CMD env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' | sh && top Step 2 : RUN apk update && apk add socat && rm -r /var/cache/
---> Using cache ---> Using cache
---> 1a5ffc17324d ---> 21ed6e7fbb73
Successfully built 1a5ffc17324d Step 3 : CMD env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \& wait/' | sh
---> Using cache
---> 7ea8aef582cc
Successfully built 7ea8aef582cc
When you're done with your build, you're ready to look into [*Pushing a When you're done with your build, you're ready to look into [*Pushing a
repository to its registry*](../userguide/dockerrepos.md#contributing-to-docker-hub). repository to its registry*](../userguide/dockerrepos.md#contributing-to-docker-hub).