docker7-Docker-Compose
Docker Compose
思考
前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run -d –name -p等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知
使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
简介
Docker Compose
是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用
描述
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack
中的 Heat
十分类似。
其代码目前在 https://github.com/docker/compose 上开源
Compose
定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig
通过第一部分中的介绍,我们知道使用一个 Dockerfile
模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等
Compose
恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
Compose
中有两个重要的概念
服务 (
service
):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例项目 (
project
):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml
文件中定义
Compose
的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理
Compose
项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose
来进行编排管理
Docker Compose安装与卸载
Compose 支持 Linux、macOS、Windows 10 三大平台
Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行
Docker for Mac、Docker for Windows自带 docker-compose
二进制文件,安装 Docker 之后可以直接使用
官方安装
1 | #1 github官方网站 搜索Docker compose |
或通过 curl的方式下载。https://docs.docker.com/compose/install/
1 | #3 运行以下命令以下载Docker Compose的当前稳定版本: |
1 | # 4将可执行权限应用于二进制文件: |
1 | #5测试是否安装 |
卸载
1 | #如果是 二进制包方式安装的,删除二进制文件即可 |
1 | #如果是通过 pip 安装的,则执行如下命令即可删除。 |
Docker Compose使用
术语
首先介绍几个术语
- 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例
- 项目 (project):由一组关联的应用容器组成的一个完整业务单元
可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理
Docker-compose创建容器
通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
yml格式描述
1 | 1 、yml文件以缩进代表层级关系 |
1 | #一、 k: (空格)v:表示一对键值对(空格不能省略),以空格控制层级关系,只要是左对齐的数据,都是同一级别; |
示例 1
用compose的方式管理一个Tomcat容器和MySQL
1 | # 1 管理文件夹,创建相应的目录 |
1 | #2 在如上目录中 编写创建 docker-compose.yml配置文件 |
1 | version: '3.1' |
小提示:docker stop $(docker ps -qa) 用于停掉所有的docker容器
1 | # 3启动(执行命令创建容器)(在) |
连接访问测试Tomcat
连接访问测试MySQL
1 | # 1 Bash进入mysql容器 |
1 | # 1 基于docker-compose.yml启动管理容器 |
1 | # 2 关闭或删除容器 |
1 | # 3 开启容器 |
1 | # 4 查看由docker-compose管理的容器 |
1 | # 5 查看日志 |
Docker-compose 常用命令
build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除停止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 停止服务
up 创建并启动容器
down
常用命令示例
docker-compose up -d nginx 构建启动nignx容器
docker-compose exec nginx bash 登录到nginx容器中
docker-compose down 删除所有nginx容器,镜像
docker-compose ps 显示所有容器
docker-compose restart nginx 重新启动nginx容器
docker-compose run –no-deps –rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose build nginx 构建镜像
docker-compose build –no-cache nginx 不带缓存的构建
docker-compose logs nginx 查看nginx的日志
docker-compose logs -f nginx 查看nginx的实时日志
docker-compose config -q 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
docker-compose events –json nginx 以json的形式输出nginx的docker日志
docker-compose pause nginx 暂停nignx容器
docker-compose unpause nginx 恢复ningx容器
docker-compose rm nginx 删除容器(删除前必须关闭容器)
docker-compose stop nginx 停止nignx容器
docker-compose start nginx 启动nignx容器
Docker仓库
1. 国内 Docker 仓库
阿里云
网易云
时速云
DaoCloud
2. 国外 Docker 仓库
Docker Hub
Quay
Tomcat搭建集群
1 | 1 、创建指定管理目录 |
1 | 2 、编写docker-compose.yml |
1 | version: '3.1' |
1 | 3 、测试 在每一个tomcat下创建ROOT/index.html。用于访问即可。 |
Redis集群搭建
redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6 个redis节点,这里用一台机器(可以多台机器部署,修改一下ip地址就可以了)部署 6 个redis实例,三主三从,搭建集群的步骤如下:
主 | 服务名称 | 端口号 | 从 | 服务名称 | 端口号 |
---|---|---|---|---|---|
master1 | 127.0.0.1 | 6381 | slave1 | 127.0.0.1 | 6384 |
master1 | 127.0.0.1 | 6382 | 127.0.0.1 | 6385 | |
master1 | 127.0.0.1 | 6383 | 127.0.0.1 | 6386 |
1 、创建Redis节点安装目录
1 | mkdir docker-redis-cluster |
2 、依次创建文件夹。并依次修改配置文件
1 | 创建文件夹 6381- |
1 | 复制redis.conf到此目录下 |
1 | # 关闭保护模式 用于公网访问 |
3 、依次创建文件夹。并依次修改配置文件
按如上方式。修改 6 份。分别为 6381-6386
4 、编写docker-compose文件内容
1 | version: '3' |
5 、启动并测试
1 | 在/opt/docker-redis-cluster目录下 启动: |
6 、创建集群
Redis 5版本后 通过redis-cli 客户端命令来创建集群
创建集群的命令
–cluster create
–cluster-replicas 1
1 | docker exec -it redis-6381 redis-cli --cluster create -a xuxiaomo 127.0.0.1:6381 127.0.0.1: |
7 、Redis Cluster集群验证
在某台机器上(或)连接集群的 6381 端口的节点
1 | 普通Redis方式: |
1 | Docker方式: |
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这
样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据
基本命令
info replication通过Cluster Nodes命令和Cluster Info命令来看看集群效果
输入命令 cluster nodes
每个Redis的节点都有一个ID值,此ID将被此特定redis实例永久使用,以便实例在集群上下文中具有唯一的名称。每个节点都会记住使用此ID的每个其他节点,而不是通过IP或端口。IP地址和端口可能会发生变化,但唯一的节点标识符在节点的整个生命周期内都不会改变。我们简单地称这个标识符为节点ID