我们为什么需要docker compose呢?
现在大行其道的微服务架构,是由多个service组成的,在web应用中数据库也是必不可少的,那么这些组件就成了我一个项目的标配,那么我们如果把这一组映射到docker世界里去呢?docker-compose就可以作为这一组的体现。总结起来docker compose可以给我们带来的好处是:
- 避免了我们手动创建多个 dockerfile,多个image,多个容器。减少了我们的工作量。
- 启动停止删除可以被一次处理。
什么是docker compose呢?
其实就是一个docker的批处理工具。通过yml文件定义多容器的docker应用。
通过一条命令可以通过yml定义创建启动管理同属于一个"group"的容器。
Docker-compose.yml:
- Services
- Networks
- Volumes
Services:
一个Services就相当于一个container,这个container可以从docker hub获取或者是dockerfile进行构建
我们在service中可以指定network和volume。
我们之前是这样启动docker 容器的如下:
docker run --network my-network -v postgre-data:/var/lib/postgresql/data postgres:9.4
这里启动了一个postgresql的数据库,那如果在docker compose中我们应该如何做呢?
services:
postgre-db:
image: postgresql:9.4
volume:
- "postgre-data:/var/lib/postgresql/data"
network:
- my-network
我们很明显的可以看出来他们之间一个对应的关系。
service它的直接孩子指定的是容器的名称,然后他的孩子分别是image,volume,network这些。
⚠️ 这是从docker hub获取下来的image,如果是通过自己的dockerfile该如何写呢?
services:
my-docker:
build: ./my-docker
networks:
- my-network
那很多人会奇怪了,这个"postgre-data"和"my-network"是从哪里来的呢?别急,我们看一下完整的docker compose的yaml:
services:
postgre-db:
image: postgresql:9.4
volume:
- "postgre-data:/var/lib/postgresql/data"
network:
- my-network
volumes:
postgre-data
networks:
my-network:
driver: briage
这下子水落石出了,和services同级的地方,有定义volumes和networks。折合前面举例子的docker compose三要素正好对应上了。
更详细的docker-compose yaml文件的属性,可以参考https://docs.docker.com/compose/compose-file/
Docker compse 常用命令
Docker compose启动的命令为
docker-compose up
Docker compose 查看当前compose中运行的container
docker-compose ls
Docker compose 停掉所有运行的container
docker-compose stop
Docker compose 移除所有停止的container
docker-compse rm
Docker compose 停止并且移除servies,networks,volumes
docker-compose down
⚠️这个命令不会删除本地的images。
其他更多详细的内容命令,请查看https://docs.docker.com/compose/reference/
或者使用docker-compose - -help 查看。
Docker compose的拓展
我前面有提到过docker compose就是为了微服务的理念而生的,微服务只是从业务逻辑上的一种拆分。那如果负载在高的情况下,我们怎么才能抵抗住这种压力呢?那就得使用load balance(负载均衡)了。负载均衡在docker中也是有所体现的。
我们可以使用如下命令进行扩展:
#SERVICE 指的是你在docker compose中定义的名字,NUM指定的是你想要的数量
docker-compose up --scale SERVICE=NUM
这样就可以对自己的服务进行自由的伸缩。
⚠️前提是我们需要在我们的compose中安排一个loadbalance