一 Docker Compose 简介
1.1 Docker Compose介绍
•Docker Compose是一个能一次性定义和管理多个Docker容器的工具。
•详细地说:
Compose中定义和启动的每一个容器都相当于一个服务(service)
Compose中能定义和启动多个服务,且它们之间通常具有协同关系
•管理方式:
使用YAML文件来配置我们应用程序的服务。
使用单个命令(docker-compose up),就可以创建并启动配置文件中配置的所有服务。
1.2 Docker Compose 工作原理

1.3 Docker Compose安装
1 2 3 4 5 6 7 8 9 10
|
这里示例安装版本是1.21.2,很可能您看到这里时,已经出现更新的版本,因此建议换成最新版本。
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
|
1.4 Docker Compose CLI
1 2 3
| 利用docker-compose --help查看 对比后会发现:Docker Compose CLI的很多命令的功能和Docker Client CLI是相似的。最主要的区别就是前者能一次性运行管理多个容器,后者只能一次管理一个。
|
二 了解 Docker Compose File
2.1Docker Compose File版本
•Docker Compose File 有多个版本,基本是向后兼容的,但也有极个别配置项高版本中没有。
•在docker-compose.yml一开始就需要利用version关键词标明当前file使用的版本

2.2 Docker Compose File TOP配置参数概览
Docker Compose File 顶级配置项:
•version:指定Docker Compose File版本号
•services:定义多个服务并配置启动参数
•volumes:声明或创建在多个服务中共同使用的数据卷对象
•networks:定义在多个服务中共同使用的网络对象
•configs:声明将在本服务中要使用的一些配置文件
•secrets:声明将在本服务中要使用的一些秘钥、密码文件
•x-***:自定义配置。主要用于复用相同的配置。
2.3 docker-compose命令
1 2 3 4 5 6 7 8 9 10 11 12
| docker-compose up docker-compose -f 指定文件 up docker-compose up -d
docker-compose stop docker-compose down docker-compose start docker-compose ps docker-compose images
docker-compose exec yml文件中写的service /bin/bash
|
2.3 docker-compose案例
案例一
1 2 3 4 5 6 7 8 9
| services: db: image: mysql:5.7 volumes: - "db-data:/var/lib/mysql" networks: - my-bridge
|
三 Docker Compose 部署应用,水平扩展
3.1 使用Docker Compose部署一个wordpress
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| version: '3' services: wordpress: image: wordpress ports: - 8080:80 depends_on: - mysql environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_PASSWORD: root networks: - my-bridge
mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wordpress volumes: - mysql-data:/var/lib/mysql networks: - my-bridge
volumes: mysql-data:
networks: my-bridge: driver: bridge
|
3.2 Docker Compose 案例一 小型web服务项目搭建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| FROM python:3.6 COPY . /app WORKDIR /app RUN pip install flask redis EXPOSE 5000 CMD [ "python", "app.py" ]
version: "3"
services:
redis: image: redis
web: build: context: . dockerfile: Dockerfile ports: - 8080:5000 environment: REDIS_HOST: redis from flask import Flask from redis import Redis import os import socket
app = Flask(__name__) redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/') def hello(): redis.incr('hits') return '你好! 查看 %s 次, hostname 是 %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True)
docker-compose up
|
3.3 docker-compose水平扩展
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| docker-compose up --help
docker-compose up --scale web=3
docker-compose up --scale web=3 docker-compose start docker-compose ps
version: "3"
services:
redis: image: redis
web: build: context: . dockerfile: Dockerfile environment: REDIS_HOST: redis
lb: image: dockercloud/haproxy links: - web ports: - 8080:80 volumes: - /var/run/docker.sock:/var/run/docker.sock
docker-compose up
docker-compose up --scale web=3 -d
docker-compose up --scale web=1 -d
|
3.4 docker-compose部署一个复杂的应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
services: voting-app: build: ./voting-app/. volumes: - ./voting-app:/app ports: - "5000:80" links: - redis networks: - front-tier - back-tier
result-app: build: ./result-app/. volumes: - ./result-app:/app ports: - "5001:80" links: - db networks: - front-tier - back-tier
worker: build: ./worker links: - db - redis networks: - back-tier
redis: image: redis ports: ["6379"] networks: - back-tier
db: image: postgres:9.4 volumes: - "db-data:/var/lib/postgresql/data" networks: - back-tier
volumes: db-data:
networks: front-tier: back-tier:
docker-compose up
docker-compose build
|
3.5 docker-compose单机环境ELK系统
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| version: '2.2' services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2 container_name: es01 environment: - node.name=es01 - cluster.name=es-docker-cluster - discovery.seed_hosts=es02,es03 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - data01:/usr/share/elasticsearch/data ports: - 9200:9200 networks: - elastic es02: image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2 container_name: es02 environment: - node.name=es02 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es03 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - data02:/usr/share/elasticsearch/data networks: - elastic es03: image: docker.elastic.co/elasticsearch/elasticsearch:7.5.2 container_name: es03 environment: - node.name=es03 - cluster.name=es-docker-cluster - discovery.seed_hosts=es01,es02 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - data03:/usr/share/elasticsearch/data networks: - elastic
volumes: data01: driver: local data02: driver: local data03: driver: local
networks: elastic: driver: bridge
|