Skip to content

Instantly share code, notes, and snippets.

@renatoapcosta
Last active June 24, 2018 22:38
Show Gist options
  • Save renatoapcosta/86d90664f723296c744500bb4acbbafe to your computer and use it in GitHub Desktop.
Save renatoapcosta/86d90664f723296c744500bb4acbbafe to your computer and use it in GitHub Desktop.
Docker Compose

Docker Compose

Definição

É uma ferramenta complementar do docker.

  • Para provisionamento de containers.
  • Para criar e executar multiplos containers de aplicação
  • Orquestrar a criação e administração de um conjunto de containers apartir do uso de um simples arquivo de configuração

Instalação

No windows ou no mac essa ferramenta já vem instalada.

Para instalar no Linux:

sudo curl -L https://github.com/docker/compose/releases/download/X.XX.XX/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

ou

sudo apt install docker-compose

$ docker-compose --version

docker-compose version 1.18.0, build 1719ceb

Benefício

  • Multiplos ambientes isolados em um único host;
  • Ambientes de desenvolvimento, testes e homologação;
  • Preserva dados de volumes;
  • Somente recria container que tenha mudado;

Comparando

Exemplo de como criar uma aplicação de multiplos containers sem docker compose

docker network create rede_app
docker volume create vol_A
docker volume create vol_B
docker run -d --network=rede_app --name container_a -v vol_A:/pasta/appA image
docker run -d --network=rede_app --name container_a -v vol_B:/pasta/appB -p 80:80 image

Mesmo exemplo com o docker compose

docker-compose.yml ou docker-compose.yaml

version: "3.1"
services:
  container_a:
    image: app_image:tag
    volumes:
      - vol_A:/pasta/appA 
  container_b:
    image: app_image:tag
    volumes:
      - vol_B:/pasta/appB
     ports:
      - 80:80
volumes:
  vol_A:
  vol_B:
  
  
 docker-compose up -d

Estrutura do arquivo compose

version: "3" - indica a versão do arquivo

services: - Services declara os containers que compõem a pilha de aplicações app:

db:

Exemplo

 version: "3"
 services:
    app:
       build: ./dir
       image: webapp:tag
       ports:
        - "6379"
       networks:
        - frontend
        
    db:
      image: postgres:9.4
      volumes:
        -db-data:/var/lib/postgresql/data
      networks:
        -backend
  
  networks:
    frontend:
    backend:
    
  volumes:
    db-data:

Configurações Opções Básicas

   build - constrói uma imagem a partir do arquivo Dockerfile informado;    image - informa nome e tag da imagem. Se atrelado a config build constroirá uma imagem com nome e tag informados;    environment - adiciona variáveis de ambientes;    ports - expõe as portas do service. Padrão "HOST:CONTAINER"    networks - informa as docker network que o container fará parte volumes - oferece o recurso de bind volume com o host e named volumes ( docker volumes);

Comandos

Path do docker-compose.yml

docker-compose -f /path/docker-compose.yml

Listar containers

docker-compose ps

Para criar os containers

docker-compose up -d

docker-compose up -d --force-recreate

docker-compose up SERVICE_NAME

Para iniciar ou parar containers

docker-compose start

docker-compose start SERVICE_NAME

docker-compose stop

docker-compose stop SERVICE_NAME

Para remover uma imagem

docker-compose down --rmi all

docker-compose down --rmi local

docker-compose down -v   ( remove os volumes )

docker-compose down --volumes ( remove volumes )

Para ver os logs dos containers

docker-compose logs -f

docker-compose logs -f SERVICE_NAME

Para ver todas imagens baixadas

docker-compose images

docker-compose images SERVICE_NAME ( imagens associada a esse container )

Para ver o consumo basico de cpu e memoria

docker-compose top

Para criar outro processo em paralelo para executar comandos ou ter acesso ao shell

docker-compose exec SERVICE_NAME sh

docker-compose exec SERVICE_NAME ps

Para ajuda

docker-compose help

Commands: build Build or rebuild services bundle Generate a Docker bundle from the Compose file config Validate and view the Compose file create Create services down Stop and remove containers, networks, images, and volumes events Receive real time events from containers exec Execute a command in a running container help Get help on a command images List images kill Kill containers logs View output from containers pause Pause services port Print the public port for a port binding ps List containers pull Pull service images push Push service images restart Restart services rm Remove stopped containers run Run a one-off command scale Set number of containers for a service start Start services stop Stop services top Display the running processes unpause Unpause services up Create and start containers version Show the Docker-Compose version information

Projetos

Instânciar um servidor básico em python e conta cada requisição, armazenando no redis

docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

Dockerfile

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

app.py

from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Olá! Eu fui visto {} vezes.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

requirements.txt

flask
redis

O arquivo requirements.txt é para o pip do python instalar. No docker-compose.yml em web a config option "build: .", procura o Dockerfile e criar o container.

Para iniciar o projeto

docker-compose up -d

Wordpress e banco de dados Mysql

docker-compose.yml

version: '3'
services:
   db:
     image: mysql:5.7
     restart: always
     container_name: mysql_wordpress_compose
     networks:
      - net-backend
     volumes:
       - db_data:/var/lib/mysql
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:4.7-php5.6
     restart: always
     container_name: wordpress_compose
     networks:
      - net-backend
     ports:
       - "9080:80"
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_NAME: wordpress
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

networks:
  net-backend:

volumes:
    db_data:

Haproxy com Wordpress e banco de dados Mysql

   version: '3' services: mysql: image: mysql:5.7 restart: always container_name: mysql_wordpress_ha_compose volumes: - db-ha-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress

  wordpress1:
    depends_on:
       - mysql
    image: wordpress:4.7-php5.6
    restart: always
    container_name: wordpress1_ha_compose
    ports:
      - 81:80
    environment:
       WORDPRESS_DB_HOST: mysql:3306
       WORDPRESS_DB_NAME: wordpress
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

  wordpress2:
    depends_on:
       - mysql
    image: wordpress:4.7-php5.6
    restart: always
    container_name: wordpress2_ha_compose
    ports:
      - 82:80
    environment:
       WORDPRESS_DB_HOST: mysql:3306
       WORDPRESS_DB_NAME: wordpress
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress

  haproxy:
    image: haproxy:1.6
    restart: always
    ports:
      - 80:80
    volumes:
      - "./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro"

volumes:
    db-ha-data:

Pasta haproxy/haproxy.cfg

global  
    debug  

defaults  
        log 	global  
        mode    http  
        timeout connect 50000  
        timeout client 50000  
        timeout server 50000  

frontend main  
        bind *:80  
        default_backend wordpress  

backend wordpress  
        balance roundrobin  
        mode http  
    # Verify that service is available
    #option httpchk OPTIONS * HTTP/1.1\r\nHost:localhost
    # Insert X-Forwarded-For header
        #option forwardfor
        server wp1 wordpress1:80 weight 1 minconn 3 maxconn 500 check 
        server wp2 wordpress2:80 weight 1 minconn 3 maxconn 500 check

    #This is the virtual URL to access the stats page
    stats uri /haproxy_stats        

    #The user/pass you want to use.
    stats auth admin:admin   

    #This allows you to take down and bring up back end servers.
    stats admin if TRUE

Para acessar o dashboard do haproxy

http://localhost/haproxy_stats
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment