1.Docker Compose概述
1.1 Docker Compose 定义
Docker Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
1.2 Docker Compose产生背景
我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。.Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器,Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
1.3 Docker Compose 核心概念
Docker Compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner),如下图所示:
1.4 Docker Compose 使用步骤
Compose 使用的三个步骤:
1.编写Dockerfile定义各个微服务应用并构建出对应的镜像文件dockerfile的使用,使用dockerfile部署springboot项目。
2.使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
3.最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线。
1.5 Docker Compose 常用命令
docker --version #查看版本 docker-compose -h # 查看帮助 docker-compose up # 启动所有docker-compose服务 docker-compose up -d # 启动所有docker-compose服务并后台运行 docker-compose down # 停止并删除容器、网络、卷、镜像。 docker-compose exec yml里面的服务id # 进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash docker-compose ps # 展示当前docker-compose编排过的运行的所有容器 docker-compose top # 展示当前docker-compose编排过的容器进程 docker-compose logs yml里面的服务id # 查看容器输出日志 docker-compose config # 检查配置 docker-compose config -q # 检查配置,有问题才有输出 docker-compose restart # 重启服务 docker-compose start # 启动服务 docker-compose stop # 停止服务
2. Docker Compose 实战
2.1 Docker Compose下载和卸载
# 下载 curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 开启可执行权限 chmod +x /usr/local/bin/docker-compose # 查看版本 docker-compose --version #docker-compose version 1.29.2, build 5becea4c # 如果使用curl方式安装的,这样卸载即可 rm /usr/local/bin/docker-compose
2.2 Docker Compose 项目概述
这里模拟通过浏览器访问网关,然后网关将请求转发到订单微服务,通过查询订单返回订单信息,在其中过程中订单中有用户信息,需要根据订单中的用户id调用用户微服务进行查询然后进行赋值然后返回订单信息。这里的注册中心采用nacos。其中的每个微服务暂未搭建集群,这里网关端口号为7000,订单微服务端口号为8080,用户模块微服务端口号为9201,本地运行结果如下图:
2.3 Docker Compose 编排字段部分详解
2.3.1 version
version
字段指定了 Docker Compose 编排文件的版本,例如:
version: '3'
2.3.2 services
services
字段指定了在 Docker Compose 编排中要运行的服务。每个服务都有一个名称,并指定要使用的镜像和容器的配置选项。例如:
services: mysql: #服务名 image: mysql:5.5 #mysql镜像
2.3.3 build 和 image
build
字段允许在 Docker Compose 编排中指定 Dockerfile 的位置,从而可以使用 Docker Compose 构建镜像。image
字段指定要使用的 Docker 镜像。例如:
services: mysql: #服务名 image: mysql:5.5 #mysql镜像 user: #服务名 build: ./user #这里为用户微服务文件夹,里面存放的是该服务代码jar包和Dockerfile文件
2.3.4 volumes 和 environment
volumes
字段指定了要使用的数据卷。environment
字段指定了要设置的环境变量。例如:
services: mysql: #服务名 image: mysql:5.5 #mysql镜像 environment: MYSQL_ROOT_PASSWORD: 000000 #设置数据库密码 volumes: - "$PWD/mysql/data:/var/lib/mysql" #数据卷挂载
2.3.5 ports 和 expose
ports 字段指定了要宿主机映射到容器的端口(宿主机端口:容器端口)。expose 字段是用于在 Docker 容器内部暴露端口的选项,可以让其他容器连接到这些端口,但不会将它们映射到 Docker 主机上。expose 与 ports 不同的是,expose 字段仅仅是将容器内部的端口暴露给其他容器使用,而不是直接映射到宿主机上的端口
例如:
services: gateway: #服务名 build: ./gateway #这里为网关文件夹,里面存放的是该服务代码jar包和Dockerfile文件 ports: -"7000:7000" nginx: image: nginx expose: -"8080"
当然命令还有很多,这里进行部署实战的时候只用到上述这些编排字段,所以这里重点写了这些,其余的进行省略。
2.4 Docker Compose 部署实战
按照三步走策略第一步编写Dockerfile定义各个微服务应用并构建出对应的镜像文件dockerfile的使用,使用dockerfile部署springboot项目。
这里进行举例,把每个微服务的项目进行打包成jar文件,这里命名为a.jar。然后构建Dockerfile文件并且和每个微服务的jar包都单独放在同一个文件夹下。Dockerfile文件内容如下:
From java:8-alpine COPY ./a.jar /tmp/app.jar EXPOSE 8080 ENTRYPOINT java -jar /tmp/app.jar
使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。docker-compose.yml文件内容如下:
version: "3.2" services: nacos: #服务名 image: nacos/nacos-server #nacos镜像 environment: MODE: standalone #单机模式 ports: - "8848:8848" #ports 字段指定了要宿主机映射到容器的端口(宿主机端口:容器端口) mysql: #服务名 image: mysql:5.5 #mysql镜像 environment: MYSQL_ROOT_PASSWORD: 000000 #设置数据库密码 volumes: - "$PWD/mysql/data:/var/lib/mysql" #数据卷挂载 user: #服务名 build: ./user #这里为用户微服务文件夹,里面存放的是该服务代码jar包和Dockerfile文件 order: #服务名 build: ./order #这里为订单微服务文件夹,里面存放的是该服务代码jar包和Dockerfile文件 gateway: #服务名 build: ./gateway #这里为网关文件夹,里面存放的是该服务代码jar包和Dockerfile文件 ports: - "7000:7000"
执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线,然后就可以在自己的服务器上进行远程访问了。