第三口docker的感觉——docker compose

我们为什么需要docker compose呢?

现在大行其道的微服务架构,是由多个service组成的,在web应用中数据库也是必不可少的,那么这些组件就成了我一个项目的标配,那么我们如果把这一组映射到docker世界里去呢?docker-compose就可以作为这一组的体现。总结起来docker compose可以给我们带来的好处是:

  1. 避免了我们手动创建多个 dockerfile,多个image,多个容器。减少了我们的工作量。
  2. 启动停止删除可以被一次处理。

什么是docker compose呢?

其实就是一个docker的批处理工具。通过yml文件定义多容器的docker应用。

通过一条命令可以通过yml定义创建启动管理同属于一个"group"的容器。

Docker-compose.yml:

  • Services
  • Networks
  • Volumes
Services:

一个Services就相当于一个container,这个container可以从docker hub获取或者是dockerfile进行构建

我们在service中可以指定networkvolume

我们之前是这样启动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

可以参考:https://github.com/docker/dockercloud-haproxy

英语不好的可以参考https://www.jianshu.com/p/4a2281bfb1cc