Como configurar nginx como proxy reverso en un contenedor de docker

Docker Logo

Vamos a configurar un contenedor de docker basado en nginx para que funcione como un proxy reverso contra un contenedor de Kibana y otro de elasticsearch.

Para facilitar la creación y gestión de todos los contenedores vamos a utilizar docker compose.

El acceso a Kibana y a elasticsearch desde el host se realizará siempre desde el contenedor de nginx.

La topología de este sistema es:

  • el host accede a nginx
  • nginx accede a kibana y a elasticseach
  • kibana accede a elasticsearch

Desde nuestro host solo tendremos acceso al contenedor de nginx, ya que el resto de contenedores no van a tener expuestos los puertos de cada servicio.

Sigue leyendo

Anuncios

Preparar un entorno de desarrollo basado en docker con elasticseach, kibana y sense

Docker Logo

Vamos a crear 2 contenedores de Docker, uno con una instancia de elasticsearch, y el otro con una instancia de Kibana. En este segundo contenedor instalaremos el plugin Sense, y además lo lincaremos con el contenedor de elasticsearch.

Un paso más que no veremos en este artículo sería utilizar docker compose para gestionar el ciclo de vida de ambos contenedores como si fuera uno solo. Este paso ya lo veremos en otro artículo.

Por tanto lo que vamos a ver en este articulo es

  • crear un contenedor docker basado en elasticsearch, mapeando los puertos del contenedor a la máquina host, para tener acceso desde nuestra maquina a los servicios de elasticseach
  • utilizar docker logs para ver el correcto arranque de elasticsearch, kibana y la instalación de sense
  • crear un contenedor basado en kibana, mapeando los puertos del contenedor a la máquina host, para tener acceso desde nuestra máquina a los servicios de kibana
  • crear un link desde el contenedor basado en kibana hacia el contenedor basado en elasticsearch, para facilizar la comunicación de red entre kibana y elasticsearch.

Preparar un contenedor docker con elasticsearch

Arrancamos el contenedor docker con elasticsearch

$ docker run -d --name es-server-test -p 9200:9200 -p 9300:9300 elasticsearch:2.1.1
251554d157a73a177940093ec79cb342cd9927dba5b6b25c5f67bf105884fa59
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
251554d157a7 elasticsearch:2.1.1 "/docker-entrypoint.s" 5 seconds ago Up 4 seconds 0.0.0.0:32772->9200/tcp, 0.0.0.0:32771->9300/tcp es-server-test

Comprobamos el funcionamiento de elasticsearch

docker@default:~$ curl localhost:9200
{
 "name" : "Starstreak",
 "cluster_name" : "elasticsearch",
 "version" : {
 "number" : "2.1.1",
 "build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
 "build_timestamp" : "2015-12-15T13:05:55Z",
 "build_snapshot" : false,
 "lucene_version" : "5.3.1"
 },
 "tagline" : "You Know, for Search"
}
$ docker logs es-server-test
[2016-01-14 14:38:25,583][INFO ][env ] [Starstreak] using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/sda1)]], net usable_space [14.4gb], net total_space [18.1gb], spins? [possibly], types [ext4]
[2016-01-14 14:38:29,240][INFO ][node ] [Starstreak] initialized
[2016-01-14 14:38:29,247][INFO ][node ] [Starstreak] starting ...
[2016-01-14 14:38:29,433][WARN ][common.network ] [Starstreak] publish address: {0.0.0.0} is a wildcard address, falling back to first non-loopback: {172.17.0.2}
[2016-01-14 14:38:29,433][INFO ][transport ] [Starstreak] publish_address {172.17.0.2:9300}, bound_addresses {[::]:9300}
[2016-01-14 14:38:29,453][INFO ][discovery ] [Starstreak] elasticsearch/Y6CTY4f7RWyGy4621sxcFw
[2016-01-14 14:38:32,499][INFO ][cluster.service ] [Starstreak] new_master {Starstreak}{Y6CTY4f7RWyGy4621sxcFw}{172.17.0.2}{172.17.0.2:9300}, reason: zen-disco-join(elected_as_master, [0] joins received)
[2016-01-14 14:38:32,508][WARN ][common.network ] [Starstreak] publish address: {0.0.0.0} is a wildcard address, falling back to first non-loopback: {172.17.0.2}
[2016-01-14 14:38:32,509][INFO ][http ] [Starstreak] publish_address {172.17.0.2:9200}, bound_addresses {[::]:9200}
[2016-01-14 14:38:32,509][INFO ][node ] [Starstreak] started
[2016-01-14 14:38:32,587][INFO ][gateway ] [Starstreak] recovered [0] indices into cluster_state

Preparar un contenedor con kibana y el plugin de sense

Arrancamos kibana

$ docker run --link es-server-test:elasticsearch -d --name kibana-es-server-test -p 5601:5601 kibana:4.3.1
1bc9c3a03cd6b97d6b507b5cffa8ec323cee3237ced8661d45ef727ed954635c
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1bc9c3a03cd6 kibana:4.3.1 "/docker-entrypoint.s" 3 seconds ago Up 3 seconds 0.0.0.0:32776->5601/tcp kibana-es-server-test        
251554d157a7 elasticsearch:2.1.1 "/docker-entrypoint.s" 23 minutes ago Up 23 minutes 0.0.0.0:32772->9200/tcp, 0.0.0.0:32771->9300/tcp es-server-test

Instalamos el plugin sense en kibana

$ docker exec kibana-es-server-test kibana plugin --install elastic/sense

Miramos los logs verificando la instalación correcta de sense

$ docker logs -f kibana-es-server-test
Installing sense
Attempting to extract from https://download.elastic.co/elastic/sense/sense-latest.tar.gz
Downloading 318236 bytes....................
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete

Reiniciamos el contenedor de kibana

$ docker restart kibana-es-server-test

Finalmente accedemos desde un navegador a kibana y sense

Kibana localhost:5601

Kibana

Sense localhost:5601/app/sense

Sense