>> Compose 概念

Docker Compose是Docker官方编排的项目之一,负责快速部署分布式应用,实现对Docker容器集群的快速编排;简化对原生API的操作;

一个容器就一个应用,一个项目会用到多个应用,所以需要多个容器相互配合;例如:要实现一个web应用,除了web服务器容器本身,往往还需要后端数据库容器,负载均衡容器等;

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML格式),来定义一组相关联的应用容器为一个项目;

Compose有两个重要概念:

  • 服务(service):一个应用的容器,实际上可以包括若干个运行相同镜像的实例;
    tomcat容器启动之后,就可以称之为一个服务,服务就是应用程序,只不过是只在后台运行而已,
  • 项目(project):由一组关联的应用容器组成的一个完整的业务单元,在docker-compose.yml文件中定义;
    几个服务相互配合,组成一个完整的服务,就称为一个项目;

Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷的生命周期管理;

Compose 安装:docker安装后配置镜像加速后就直接安装


>> Compose 命令对象与格式

常用命令:

docker-compose up:前台运行;
docker-compose up -d:后台运行;
docker-compose start:启动
docker-compose stop:停止;
docker-compose down:停止并移除容器;


>> YAML 配置文件语言

YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便;

YAML 语言的设计目标,就是方便人类读写,它实质上是一种通用的数据串行化格式,它的基本语法规则如下:

  • 大小写敏感;
  • 使用缩进表示层级关系;
  • 缩进时不允许使用Tab键,只允许使用空格;
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;

# 表示注释,从这个字符一直到行尾,都会被解析器忽略;

YAML 支持的数据结构有三种:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值

>> Compose 基本使用 - 启动Tomcat容器

  • root@Ubuntu:/usr/local/docker/tomcat# vi docker-compose.yml:创建YMAL配置文件;
version: '3'                 // docker-compose这个语言的版本
services:                    // 一个服务,里面有多个容器,组成一个项目;
  tomcat:                    // 服务的名字随便起;
    restart: always          // 服务应该开机启动,所以这里应该加上一个开机启动的参数;
    image: tomcat            // 使用哪个镜像;
    container_name: tomcat   // 创建的容器的名字;
    ports:              
      - 8080:8080            // 映射的端口:宿主机端口:容器的端口

注意:YAML语言里面不能有tab制表符,只能用空格;

  • root@Ubuntu:/usr/local/docker/tomcat# docker-compose up [-d]:启动容器(守护态运行);
  • root@Ubuntu:/usr/local/docker/tomcat# docker-compose down:删除容器;
  • root@Ubuntu:/usr/local/docker/tomcat# docker-compose logs [-f] tomcat:查看日志

注意:docker-compose的命令必须在包含docker-compose.yml的目录下执行;


>> Compose 部署项目

1、在/usr/local/docker路径下创建myforum目录,myforum目录里面创建docker-composr.yml文件、项目war包文件、ROOT目录;

2、将war包文件解压缩放到ROOT下,然后修改db.properties里面的数据库地址;

3、docker-compose.yml

version: '3'
services:
  web:
    restart: always
    image: tomcat
    container_name: web
    ports:
      - 8080:8080
    volumes:
      - /usr/local/docker/myforum/ROOT:/usr/local/tomcat/webapps/ROOT

  mysql:
    restart: always
    image: mysql:5.7.26
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
    volumes:
      - mysql-data:/var/lib/mysql    // mysql-data :为宿主机的路径起的一个名字,然后在下面指定;

volumes:    // 指定名称为mysql-data的宿主机路径,若不指定,则使用docker的默认路径;
  mysql-data:

4、docker-compose up启动容器;
这时候浏览器访问项目会报错,是因为MySQL数据库还没有导入;
MySQL的数据库数据是以数据卷的形式挂载的,在创建文件.yml中最后两行处,没有为mysql-data名称指定路径,则使用docker默认放数据的地方:/var/lib/docker/volumes

由docker-compose统一管理的数据卷会放到docker默认放数据的地方,就是docker的安装目录:/var/lib/docker/volumes/

root@Ubuntu:/var/lib/docker/volumes/myforum_mysql-data# docker volume ls:查看查看docker挂载的数据卷;

5、远程连接MySQL,导入数据库;

6、docker-compose down:停止容器;
docker-compose up -d:开启容器;

7、浏览器访问:192.168.141.176:8080