当前位置: 代码迷 >> 综合 >> - Docker Compose
  详细解决方案

- Docker Compose

热度:26   发布时间:2023-11-18 11:55:24.0

>> Compose 概念

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

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

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

Compose有两个重要概念:

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

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

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


>> Compose 命令对象与格式

https://www.funtl.com/zh/docker-compose/Docker-Compose-命令说明.html#命令对象与格式

常用命令:

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


>> YAML 配置文件语言

https://www.funtl.com/zh/docker-compose/YAML-配置文件语言.html#本节视频

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: alwaysimage: tomcatcontainer_name: webports:- 8080:8080volumes:- /usr/local/docker/myforum/ROOT:/usr/local/tomcat/webapps/ROOTmysql:restart: alwaysimage: mysql:5.7.26container_name: mysqlports:- 3306:3306environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123456command:--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

文章参考博客视频教程