Hoy vengo con algo de cosecha propia … bueno como todo.
En esta entrada me gustaria poner un contenedor que hice basandome en ambassador.
¿Que es ambassador?
Pues nada revisaros las antiguas entradas de docker que hay viene explicado.
¿Por que hacer un contenedor de algo que ya funciona?
Pues la idea de realizar este contenedor fue, por que necesitaba integrar ambassador con consul.io , entonces cree el contenedor.
Ventajas que tiene: todo corre con supervisor y se le ha habilitado el ssh y la interface web de supervisor para hacer seguimiento y depurar los fallos.
Por lo que tendremos mayor control del contenedor y un sistemas mas completo frente a busybox del original.
Desventajas: pesa un pelin mas que la original
Los pasos pasa usarlo son los siguientes.
1º Copiarme el dockerfile
FROM debian:latest MAINTAINER t13rn0 RUN apt-get update RUN apt-get upgrade -y --force-yes RUN apt-get install -y --force-yes build-essential python-pip bind9 dnsutils supervisor RUN wget http://www.dest-unreach.org/socat/download/socat-1.7.2.4.tar.gz -O /opt/socat-1.7.2.4.tar.gz RUN tar -xzvf /opt/socat-1.7.2.4.tar.gz RUN ln -sf /opt/socat-1.7.2.4 /opt/socat WORKDIR /opt/socat RUN ./configure && make RUN ln -sf /opt/socat/socat /usr/bin/socat ADD ./socat.sh /opt/socat.sh ADD ./dns.sh /opt/dns.sh ADD ambassador.conf /etc/supervisord/conf.d/ambassador.conf ENV MASTER=127.0.0.1 ENV PORT=1234 EXPOSE 22 9001 CMD ["/usr/bin/supervisord"]
2º Copiamos los ficheros adicionales
socat.sh #!/bin/bash PID_SOCAT=`ps -elf | grep "/usr/bin/socat" | grep -v grep | awk '{print $4}'` if [[ $PID_SOCAT ]] ; then kill -9 $PID_SOCAT fi PORT_ORIGEN=`/usr/bin/env | /bin/grep _TCP= | /bin/sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/\1/'` PORT_DEST=`/usr/bin/env | /bin/grep _TCP= | /bin/sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/\3/'` IP_REDIRECCION=`/usr/bin/env | /bin/grep _TCP= | /bin/sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/\2/'` if [[ $CONSUMER ]] ; then /usr/bin/socat TCP4-LISTEN:$PORT_ORIGEN,fork,reuseaddr TCP4:$IP_REDIRECCION:$PORT_DEST fi if [[ $CLIENT ]] ; then IP_REDIRECCION=`/usr/bin/env | /bin/grep _TCP= | grep $PORT | /bin/sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/\2/'| uniq` /usr/bin/socat TCP4-LISTEN:$PORT,fork,reuseaddr TCP4:$IP_REDIRECCION:$PORT fi dns.sh #!/bin/bash stop(){ PID_DNS=`ps -elf | grep "/opt/dns.sh start"| grep -v grep | awk '{print $4}'` if [[ $PID_DNS ]] ; then kill -9 $PID_DNS PID_NAMED=`ps -elf | grep "/usr/sbin/named" | grep -v grep | awk '{print $4}'` if [[ $PID_NAMED ]] ; then kill -9 $PID_NAMED fi else PID_NAMED=`ps -elf | grep "/usr/sbin/named" | grep -v grep | awk '{print $4}'` if [[ $PID_NAMED ]] ; then kill -9 $PID_NAMED fi fi } reload (){ IP_MASTER=`env | grep MASTER | cut -d = -f 2` sed -i "s/forwarders { .* };/forwarders { $IP_MASTER port 8600 ; };/" /etc/bind/consul.conf } start(){ reload /usr/sbin/named -g -u bind } case $1 in "start") start;; "stop") stop;; "reload") reload;; *) echo "dns start|stop|reload" esac ambassador.conf [supervisord] nodaemon=True [program:sshd] priority=1000 command=/usr/sbin/sshd -D redirect_stderr=true stderr_logfile=/var/log/sshd.log stdout_logfile=/var/log/sshd.log autostart=true autorestart=true stopsignal=KILL startsecs=5 [program:dns] command=/opt/dns.sh start redirect_stderr=true stderr_logfile=/var/log/dns.log stdout_logfile=/var/log/dns.log autostart=true autorestart=true stopasgroup=true killasgroup=true stopsignal=TERM startsecs=5 [program:socat] command=/opt/socat.sh redirect_stderr=true stderr_logfile=/var/log/socat.log stdout_logfile=/var/log/socat.log autostart=true autorestart=true stopasgroup=true killasgroup=true stopsignal=TERM startsecs=5 [inet_http_server] port = 0.0.0.0:9001 username = xxxx password = xxxx
3º compilamos el contenedor con el comando
docker build -t fuyur .
Una vez compilado corremos el contenedor de la siguiente forma
Cliente
/usr/bin/docker run --name xxxx -p xxxx:22 -p xxxx:9001 --link xxx:xxx -p xxx:xxx -e PORT=xxx -e CLIENT=True fuyur:latest #Variables PORT #puerto que queremos redireccionar --link #linkaremos el contenedor origen de donde queremos redireccionar su puerto -p xxxx:xxxx debe coincidir con el PORT por que si no no sera capaz de redireccionar el puerto CLIENT=True #se debe indicar si sera cliente o consumidor
Consumidor
/usr/bin/docker run --name xxxx --expose xxxx -p xxxx:22 -p xxxx:9001 -e xxxx_PORT_xxxx_TCP=tcp://servicio de consul:xxxx -e MASTER=xxx.xxx.xxx.xxx -e CONSUMER=True fuyur:latest #Variables CONSUMER=True #se debe indicar si sera cliente o consumidor --expose #el port que queremos consumir MASTER= # ip del servidor maestro de consul.io
Como digo siempre espero que os sea util ami lo fue