>> 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
文章参考博客视频教程