背景
很多应用是很复杂的,需要多个容器共同支持,任何复杂的系统可能需要启动的容器数量也很庞大,我们需要从Dockerfile build image或者docker hub拉取多个image,要创建并管理多个container,这个工作量是巨大的,docker compose应运而生。
Docker Compose是什么
Docker Compose帮我们启动错综复杂的容器,开发测试人员只要提供一份docker-compose.yml文件即可,如图:
- Docker Compose是一个基于docker的命令行工具
- 可以通过一个yml文件定义多容器的docker应用
- 通过一条命令
docker-compose up
就可以根据yml文件的定义去创建管理多个容器
例如我们运行一个WordPress,需要运行两个容器,一个运行WordPress,一个运行mysql服务,我们可以如下编写docker-compose.yml:
version:3.4
services:
wordpress:
image:wordpress
ports:
--8080:80
environment:
WORDPRESS_DB_HOST:mysql
WORDPRESS_DB_PASSWORD:root
networks:
-mybridge
mysql:
image:mysql
environment:
MYSQL_ROOT_PASSWORD:root
MYSQL_DATABASE:wordpress
volumes:
-mysql-data:/var/lib/mysql
networks:
-mybridge
volumes:
mysql-data:
networks
mybridge:
driver:bridge
通过运行docker-compose up
命令启动yml文件,就可以启动两个service(container)组成一个WordPress服务。
docker-compose.yml有三个核心概念:
- services
- 一个service代表一个containe
- service的启动类似docker run,可以指定network和volume
- volumes
- 定义容器使用的存储
- networks
- 定义容器使用的网络
docker-compose up
和docker run
之间的关系,对于一个简单的docker-compose.yml:
services
db:
image:mysql
volumes:
- "db-data:/var/lib/mysql/data"
networks:
- mynet
运行上述docker-compose.yml就相当于运行:
docker run -d --network mynet -v db-data:/var/lib/mysql/data mysql
Docker Compose安装
(1)下载
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
(2)赋予可执行权限
sudo chmod +x /usr/local/bin/docker-compose
(3)测试安装结果
docker-compose --version
Docker Compose相关命令
docker-compose up
(docker-compose up -d) # 后台运行
docker-compose stop # 停止
docker-compose start # 启动
docker-compose ps # 列出compose容器
docker-compose exec xxx bash # 进入compose容器内
docker-compose方便快速拓展,例如将某个服务中的web服务水平拓展成三个,可以通过如下命令:
docker-compose up --scale web=3 -d
容器编排-Docker Swarm简介
以上所说的docker compose是建立在一个物理机器上的容器启动,如果多个物理机运行多个容器的时候docker-compose就显得有些捉襟见肘,这时候docker官方提供了Swarm来帮助我们管理多个容器,Docker Swarm是我们可以通过一个命令行管理多个物理机上的docker容器,如图:
Docker Swarm可以帮助我们:
- 管理多个物理机的多个docker容器
- 方便容器的横向拓展
- 自动回复down掉的容器
- 在不影响业务的情况下更新容器
- 监控追踪多个容器
- 保护隐私数据
- 等……
根据多个物理机我们可以搭建一个swarm集群,通过swarm运行service相当于运行一个容器(和docker compose类似),会随机在swarm节点上创建,对应命令为:
docker service create --name myswarm xxx/xxx
在容器编排技术中,Swarm,Kubernetes,Mesos各有所长,Swarm是docker原生的api,上手快速使用简单。但是在功能和社区活跃度上比不上Kubernetes,Mesos,docker+kubernetes是目前大部分公司运维团队容器编排使用的技术,后续会学习kubernetes。