É 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
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
- Multiplos ambientes isolados em um único host;
- Ambientes de desenvolvimento, testes e homologação;
- Preserva dados de volumes;
- Somente recria container que tenha mudado;
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
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
version: "3" - indica a versão do arquivo
services: - Services declara os containers que compõem a pilha de aplicações app:
db:
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:
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);
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
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
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:
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