一、简介
1、简述
①Docker Compose是一个能一次性定义和管理多个Docker容器的工具
②Compose中定义和启动的每一个容器都相当于一个服务(service)
③Compose中能定义和启动多个服务,且它们之间通常具有协同关系
④使用YAML文件来配置我们应用程序的服务
⑤使用单个命令(docker-compose up),就可以创建并启动配置文件中配置的所有服务
2、Docker Compose工作原理
![]()
3、Docker Compose安装
①Docker for Mac与Docker for Windows自带docker-compose
②Linux下需要单独安装
⑤授权:sudo chmod +x /usr/local/bin/docker-compose
⑥查看版本:docker-compose --version
4、Docker Compose CLI
①查看帮助:docker-compose --help
②对比后会发现Docker Compose CLI的很多命令的功能和Docker Client CLI是相似的,最主要的区别就是前者能一次性运行管理多个容器,后者只能一次管理一个
二、了解Docker Compose File
1、Docker Compose File版本
①Docker Compose File有多个版本,基本是向后兼容的,但也有极个别配置项高版本中没有
②在docker-compose.yml一开始就需要利用version关键词标明当前file使用的版本
![]()
2、Docker Compose File TOP配置参数
①version:指定Docker Compose File版本号,有1,2,3版本,目前都用"3"
②services:定义多个服务并配置启动参数,一个service代表一个container,这个container可以从dockerhub的image来创建,或者从本地dockerfilebuild的image来创建,service的启动类似docker run,可以指定network和volume,可以给所有servier指定network和volume
③volumes:声明或创建在多个服务中共同使用的数据卷对象
④networks:定义在多个服务中共同使用的网络对象
⑤configs:声明将在本服务中要使用的一些配置文件
⑥secrets:声明将在本服务中要使用的一些秘钥、密码文件
⑦x-***:自定义配置,主要用于复用相同的配置
3、docker-compose命令
①docker-compose up:会自动搜索当前路径下的docker-compose.yml文件启动
②docker-compose -f 指定文件 up:指定docker-compose.yml文件启动
③docker-compose up -d:后台执行,一般看日志输出,不用这个
④docker-compose stop:停止,不会删除容器和镜像
⑤docker-compose down:停止,并删除关联的容器
⑥docker-compose start:启动yml文件管理的容器
⑦docker-compose ps:查看正在运行的容器
⑧docker-compose images:查看docker-compose管理的容器
⑨docker-compose exec yml文件中写的service /bin/bash:进入到容器内
4、docker-compose示例
services:
db:
image: mysql:5.7
volumes:
- "db-data:/var/lib/mysql"
networks:
- my-bridge
# 等同于:docker run -d --network my-bridge -v db-data"/var/lib/mysql mysql:5.7
三、Docker Compose部署应用
1、使用Docker Compose部署一个wordpress
①编写docker-compose.yml文件
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
②启动:docker-compose up
2、使用Docker Compose搭建flask小型web服务项目
①编写dDockerfile文件
FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
②编写docker-compose.yml文件
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:5000
environment:
REDIS_HOST: redis
③编写app.py
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、水平拓展
①把flask_redis项目扩展成三个
②查看帮助:docker-compose up --help
③scale SERVICE=NUM设置成三个:docker-compose up --scale web=3 => 直接执行会有问题,因为8080端口已经被映射了
④删除原来的docker-compose.yml中的ports
⑤app.py改成监听的端口为80
⑥Dockerfile不需要改
⑦增加一个负载均衡器HAProxy(类似于Nginx的作用)
⑧修改docker-compose.yml文件
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
⑨把web扩展为3个启动:docker-compose up --scale web=3 -d
⑩把web减少到1个启动:docker-compose up --scale web=1 -d