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

Utilizar docker compose para gestionar y administrar varios contenedores

Docker Logo

En el anterior artículo Preparar un entorno de desarrollo basado docker con elasticseach, kibana y sense vimos como preparar dos contenedores docker, uno basado en elasticsearch y otro basado en kibana.

Lo que vamos a ver en este pequeño artículo es una guía de como preparar los mismos contenedores pero utilizando docker compose. Como sabemos docker compose es una herramienta de docker con la que nos permiten manejar varios contenedores con un solo comando.

Utilizando docker compose nos evitamos la tediosa tarea de tener que crear, arrancar, parar y borrar cada uno de los contenedores por separado utilizados en nuestro proyecto.

docker-compose.yml

Es el fichero donde le decimos a docker compose los contenedores que tiene que gestionar y administrar.

Vamos a crear nuestro entorno de desarrollo basado en un contenedor de elasticsearch y otro de kibana.

El contenedor de Kibana

  • se encontrará lincado al contenedor de elasticsearch
  • dejaremos su puerto disponible en el host, en el primer puerto libre que tenga la máquina

El contenedor de elasticsearch

  • dejaremos sus puertos disponible en el host, en el primer puerto libre que tenga la máquina, por si fuera necesario acceder directamente por el API Rest a elasticsearch.

El primer paso será crear un directorio y dentro de él creamos el fichero docker-compose.yml.

$ mkdir test-elasticsearch-kibana
$ cd test-elasticsearch-kibana
$ touch docker-compose.yml

Y editamos el fichero docker-compose-yml

elasticsearch:
  image: elasticsearch:2.1.1
  container_name: test-elasticsearch-2.1.1
  ports:
    - "9200"
    - "9300"
  expose:
    - "9200"
    - "9300"

kibana:
  image: kibana:4.3.1
  container_name: test-kibana-4.3.1
  links:
    - elasticsearch
  ports:
    - "5601"

donde,

  • image. Indicamos la imagen a partir de la cual queremos crear el contenedor.
  • container_name: El nombre del contenedor. Es opcional y si no le ponemos uno docker compose le asignará un nombre por defecto.
  • ports: Los puertos que queremos tener disponible en la maquina host.
  • expose: Los puertos que deben ser expuestos para otros contenedores (links).
  • links: Creamos un link con el contenedor de elasticsearch desde el contenedor de kibana.

Operaciones principales

Una vez tenemos el fichero creado, procederemos como siempre.

Arrancamos los dos contenedores

$ docker-compose up -d

Paramos los dos contenedores

$ docker-compose stop

Borramos los dos contenedores

$ docker-compose rm

Ver los puertos mapeados de uno de los contenedores

$ docker-compose port elasticsearch 9200

Instalar el plugin sense en Kibana

docker exec test-kibana-4.3.1 /opt/kibana/bin/kibana plugin --install elastic/sense

etc

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