服务的编排
Docker三剑客Docker Compose
、Docker Machine
、Docker Swarm
分别是Docker官方开源的三个项目。
- Docker Compose负责实现对 Docker 容器集群的快速编排(适合单主机环境)。
- Docker Machine负责在多种平台上快速安装 Docker 环境,是一种CLI工具。
- Docker Swarm提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案
Docker Compose
安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose #添加可执行权限
docker-compose --version #查看版本
入门例子
创建docker-compose.yml文件
version: "3.8"
services:
web1:
build: .
ports:
- "5000:5000"
environment:
active:""
volumes:
- "./config:/config"
web2:
build:
context: .
dockerfile: Dockerfile
ports:
- "5001:5001"
volumes:
- "./config:/config"
redis:
image: "redis:alpine"
变量设置
通过environment属性设置
web:
environment:
- DEBUG=1
类似通过docker run -e DEBUG=1 ... 或者 docker-compose run -e DEBUG=1 ...
通过env_file指定文件传递
web:
env_file:
- web-variables.env
变量文件格式:key=value,例如:DEBUG=1;
类似docker run --env-file=web-variables.env
通过默认文件.env,设置变量
$ cat .env
TAG=v1.5
$ cat docker-compose.yml
version: '3'
services:
web:
image: "webapp:${TAG}"
通过shell环境变量
$ export TAG=v2.0
$ cat docker-compose.yml
version: '3'
services:
web:
image: "webapp:${TAG}" # 该行解析结果 image: "webapp:v2.0"
- 运行时传递变量给dockerfile ENV 变量
- dockerfile里面也有ARG, 与ENV区别在于ARG是在编译镜像阶段传递的,ENV可以在编译阶段生成默认值,运行容器时传递变量覆盖,ARG是唯一一个可以放在FROM 前面的指令
- docker-compose 环境变量采用${TAG}取值,无法取得当前文件设置的值
- 同一个变量优先级从高到低如下:
compose 文件指定environment最高 > shell 环境变量 > env_file文件 > dockerfile
网络设置
网络设置只支持version 2以上(含),假设目录名是myapp,执行docker-compse up,默认网络myapp_default 会被创建,docker-compose.yml 里面的容器会使用该网络
加入已存在的网络
docker network creat my-pre-existing-network
version: 3.8
....
networks:
default:
external:
name: my-pre-existing-network
配置默认网络
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
networks:
default:
# Use a custom driver
driver: custom-driver-1
自定义网络
<details>
<summary>示例</summary>
version: "3"
services:
proxy:
build: ./proxy
networks:
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
# Use a custom driver
driver: custom-driver-1
backend:
# Use a custom driver which takes special options
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"
</details>
服务扩展(两种方式)
使用多个docker-compose.yml 文件
docker-compose.yml
version: "3.8"
services:
web:
image: example/my_web_app:latest
docker-compose.prod.yml
version: "3.8"
services:
web:
ports:
- 80:80
environment:
PRODUCTION: 'true'
部署
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
采用多个docker-compose文件部署服务,会合并多个文件的内容(并集),如果遇到有冲突的参数(一个属性在多个文件里面定义,以最后一个指定的文件为准)
使用extends, version 3(已经去除)
具体参见官网: https://docs.docker.com/compose/extends/
Docker Swarm
由于目前主流采用k8s,暂不往下写,可以看后面写的K8S
网友评论