Trabalhar com Microservices é algo extremamente produtivo, você pode ter cada parte da sua aplicação em projetos/repositórios separados, utilizar a melhor linguagem para aquela funcionalidade e ainda fazer o deploy de cada Microservice isoladamente, sem afetar o restante da sua aplicação.
Nesse tutorial vamos demonstrar com exemplos como mapear cada docker container nas configurações do Nginx, sendo tanto para sub-domínios quanto para uma pasta em um domínio específico.

Estrutura de diretório

Nesse projeto de exemplo, para efeito de simplicidade, teremos 2 microservices, 1 nginx como nosso proxy e 1 database noSQL. Claro que você pode depois alterar essa arquitetura para usar quantos microservices você quiser, em qualquer linguagem que quiser e utilizar database tanto SQL quanto noSQL.

accounts/
    |_ Dockerfile
pagerduty/
    |_ Dockerfile
nginx/
    |_ conf/
    |_ sites.conf
    |_ .htpasswd
    |_ Dockerfile
docker-compose.yml

Configuração do Docker Compose para microservices

web:
  build: nginx/
  ports: 
    - "80:80"
  links: 
    - pagerduty
    - accounts
    - db

pagerduty:
  build: pagerduty/
  environment:
    - PAGERDUTY_TOKEN

accounts:
  build: accounts/
  links:
    - db

db:
  image: rethinkdb
  volumes_from:
    - dbData

# It is recommended to use a separate container for data volumes. 
# This provides some benefits, for e.g., the db container can be upgraded without affecting the data
dbData:
  image: busybox
  volumes:
    - /data
  command: echo Data Volume for db

Dockerfile do microservice “accounts”

FROM dockerfile/nodejs

# Bundle app source
COPY . /repo WORKDIR /repo

# Install app dependencies
RUN npm install

# Build the web app
RUN npm run build

ENV PORT 3000
ENV NODE_ENV production

EXPOSE 3000

CMD ["npm", "start"]

Dockerfile do microservice “pageduty”

FROM iojs

ADD . /repo WORKDIR /repo

RUN npm install

ENV PORT 4000
ENV NODE_ENV production

EXPOSE 4000

CMD iojs bin/www

Dockerfile do Nginx

FROM nginx
ADD conf/sites.conf /etc/nginx/conf.d/sites.conf
ADD .htpasswd /etc/nginx/.htpasswd

# For htpasswd generation help, follow this tutorial
# https://www.digitalocean.com/community/tutorials/how-to-set-up-http-authentication-with-nginx-on-ubuntu-12-10

Configurando o Nginx

server {
  listen 80;

  server_name accounts.example.com;

  location / {
    proxy_pass http://accounts:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

server {
  listen 80;

  server_name pagerduty.example.com;

  location / {
    proxy_pass http://pagerduty:4000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

server {
  listen 80;

  server_name db.example.com;

  location / {
    proxy_pass http://db:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
  }
}

Criando as imagens e subindo os containers com o docker-compose

# You can start your service with
PAGERDUTY_TOKEN={TOKEN} docker-compose up -d

# Stop services
docker-compose stop

# Rebuild service(s)
docker-compose build
docker-compose build accounts

Comentários

comentários