Docker实战指南 0x06 Docker Compose
https://docs.docker.com/compose/
Dockerfile。商城。拆分很多微服务。10微服务
购物车微服务+Redis+MySQL = 一套服务(自动化的全套部署,全套下线)。交给Docker Compose【编排】。一个整套的application会有非常多的service
一次性的将所有相关联的服务自动部署。
前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。批量的维护整套应用
使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
Compose的三步最佳实战:
- 定义自己应用的
Dockerfile
文件。为了在anywhere进行构建。 - 使用
docker-compose.yml
定义我们服务。这一整套服务可以一起在一个隔离环境运行. - 运行
docker-compose up
就可以启动整个app.
总结:批量服务编排。docker-compose.yml
声明服务的规则。
单机环境。
1、安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
2、体验
1、创建一个测试应用
#1、Create a directory for the project:
mkdir composetest
cd composetest
#2、Create a file called app.py in your project directory and paste this in:
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
#3、Create another file called requirements.txt in your project directory and paste this in:
flask
redis
2、创建Dockerfile
#In your project directory, create a file named Dockerfile and paste the following:
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
3、在Compose file里定义服务
#Create a file called docker-compose.yml in your project directory and paste the following:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
4、Compose构建和运行应用
docker-compose up -d
#访问 http://localhost:5000/ 测试效果
5、效果
自己打包---》dockerfile--》结合docker-compose
1、创建网络
默认的网络:1998ee0450ee composetest_default bridge local
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
#默认两个服务都用一个网络,是contextName_default;web里面可以使用redis的hostname访问
#cache = redis.Redis(host='redis', port=6379)
#默认每一个启动的容器 contextName_serviceName_1
docker network inspect composetest_default
#效果:这个网络里面有。两个容器
#docker service ls #查看当前的服务。docker集群下,我们能看到所有的服务 容器的名_num。代表第几个副本。
集群状态下;compose更帅。我们可以直接定义服务在多个机器都有副本。
2、构建每个镜像
3、创建两个容器在同一网络,我们可以使用hostname访问
docker-compose帮我们自定的部署了pyweb,redis,并且pyweb能访问redis。pyweb的5000浏览器也能访问

整个docker:
1、dockerfile
2、docker-compose
3、docker二次开发,如何更换底层存储驱动,如何自定义docker的网络。。。
详情:https://docs.docker.com/compose/compose-file/#reference-and-guidelines
#语法
三层
version: ""
services: #定义很多服务
服务1:
#当前服务配置
服务2:
#当前服务配置
#服务要用的网络、卷,等其他全局规则,定义
volumes:
networks:
configs:
secrets:
networks:
outside:
external: true #外面创建好了,docker-compose不自动创建
如果自定义用了网络。卷等,都必须声明
version: "3"
services:
java-app:
build: .
ports:
- "9000:8080"
depends_on:
- mysql
command: java -jar /app.jar --spring.datasource.url=jdbc:mysql://mysql:3306/wps?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
networks:
- app-network
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 123456
networks:
- app-network
networks:
app-network: {}
docker-compose up -d
docker-compose up -d --build #再触发一下手动构建
随便网上一个项目。dockerfile+docker-compose 一键搞定
mysql dockerfile-->run 网上的项目拉下来,把的sql文件导入数据。
docker-compose替代了dockerfile。完全可以(镜像存在)自定义的镜像 dockerfile+docker-compose。
整个docker-compose up/down/rm 单机情况下的编排
app-redis。用同一个网络。
集群情况。官方默认docker-swarm
docker 5个。 2主(HA) 3从(工作节点)
5、概念
工程、服务、容器
- Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)
- Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例