基于docker容器开发服务时,从代码到部署容器需要经过两个步骤:
- 打包镜像docker build
- 部署启动容器docker run
在实际开发中,一个服务往往需要和很多个其它的服务进行关联,单个服务也有可能有多个容器实例,打包部署非常繁琐,容易出错。而使用docker-compose就可以轻松实现对容器集群的编排工作。简单来说,docker-compose是一个用于定义和运行多个容器的工具,类似k8s。
对于 docker-compose 有两个基本的概念:
- 工程,docker-compose运行的目录即为一个工程,在微服务场景下,我们往往都是使用git submodule的方式组建工程的,因此父项目就可以成为一个docker-compose的工程
- 服务,对应子项目,一个工程可以包含多个子项目
- 容器,对应服务的实例,一个服务可以有多个实例
docker-compose当然也存在不足的地方,就是它只能用在单一host上进行容器编排,无法跨节点host对容器进行编排,那是Docker Swarm和K8s的范畴了,后续再讨论。
curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
pip3 install docker-compose
docker-compose --version
- 不支持制表符tab键缩进。需要使用空格缩进
- 通常开头缩进2个空格
- 字符后缩进一个空格,如冒号,逗号
- 用井号注释
- 如果包含特殊字符用单引号引起来
- 布尔值(ture、false、yes、no、on、off)必须用引号括起来,这样分析器会将它们解释为字符串
docker-compose
命令格式docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
命令选项如下:
-f,–file FILE指定Compose模板文件,默认为docker-compose.yml,可以多次指定。
-p,–project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。
-x-network-driver 使用Docker的可拔插网络后端特性(需要Docker 1.9+版本)
-x-network-driver DRIVER指定网络后端的驱动,默认为bridge(需要Docker 1.9+版本)
-verbose输出更多调试信息
-v,–version打印版本并退出
docker-compose up
命令格式docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
选项包括:
-d 在后台运行服务容器
–no-color 不使用颜色来区分不同的服务的控制输出
–no-deps 不启动服务所链接的容器
–force-recreate 强制重新创建容器,不能与–no-recreate同时使用
–no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–build 在启动容器前构建服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器
–scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数
docker-compose -f docker-compose.yml up -d
version: '3.5'
services:
headscale:
image: headscale/headscale:latest-alpine
container_name: headscale
volumes:
- ./config:/etc/headscale
- ./data/data:/var/lib/headscale
ports:
- 7080:7080
command: headscale serve
restart: unless-stopped