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

Deja un comentario