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