07-docker-compose容器编排
07-docker-compose容器编排
随着网站架构的升级,容器的使用越加的频繁,应用服务和容器之间的关系也越加的复杂
这就要就研发人员能够更好的方法去管理数量较多的容器服务,而不能手动去挨个管理
例如一个LNMP架构,就得部署web服务,后台程序,数据库,负载均衡等等都需要统一部署在容器里,那么这个时候就需要统一的容器编排工具docker-compose,通过单独的docker-compose.yaml模版文件作为一个项目定义一组相关联的应用容器
什么是docker-compose
docker-compose的定位就是运行多个docker容器应用
之前我们了解可以使用dockerfile模版文件定义一个单独的应用容器,然而,如LNMP这样的web项目,就涉及到服务之间的配合,如nginx,mysql,php,redis等
1.compose是用于定义和运行多个容器的docker内置工具
2.compose是定义yaml文件用来描述多个容器的关系
3.写好yaml后基于compose命令读取执行yaml内容
安装docker-compose
命令一般安装在/usr/loacl/bin/下面
1. yum安装,版本较低
yum install docker-compose2. 可以去官网找最新脚本
curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose添加执行权限
chmod +x /usr/local/bin/docker-compose测试版本
[root@docker-200 ~]#chmod +x /usr/local/bin/docker-compose
[root@docker-200 ~]#
[root@docker-200 ~]#docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
[root@docker-200 ~]#
docker-compose命令管理
# 默认使用docker-compose.yml构建镜像
$ docker-compose build
$ docker-compose build --no-cache # 不带缓存的构建# 指定不同yml文件模板用于构建镜像
$ docker-compose build -f docker-compose1.yml# 列出Compose文件构建的镜像
$ docker-compose images # 启动所有编排容器服务
$ docker-compose up -d# 查看正在运行中的容器
$ docker-compose ps # 查看所有编排容器,包括已停止的容器
$ docker-compose ps -a# 进入指定容器执行命令
$ docker-compose exec nginx bash
$ docker-compose exec web python manage.py migrate --noinput# 查看web容器的实时日志
$ docker-compose logs -f web# 停止所有up命令启动的容器
$ docker-compose down # 停止所有up命令启动的容器,并移除数据卷
$ docker-compose down -v# 重新启动停止服务的容器
$ docker-compose restart web# 暂停web容器
$ docker-compose pause web# 恢复web容器
$ docker-compose unpause web# 删除web容器,删除前必需停止stop web容器服务
$ docker-compose rm web # 查看各个服务容器内运行的进程
$ docker-compose top # 合集命令
build
config -q
create
down
events
exec
help
images
kill
logs
pause
restart
rm
run
scale
start
stop
top
unpause
up
docker-compose语法
参考yaml模版
version: '版本号'
services:服务名1:images: 镜像名container_name: 容器名environment:- var1=value1- var2=value2volumes:- 存储驱动1:容器内数据目录- 宿主机目录:容器内数据目录ports:- 宿主机端口:容器端口networks:- 自定义网络名networks:default:external: truename: 自定义网络名
1.案例1:部署python应用
编写一个python web容器
redis数据库
构建镜像
构建docker-compose.yaml
手工部署
1.创建compose目录,管理配置文件
[root@docker-200 ~]#cd /www.yuchaoit.cn/
[root@docker-200 /www.yuchaoit.cn]#
[root@docker-200 /www.yuchaoit.cn]#mkdir compose_python_web
[root@docker-200 /www.yuchaoit.cn]#cd compose_python_web/
[root@docker-200 /www.yuchaoit.cn/compose_python_web]#2.flask代码,读写redis
这段代码的逻辑是,访问一次,redis的计数器就+1,查看2个容器的链接关系from flask import Flask
from redis import Redisapp = Flask(__name__)
redis = Redis(host='redis', port=6379)@app.route('/')
def hello():count = redis.incr('hits')return 'Welcome to www.yuchaoit.cn about docker-compose , this page has been visited {} times\n'.format(count)if __name__ == "__main__":app.run(host="0.0.0.0", debug=True)依赖文件
cat > requirements.txt <<'EOF'
flask
redis
EOF[root@docker-200 /www.yuchaoit.cn/compose_python_web]#ll
total 8
-rw-r--r-- 1 root root 356 Aug 28 03:56 app.py
-rw-r--r-- 1 root root 12 Aug 28 03:58 requirements.txt
[root@docker-200 /www.yuchaoit.cn/compose_python_web]#查找python镜像版本
[root@docker-200 /www.yuchaoit.cn/compose_python_web]#curl -s https://registry.hub.docker.com/v1/repositories/python/tags |jq3.写Dockerfile
FROM python:3.9.7
MAINTAINER www.yuchaoit.cn
COPY app.py /opt
COPY requirements.txt /opt
WORKDIR /opt
RUN pip3 install --upgrade pip -i https://pypi.douban.com/simple
RUN pip3 install -r requirements.txt -i https://pypi.douban.com/simple4.构建镜像
[root@docker-200 /www.yuchaoit.cn/compose_python_web]#
[root@docker-200 /www.yuchaoit.cn/compose_python_web]#docker build --no-cache -t python3_flask .5.获取redis镜像,测试
docker pull redis6.运行redis,flask两个容器,测试运行结果[root@docker-200 /www.yuchaoit.cn/compose_python_web]#docker run -d -p 6379:6379 --name to_flask_redis redis
27b920026b88bbdf741023d5695dae35003b79f703b9b41feae7847ac811f9537.运行flask,需要关联redis容器才可以
注意这里一个细节,flask代码里,链接redis,填入的是主机名 "redis"
因此要通过主机名,让2个容器识别docker run -d -p 5000:5000 --link <容器name or id>:alias --name flask_with_redis python3_flask python3 app.pydocker run -d -p 5000:5000 --link to_flask_redis:redis --name flask_with_redis python3_flask python3 app.py[root@docker-200 /www.yuchaoit.cn/compose_python_web]#
[root@docker-200 /www.yuchaoit.cn/compose_python_web]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3631d00c841c python3_flask "python3 app.py" 2 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp flask_with_redis
27b920026b88 redis "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp to_flask_redis
[root@docker-200 /www.yuchaoit.cn/compose_python_web]#
这里的重点是–link参数
升级为docker-compose
yaml文件如下
[root@docker-200 /www.yuchaoit.cn/compose_python_web]#cat docker-compose.yml
flask_web:image: python3_flaskcommand: python app.pyports:- "5000:5000"links:- redis
redis:image: redis
小结
可见,为何容器化部署是天然敏捷的开发工具。