docker-compose教程
1. docker-compose是什么?
1. 1 简介
compose、machine 和 swarm 是docker 原生提供的三大编排工具。
简称docker三剑客。Compose
项目是 Docker 官方的开源项目,定义和运行多个 Docker 容器
的应用(Defining and running multi-container Docker applications)。它允许用户通过一个单独的 docker-compose.yml
模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose
中有两个重要的概念:
【官方解释】:
-
服务 (service):
一个
应用的容器,实际上可以包括若干运行相同镜像的容器实例。 -
项目 (project):由
一组关联的
应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
【个人理解】:
-
服务是
一个应用程序的逻辑单元
,它可以由一个或多个
容器组成。每个服务都拥有自己的配置,包括镜像、端口映射、环境变量、卷和网络等。 -
项目是一个包含
多个服务
的集合。它定义了应用程序的整体架构,并提供了管理所有服务的工具。
【服务和项目的例子】
-
一个 Web 应用程序可以包含以下服务:
-
web:运行应用程序代码的服务。
-
db:运行数据库的服务。
-
cache:运行缓存服务的服务。
-
一个 Docker Compose 项目可以包含以下文件:
-
docker-compose.yml:定义所有服务的配置文件。
-
Dockerfile:构建服务镜像的配置文件。
Compose 的默认管理对象是项目
,通过子命令对项目中的一组容器
进行便捷地生命周期管理。
1.2 Docker Compose, Docker Swarm 和 Kubernetes 对比
Docker Compose
- 单机部署:Docker Compose 通常用于
单机部署
,因为它没有集群管理
功能。 - 简单易用:Docker Compose 使用 YAML 文件定义应用,语法简单易懂,易于上手。
- 开发和测试:Docker Compose 非常适合在开发和测试环境中使用,因为它可以快速启动和停止应用,并方便地进行配置更改。
Docker Swarm
- 集群管理:Docker Swarm 是一个
集群管理
工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。 - 服务发现和负载均衡:Docker Swarm 提供
服务发现
和负载均衡
功能,可以自动发现集群中的服务并进行负载均衡。 - 高可用性:Docker Swarm 可以自动重启失败的容器,并确保应用的
高可用性
。 - 生产环境部署:Docker Swarm 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。
Kubernetes
- 集群管理:k8s 是一个
集群管理
工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。 - 功能强大:Kubernetes 是一个功能强大的容器编排工具,它提供了丰富的功能,例如
服务发现
、负载均衡
、自动扩展
、滚动更新
、健康检查
等。 - 高可用性:Docker Swarm 可以自动重启失败的容器,并确保应用的
高可用性
。 - 复杂性高:Kubernetes 的学习曲线比较陡峭,需要掌握大量的概念和配置选项。
- 生产环境部署:Kubernetes 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。
总结
特征 | Docker Compose | Docker Swarm | Kubernetes |
---|---|---|---|
功能 | 简单 | 中等 | 强大 |
复杂性 | 低 | 中等 | 高 |
部署方式 | 单机 | 集群 | 集群 |
服务发现 | 无 | 有 | 有 |
负载均衡 | 无 | 有 | 有 |
高可用性 | 无 | 有 | 有 |
滚动更新、健康检查、高级调度等 | 无 | 无 | 有 |
适用场景 | 开发和测试 | 生产环境 | 生产环境 |
2. docker compose安装
2.1 二进制包
# 1. 安装
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose# 国内用户可以使用以下方式加快下载
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose$ sudo chmod +x /usr/local/bin/docker-compose# 2. 卸载
$ sudo rm /usr/local/bin/docker-compose
2.2 pip安装
# 1. 安装
$ sudo pip install -U docker-compose# 2. 卸载
$ sudo pip uninstall docker-compose# 3. 查看版本
docker-compose --versiom
3. compose模版文件
Docker Compose YAML 文件解释
version: '3'services:mysql:build:context: ./mysqlenvironment:MYSQL_ROOT_PASSWORD: adminrestart: alwayscontainer_name: mysqlvolumes:- /data/edu-bom/mysql/test:/var/lib/mysqlimage: mysql/mysql:5.7ports:- 3306:3306networks:net:eureka:build:context: ./edu-eureka-bootrestart: alwaysports:- 8761:8761container_name: edu-eureka-boothostname: edu-eureka-bootimage: edu/edu-eureka-boot:1.0depends_on:- mysqlnetworks:net:networks:net:volumes:vol:
详细解释:
-
version: 指定 Docker Compose 文件的版本。此处为 3。
-
services: 定义服务部分,包含应用程序的不同组件。
-
mysql: 定义名为 “mysql” 的服务,用于构建和运行 MySQL 数据库。
-
build: 指示 Docker Compose 从 ./mysql 目录构建 Docker 镜像。
-
environment: 设置环境变量,包括 MySQL 数据库的 root 用户密码。
-
restart: 指定容器在意外停止后自动重启。
-
container_name: 指定容器的名称为 “mysql”。
-
volumes: 将主机上的 /data/edu-bom/mysql/test 目录挂载到容器的 /var/lib/mysql 目录,用于存储数据库数据。
-
image: 指定使用官方的 MySQL 5.7 镜像。
-
ports: 将容器的 3306 端口映射到主机的 3306 端口,以便访问 MySQL 数据库。
-
networks: 将 “mysql” 服务连接到名为 “net” 的网络。
-
eureka: 定义名为 “eureka” 的服务,用于构建和运行 Eureka 服务发现服务器。
-
build: 指示 Docker Compose 从 ./edu-eureka-boot 目录构建 Docker 镜像。
-
restart: 指定容器在意外停止后自动重启。
-
ports: 将容器的 8761 端口映射到主机的 8761 端口,以便访问 Eureka 服务发现服务器。
-
container_name: 指定容器的名称为 “edu-eureka-boot”。
-
hostname: 指定容器的主机名为 “edu-eureka-boot”。
-
image: 指定使用 edu/edu-eureka-boot:1.0 镜像。
-
depends_on: 指定 “eureka” 服务依赖于 “mysql” 服务,确保数据库启动后再启动 Eureka 服务。
-
networks: 将 “eureka” 服务连接到名为 “net” 的网络。
-
networks: 定义名为 “net” 的网络。
-
volumes: 定义名为 “vol” 的卷,但未被任何服务使用。
4. docker-compose命令
up
docker-compose up [options] [SERVICE...]
该命令十分强大,它将尝试自动完成包括构建镜像
,(重新)创建服务
,启动服务
,并关联服务相关容器的一系列操作。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
如果使用 docker-compose up -d
,将会在后台启动并运行所有的容器。
默认情况,如果服务容器已经存在,docker-compose up
将会尝试停止容器,然后重新创建(保持使用 volumes-from
挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate
。这样将只会启动处于停止状态的容器,而忽略已经运行的服务。如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME>
来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。
选项:
-d
在后台运行服务容器。
---no-color
不使用颜色来区分不同的服务的控制台输出。--no-deps
不启动服务所链接的容器。--force-recreate
强制重新创建容器,不能与 --no-recreate 同时使用。--no-recreate
如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。--no-build
不自动构建缺失的服务镜像。-t
, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
start
docker-compose start [SERVICE...]
启动已经存在的服务容器
down
docker-compose down
此命令将会停止 up 命令所启动的容器,并移除网络
stop
docker-compose stop [options] [SERVICE...]
停止已经处于运行状态的容器,但不删除它。通过 docker-compose start
可以再次启动这些容器。
选项:
-t
, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
ps
docker-compose ps [options] [SERVICE...]
列出项目中目前的所有容器。
选项:
-q
只打印容器的 ID 信息。
logs
docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认情况下,docker-compose
将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color
来关闭颜色。
build
docker-compose build [options] [SERVICE...]
构建(重新构建)项目中的服务容器。
服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db
。
可以随时在项目目录下运行 docker-compose build 来重新构建服务。
选项:
--force-rm
删除构建过程中的临时容器。--no-cache
构建镜像过程中不使用 cache(这将加长构建过程)。--pull
始终尝试通过 pull 来获取更新版本的镜像。
restart
docker-compose restart [options] [SERVICE...]
重启项目中的服务
选项:
-t
, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。
rm
docker-compose rm [options] [SERVICE...]
删除所有停止状态的)
服务容器。推荐先执行docker-compose stop 命令
来停止容器。
选项:
-f
, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。-v
删除容器所挂载的数据卷。
top
docker-compose top
查看各个服务容器内运行的进程。
images
docker-compose images
列出 Compose 文件中包含的镜像。
run
docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一个命令。
使用举例:
1.在web服务器运行python脚本
docker-compose run web python my_script.py
2. 在 Web 服务容器中运行 shell 命令,并映射端口,设置环境变量,使用卷,连接网络:
docker-compose run -p 8080:80 -e MY_VAR=value -v my_volume:/path/to/file/in/container --network my_network web bash
这将在 “web” 服务的容器中打开一个交互式 shell,并进行以下操作:
- 将容器的 80 端口映射到主机的 8080 端口。
- 设置环境变量 MY_VAR 的值为 “value”。
- 将名为 “my_volume” 的卷挂载到容器中的 /path/to/file/in/container 路径。
- 连接到名为 “my_network” 的网络。
3. 在数据库容器中运行 SQL 命令,使用环境变量,连接网络:
docker-compose run -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password --network my_network db psql -U postgres mydatabase
这将在 “db” 服务的容器中使用 PostgreSQL 客户端连接到 “mydatabase” 数据库,并进行以下操作:
- 设置环境变量 POSTGRES_USER 的值为 “postgres”。
- 设置环境变量 POSTGRES_PASSWORD 的值为 “password”。
- 连接到名为 “my_network” 的网络。
4. 在 Web 服务容器中运行 Python 脚本,使用卷,连接网络:
docker-compose run -v my_volume:/path/to/file/in/container --network my_network web python my_script.py
这将在 “web” 服务的容器中运行名为 “my_script.py” 的 Python 脚本,并进行以下操作:
- 将名为 “my_volume” 的卷挂载到容器中的 /path/to/file/in/container 路径。
- 连接到名为 “my_network” 的网络。
port
docker-compose port [options] SERVICE PRIVATE_PORT
打印某个容器端口所映射的公共端口。
选项:
--protocol=proto
指定端口协议,tcp(默认值)或者 udp。--index=index
如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
# 下面结果表示:将web服务的5000端口映射到了宿主机的5001端口$ docker-compose port web 50000.0.0.0:5001
5. 简单示例
参考链接:
[Docker] Docker Compose 基础教程(概念/基础操作)
全网最详细的Docker-Compose详细教程
Docker Compose
相关文章:
docker-compose教程
1. docker-compose是什么? 1. 1 简介 compose、machine 和 swarm 是docker 原生提供的三大编排工具。 简称docker三剑客。Compose 项目是 Docker 官方的开源项目,定义和运行多个 Docker 容器的应用(Defining and running multi-container Do…...
结果出乎意料!MySQL和MariaDB谁快?MySQL 8.0比MySQL 5.6快吗?
MySQL和MariaDB哪个更快?MySQL 8.0的版本和早期MySQL 5.6的版本哪个更快?这儿有个第三方的测试报告回答了这两个大家关心的问题,姚远来和大家一起解读一下。https://smalldatum.blogspot.com/2024/04/sysbench-on-small-server-mariadb-and.h…...
Alienware外星人X17R2 原装Win11系统镜像下载 带SupportAssist OS Recovery一键恢复
装后恢复到您开箱的体验界面,包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统,经厂家手调试最佳状态,性能与功耗直接拉满,体验最原汁原味的系统。 原厂系统下载网址:http://w…...
【NI国产替代】高速数据采集模块,最大采样率为 125 Msps,支持 FPGA 定制化
• 双通道高精度数据采集 • 支持 FPGA 定制化 • 双通道高精度采样率 最大采样率为 125 Msps12 位 ADC 分辨率 最大输入电压为 0.9 V -3 dB 带宽为 30 MHz 支持 FPGA 定制化 根据需求编程实现特定功能和性能通过定制 FPGA 实现硬件加速,提高系统的运算速度FPGA…...
【网络安全的神秘世界】2024.6.6 Docker镜像停服?解决最近Docker镜像无法拉取问题
🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 解决Docker镜像无法拉取问题 🙋♂️问题描述 常用镜像站:阿里云、科大、南大、上交等,全部挂掉 执行docker pull命…...
【Python入门与进阶】1基本输入和输出
基本输入输出 1.等号赋值 1.1 基本赋值 number_110number_1 1.2 多个赋值 number_2number_3number_420 number_2 number_3 number_4 1.3 多重赋值 number_5,number_6,number_730,35,40 number_5 number_6 number_7 1.4 下划线赋值 _50 _ 2.命名规则 注意:…...
CTF Show MISC做题笔记
MISCX 30 题目压缩包为misc2.rar,其中包含三个文件:misc1.zip, flag.txt, hint.txt。其中后两个文件是加密的。 先解压出misc1.zip, 发现其中包含两个文件:misc.png和music.doc。其中后面文件是加密的。 解压出misc.png,发现图片尾部有消息:flag{flag…...
【QT5】<总览二> QT信号槽、对象树及常用函数
文章目录 前言 一、QT信号与槽 1. 信号槽连接模型 2. 信号槽介绍 3. 自定义信号槽 二、QT的对象树 三、添加资源文件 四、样式表的使用 五、QSS文件的使用 六、常用函数与宏 前言 承接【QT5】<总览一> QT环境搭建、快捷键及编程规范。若存在版…...
Button按钮类
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 按钮是GUI界面中应用最为广泛的控件,它常用于捕获用户生成的单击事件,其最明显的用途是触发绑定到一个处理函数。 wxPython类…...
代码随想录-二叉树 | 111 二叉树的最小深度
代码随想录-二叉树 | 111 二叉树的最小深度 LeetCode 111 二叉树的最小深度解题思路代码难点总结 LeetCode 111 二叉树的最小深度 题目链接 代码随想录 题目描述 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…...
PCA降维算法
decomposition.h #pragma once #include <arrayfire.h>namespace decomposition {class PCA{public:af::array zero_centred(af::array...
Fast R-CNN 与 R-CNN的不同之处
目录 一、Fast R-CNN如何生成候选框特征矩阵 二、 关于正负样本的解释 三、训练样本的候选框 四、Fast R-CNN网络架构 4.1 分类器 4.2 边界框回归器 一、Fast R-CNN如何生成候选框特征矩阵 在R-CNN中,通过SS算法得到2000个候选框,则需要进行2000…...
前端开发环境:Vue、Element Plus、Axios
目录 1. Vue简介 2. Element Plus简介 3. Axios简介 4. 创建Vue项目 4.1 Node.js安装 4.2 创建Vue项目 4.3 Vue项目的结构 4.4 安装Element-Plus 4.5 安装Axios 4.6 解决跨域问题 5. 应用实例 5.1 创建Vue组件 5.2 配置路由 5.3 配置根组件 5.4 启动前端应用服…...
我的创作纪念日-在SCDN的5年
机缘 五年前,一个偶然的机会让我接触到了SCDN这个充满活力和创造力的社区。我抱着对技术的热爱和对知识的渴望,决定在这里开启我的创作之旅。最初,我成为创作者的初心,是希望将自己在实战项目中的经验、日常学习过程中的点滴&…...
AI-知识库搭建(二)GPT-Embedding模型使用
上一篇:AI-知识库搭建(一)腾讯云向量数据库使用-CSDN博客 一、Embedding模型 Embedding模型是一种将高维度的离散数据(如文本、图像、音频等)映射到低维度的连续向量空间的技术。这种技术广泛应用于自然语言处理&…...
qt网络事件之QSocketNotifier
简介 QSocketNotifier用于处理网络事件的,即事件处理器 结构 #mermaid-svg-xcNdAyHNkKqNCLQY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xcNdAyHNkKqNCLQY .error-icon{fill:#552222;}#mermaid-svg-xcNdAyHNk…...
如何统计EXCEL中的数据透视表的信息?
也没什么可分析的,直接上代码,看看是不是你需要的: Sub GetPVT() 定义一个1000行的数组,如果你预判工作簿中数据透视表数量可能大小1000,那就改成10000,甚至10万,以确保能大于数据透视表数量即…...
日本结构型产品及衍生品业务变迁报告
日本结构型产品及衍生品业务变迁报告 一、业务发展阶段 阶段一:2000年之前 零售结构型产品几乎不存在,主要销售对象为机构投资者或企业。主要策略为卖出看涨期权(covered call)。会计记录准则对业务有重要影响,例如…...
解决Mac无法上网/网络异常的方法,重置网络
解放方法 1、前往文件夹:/Library/Preferences/SystemConfiguration 2 、在弹窗中输入上边的地址 3 、把文件夹中除了下图未选中的文件全部删掉,删除时需要输入密码 4 、重启mac 电脑就搞定了。...
[12] 使用 CUDA 进行图像处理
使用 CUDA 进行图像处理 当下生活在高清摄像头的时代,这种摄像头能捕获高达1920*1920像素的高解析度画幅。想要实施的处理这么多的数据,往往需要几个TFlops地浮点处理性能,这些要求CPU也无法满足通过在代码中使用CUDA,可以利用GP…...
MyBatisPlus代码生成器(交互式)快速指南
引言 本片文章是对代码生成器(交互)快速配置使用流程,更多配置方法可查看官方文档: 代码生成器配置官网 如有疑问欢迎评论区交流! 文章目录 引言演示效果图引入相关依赖创建代码生成器对象引入Freemarker模板引擎依赖支持的模板引擎 MyBat…...
深度学习模型训练之日志记录
在深度学习模型训练过程中,进行有效的训练日志记录是至关重要的。以下是一些常见的策略和工具来实现这一目标: 1. 使用TensorBoard TensorBoard是TensorFlow提供的一个可视化工具,用于记录和展示训练过程中的各种指标。 设置TensorBoard&a…...
深入理解Python中的装饰器
装饰器是Python中一个强大且灵活的工具,允许开发者在不修改函数或类定义的情况下扩展或修改其行为。装饰器广泛应用于日志记录、访问控制、缓存等场景。本文将详细探讨Python中的装饰器,包括基本概念、函数装饰器和类装饰器、内置装饰器以及装饰器的高级用法。 目录 装饰器概…...
基于springboot的人力资源管理系统源码数据库
传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,员工信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的…...
如何舒适的使用VScode
安装好VScode后通常会很不好用,以下配置可以让你的VScode变得好用许多。 VScode的配置流程 1、设置VScode中文2、下载C/C拓展,使代码可以跳转3、更改编码格式4、设置滚轮缩放5、设置字体6、设置保存自动改变格式7、vscode设置快捷代码 1、设置VScode中文…...
【微信小程序】开发环境配置
目录 小程序的标准开发模式: 注册小程序的开发账号 安装开发者工具 下载 设置外观和代理 第一个小程序 -- 创建小程序项目 查看项目效果 第一种:在模拟器上查看项目效果 项目的基本组成结构 小程序代码的构成 app.json文件 project.config…...
启动盘镜像制作神器(下载即用)
一、简介 1、一款受欢迎且功能强大的USB启动盘制作工具,允许用户将操作系统镜像文件(如Windows或Linux的ISO文件)制作成可引导的USB启动盘。它支持多种操作系统,包括Windows、Linux和各种基于UEFI的系统。Rufus的一个显著特点是制作速度快,据称其速度比其他常用工具如UNet…...
PHP框架详解 - Symfony框架
引言 在现代Web开发中,PHP作为一种灵活且功能强大的编程语言,广泛应用于各种Web应用程序的开发中。为了提高开发效率、代码的可维护性和可扩展性,开发者通常会选择使用框架来构建应用程序。在众多PHP框架中,Symfony以其强大的功能…...
鸿蒙开发:【线程模型】
线程模型 线程类型 Stage模型下的线程主要有如下三类: 主线程 执行UI绘制。管理主线程的ArkTS引擎实例,使多个UIAbility组件能够运行在其之上。管理其他线程的ArkTS引擎实例,例如使用TaskPool(任务池)创建任务或取消…...
初级网络工程师之从入门到入狱(三)
本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 中小型网络系统综合实战实验 前言一、详细拓扑图二、LSW2交换机三、LSW3交换机四、LSW1三层交换机4.1、4.2、4.3、4.4、4.5、…...
网站别人做的我自己怎么续费/十大接单推广app平台
通过 https://sublime.wbond.net/Package%20Control.sublime-package 下载packageControl文件 下载完成后,打开sublime text3,选择菜单Preferences->Browse Packages, 打开安装目录, 此时会进入到一个叫做Packages的目录下&…...
一个服务器下怎么做两个网站吗/做网站排名服务热线
根据书上描述,共享栈的特点是:两个栈顶,置放在数组两头,入栈迎面相向,相遇时栈满,看图示: 主要处理两步工作:第一,栈空的标志。这里沿用前面的约定,左栈用-1&…...
webform 做网站好不好/视频剪辑培训
阅读本文大概需要 10 分钟。作者:苏静链接:http://www.17coding.info/article/24上周对象突然心血来潮说想养个小宠物,我问想养啥她又说随便,你看着办!这我真的比较难办啊!但是咱们程序员能有个对象就不错了…...
京东怎么做轮播图链接网站/seo视频
VUE高仿饿了么app 本项目github地址:https://github.com/motysla/eleme.git VUE 搭建简介 刚学习了VUE高仿饿了么app课,记录课的要点,巩固知识。 VUE 优势 Vue.js 是一个用于创建 web 交互界面的。其特点是 简洁 HTML 模板 JSON 数据,再创建一个 Vue 实…...
保险网站有哪些平台/成都网站制作费用
(1)什么是Dom解析: Dom解析(Document Object Mode)是一种基于对象的API,它把XML的内容加载到内存中,生成Dom对象树。这样便能根据树的结构,已节点形式对文档进行操作。解析XML文件要…...
达人设计网官方网站/手机百度经验首页登录官网
从小到大,我们一直都在学习,不论是课本上的知识,还是人生中的道理。终身学习画布这个名词你可能是第一次听到,但是你肯定用过。终生学习画布就是将自己的学习目标,日常行为,人生规划写在一张纸上。但是想要…...