Docker Compose
简介
用来高效地管理容器,定义运行多个容器
三个步骤
- Define your app’s environment with a
Dockerfile
so it can be reproduced anywhere.
- 保证项目在任何地方都可以运行
- Define the services that make up your app in
docker-compose.yml
so they can be run together in an isolated environment.
- 定义服务service
- 编写yml
- Run
docker compose up
and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.
- 启动项目
作用:批量容器编排
注: Compose是官方的开源项目,需要安装
示例
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
一些重要的概念
- 服务service。即容器、应用(web、redis、mysql)
- 项目project。一组关联的容器(博客:web、mysql)
Compose安装
- 下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 推荐下面的国内镜像
curl -L https://get.daocloud.io/docker/compose/releases/download/1.28.6/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 授权
sudo chmod +x /usr/local/bin/docker-compose
- 测试是否安装成功
[root@VM-12-16-centos bin]# docker-compose version
docker-compose version 1.28.6, build 5db8d86f
docker-py version: 4.4.4
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
体验:getting start
地址:https://docs.docker.com/compose/gettingstarted/
Python应用:计数器,用来记录该web应用被访问的次数
- 准备工作
yum install python-pip #pip是Python包管理工具
yum -y install epel-release #报错的话执行
- 为项目创建目录
mkdir composetest
cd composetest
- 创建应用:app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
在本例中,redis是应用程序网络上redis容器的主机名,我们使用redis的默认端口6379
- 创建一个名为requirements.txt的文件
flask
redis
- 创建Dockerfile 应用打包为镜像
FROM python:3.7-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirement.txt
CMD ["python", "app.py"]
# 从3.7镜像开始构建镜像
# 将当前目录添加.到/code镜像中的路径中
# 将工作目录设置为/code
# 安装Python依赖项
# 将容器的默认命令设置为Python app.py
# 也可以用官方文档上的,因为狂神没启起来,所以这里换了
- 创建Docker-compose.yaml文件(定义整个服务,需要的环境:web、redis)完整的上线流程
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
- 启动compose项目(docker-compose up)
Starting composetest_redis_1 ... done
Starting composetest_web_1 ... done
流程
- 创建网络
- 执行Docker-compose.yaml
- 启动服务
默认的服务名:文件名_服务名_num,因为是集群,有多个服务器,故num为副本数量
网络规则
10个服务的项目,内容都在同一个网络下面,域名访问
如果在同一个网络下,我们可以直接通过域名访问,高可用(HA)
停止:ctrl+c
以前都是单个docker run启动容器
docker-compose,通过docker-compose编写yaml配置文件,可以通过compose一键启动所有服务,停止
Docker小结
- Docker镜像=>容器
- Dockerfile构建镜像(服务打包)
- docker-compose启动服务(编排、多个微服务环境)
- Docker网络
yaml规则
docker-compose.yaml核心
官方文档
# 3层
version: '' # 版本
service: # 服务
服务1: web
# 服务配置 docker
images
build
network
...
服务2: redis
...
服务3: redis
# 其他配置 网络/卷、全局规则
volumes:
networks:
configs:
开源项目:博客
- 下载项目(docker-compose.yaml)
- 如果需要文件,Dockerfile
- 文件准备齐全(一键启动项目)
前台启动: docker -d
后台启动: docker-compose up -d
Docker Swarm
工作模式
帮助文档:
Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
初始化节点:docker swarm init
docker swarm join加入一个节点
# 获取令牌
docker swarm join-token manager
docker swarm join-token worker
将节点加入
- 生成主节点
- 加入manager、worker
Raft协议
双主双从:假设一个节点挂了,其他节点呢
Raft协议:保证大多数节点存活才可以用,集群至少大于3台
实验
- 将docker1停止,宕机,双主另一个节点也不能使用了
leader节点宕机再次启动可以发现该节点变为manager节点,原来的manager节点有一个会荣升为leader
2. 可以将其他worker节点离开
- worker就是工作的,管理节点才能操作
结论:至少要有3个主节点,大于1台的管理者可用
swarm集群弹性创建服务
创建服务、动态扩展服务、动态更新服务
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service
灰度发布、金丝雀发布
docker run 容器启动,不具有扩缩容器功能
docker service 服务,可以扩缩容器,滚动更新
查看服务器:
动态扩缩容:(两种方式)
docker service update --replicas 3 my-nginx
docker service scale my-nginx=5
这些服务会被随机分到不同的服务器上
集群中没有运行容器的机器,也能访问部署的服务,服务可以有多个副本动态扩缩容实现高可用
移除服务:
docker service rm my-nginx
概念总结
- swarm: 集群的管理和编排。docker可以初始化一个swarm集群,其他节点可以加入
- node:就是一个docker节点,多个节点就组成了一个网络集群
- service:任务,可以在管理节点或者工作节点来运行,核心,用户访问
- task:容器内的命令,细节任务
**逻辑是不变的 **
命令->管理->api->调度->工作节点(创建Task容器维护创建)
服务副本与全局服务
调整service以什么方式运行
拓展:网络模式:
“PublishMode”: “ingress”
swarm:
Overlay:
ingress:特殊的overlay网络