FreeRTOS多任务管理

article/2025/8/26 22:23:49

文章目录

  • 1、任务
    • 1.1 任务简介
    • 1.2 任务调度
    • 1.3 任务的状态 (就绪态 / 运行态 / 阻塞态 / 挂起态)
    • 1.4 空闲任务
  • 2、动态创建两个任务
    • 2.1 定义动态内存空间的堆
    • 2.2 定义任务函数
    • 2.3 定义 任务控制块 指针
    • 2.4 动态创建任务 xTaskCreate()
    • 2.5 启动任务 vTaskStartScheduler()
  • 3、常用的任务函数
    • 3.1 任务挂起 vTaskSuspend()
    • 3.2 任务恢复 vTaskResume()
    • 3.3 任务删除 vTaskDelete()
    • 3.4 阻塞延时函数
      • 3.4.1 相对延时函数 vTaskDelay()
      • 3.4.2 绝对延时函数 vTaskDelayUntil()


1、任务

1.1 任务简介

(1) 在裸机系统中,系统的主体就是 main 函数里面顺序执行的无限循环,这个无限循环里面 CPU 按照顺序完成各种事情。
(2) 在FreeRTOS中,根据功能的不同,把整个系统分割成一个个独立无限循环无法返回的函数,这个函数就称为 任务

1.2 任务调度

任何时刻,只有一个任务得到运行,FreeRTOS调度器 决定运行哪个任务。调度器会不断的启动、停止每一个任务,宏观看上去所有的任务都在同时在执行。
FreeRTOS 中的任务是 抢占式 调度机制,高优先级的任务可打断 低优先级任务,低优先级任务必须在高优先级任务阻塞结束后 才能得到调度。

1.3 任务的状态 (就绪态 / 运行态 / 阻塞态 / 挂起态)

任务状态通常分为以下四种:
就绪态 (ready):该任务在就绪列表中,就绪的任务已经具备执行的能力,只等待调度器进行调度,新创建的任务会初始化为就绪态

运行态 (running):该状态表明任务正在执行,此时它占用处理器,FreeRTOS调度器选择运行的永远是处于最高优先级的 就绪态任务,当任务被运行的一刻,它的任务状态就变成了运行态

阻塞态 (blocked):正在运行的任务发生阻塞 (延时、读信号量等待、读写队列或者等待读写事件) 时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态。

挂起态 (suspended):处于挂起态的任务 对调度器而言是不可见的,让一个任务进入挂起状态的唯一办法就是调用 vTaskSuspend() 函数;而把一个挂起状态的任务恢复 的唯一途径 就是调用 vTaskResume() 或 vTaskResumeFromISR() 函数。

挂起态阻塞态的区别:
当任务有较长的时间不允许运行的时候,我们可以挂起任务,这样 调度器就不会管这个任务的任何信息,直到我们调用恢复任务的 API 函数;
而任务处于阻塞态的时候,系统还需要判断 阻塞态的任务是否超时,是否可以解除阻塞。

他们之间的转换关系如下图:
在这里插入图片描述
(1):创建任务→就绪态 (ready):任务创建完成后进入就绪态,表明任务已准备就绪,随时可以运行,只等待调度器进行调度。
(2):就绪态→运行态 (running):发生任务切换时,就绪列表最高优先级的任务被执行,从而进入运行态。
(3):运行态→就绪态:有更高优先级任务创建或者恢复后,会发生 任务调度,此刻就绪列表中最高优先级任务变为运行态,那么原先运行的任务由运行态变为就绪态,依然在就绪列表中,等待最高优先级的任务运行完毕继续运行原来的任务 (此处可以看做是 CPU使用权被更高优先级的任务抢占了)。
(4):运行态→阻塞态 (blocked):正在运行的任务发生阻塞 (延时、读信号量等待) 时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中当前最高优先级任务。
(5):阻塞态→就绪态:阻塞的任务被恢复后 (任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态;如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,将该任务将再次转换任务状态,由就绪态变成运行态。
(6) (7) (8):就绪态、阻塞态、运行态→挂起态 (suspended):任务可以通过调用 vTaskSuspend() API 函数都可以将处于任何状态的任务挂起,被挂起的任务得不到CPU的使用权,也不会参与调度,除非它从挂起态中解除。
(9):挂起态→就绪态:把一个挂起状态的任务 恢复的唯一途径就是调用 vTaskResume() 或 vTaskResumeFromISR() API 函数,如果此时被恢复任务的优先级高于正在运行任务的优先级,则会发生 任务切换,将该任务将再次转换任务状态,由就绪态 变成 运行态。

1.4 空闲任务

空闲任务是系统在 启动调度器的时候,创建的优先级最低的任务,空闲任务主体主要是做一些系统内存的清理工作。如果没有其它任务可以运行,这个时候CPU就运行空闲任务。

2、动态创建两个任务

2.1 定义动态内存空间的堆

使用动态内存,即 堆(heap),也属于 SRAM。
FreeRTOS 做法是在SRAM里面定义一个大数组,也就是堆内存,供 FreeRTOS的动态内存分配函数使用,在第一次使用的时候,系统会将定义的堆内存进行初始化。

//系统所有总的堆大小
#define configTOTAL_HEAP_SIZE    ((size_t)(36*1024))    (1)
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; 	    (2)

(1) 堆内存的大小为 configTOTAL_HEAP_SIZE,在 FreeRTOSConfig.h 中,由用户自己定义,configSUPPORT_DYNAMIC_ALLOCATION 这个宏定义在使用FreeRTOS操作系统的时候必须开启。
(2) 从内部SRAM 里面定义一个静态数组 ucHeap,大小由configTOTAL_HEAP_SIZE这个宏决定,目前定义为 36KB。

2.2 定义任务函数

创建两个任务,分别 让 LED 灯以 500ms / 1000ms的频率闪烁,具体实现见代码清单:

 static void LED1_Task(void* parameter){while (1) {							LED1_ON;vTaskDelay(500); /*  延时500个tick */LED1_OFF;vTaskDelay(500); /*  延时500个tick */}}static void LED2_Task(void* parameter){while (1) {									(1)LED2_ON;vTaskDelay(1000); /*  延时1000个tick */  	(2)LED2_OFF;vTaskDelay(1000); /*  延时1000个tick */}
}

(1) :任务必须是一个死循环。
(2) :任务里面的延时函数必须使用 FreeRTOS 里面提供的延时函数 vTaskDelay()
调用 vTaskDelay() 函数的时候,当前任务进入阻塞状态,调度器会切换到其它就绪的任务,从而实现多任务。

2.3 定义 任务控制块 指针

任务控制块 (TCB) 是在任务创建的时候分配内存空间创建,任务创建函数会返回一个指针,用于指向 任务控制块,所以要预先为任务栈定义一个任务控制块指针,也就是 任务句柄

任务句柄的数据类型为 TaskHandle_t,在 task.h 中定义,实际上就是一个 空指针,具体实现见代码清单:

 /* 任务句柄 */typedef void * TaskHandle_t;

定义任务句柄:

/**************************** 任务句柄 ********************************//** 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄* 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么* 这个句柄可以为 NULL。*/static  TaskHandle_t  AppTaskCreate_Handle  =  NULL;	/* 创建任务句柄 */static  TaskHandle_t  LED1_Task_Handle  	=  NULL;	/* LED1 任务句柄 */static  TaskHandle_t  LED2_Task_Handle  	=  NULL;	/* LED2 任务句柄 */

2.4 动态创建任务 xTaskCreate()

使用动态内存的时候,使用 xTaskCreate() 函数来创建一个任务。

 	/* 创建 AppTaskCreate 任务 */xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */	   	(1)(const char* )"AppTaskCreate", 	/* 任务名字 */	       	(2)(uint16_t )512, 				/* 任务栈大小 */			(3)(void* )NULL,					/* 任务入口函数参数 */	(4)(UBaseType_t )1, 				/* 任务的优先级 */	 	(5)(TaskHandle_t* )&AppTaskCreate_Handle); /* 任务控制块 指针 */ (6)/* 启动任务调度 */if (pdPASS == xReturn)vTaskStartScheduler(); /* 启动任务,开启调度 */

(1) :任务入口函数,即任务函数的名称。(用户自定义,用于创建任务)
(2) :任务名字,字符串形式, 最大长度由 FreeRTOSConfig .h 中定义的configMAX_TASK_NAME_LEN 宏指定,多余部分会被自动截掉,这里任务名字最好要与 任务函数入口名字一致,方便进行调试。
(3) :任务堆栈大小,单位为字,在32位的处理器下,一个字等于4个字节,那么任务大小就为 512*4 = 2048 字节。
(4) :任务入口函数形参,不用的时候配置为 0 或者 NULL即可。
(5) :任务的优先级。 优先级范围根据 FreeRTOSConfig .h 中的宏 configMAX_PRIORITIES 决定:

  1. 如果使能 configUSE_PORT_OPTIMISED_TASK_SELECTION 这个宏定义,则最多支持 32 个优先级;
  2. 如果不用特殊方法查找下一个运行的任务,那么则不强制要求限制最大可用优先级数目。

在 FreeRTOS 中,数值越大 优先级越高,0代表最低优先级

(6) :任务控制块 指针。 在使用动态内存的时候,任务创建函数 xTaskCreate() 会返回一个指针 指向 任务控制块,该任务控制块是 xTaskCreate() 函数里面动态分配的一块内存。

任务创建好后,是处于 任务就绪 (ready),在就绪态的任务可以参与操作系统的调度。

说明
为了方便管理,任务的创建都通过 AppTaskCreate() 任务创建函数来执行:

 static void AppTaskCreate(void){BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */taskENTER_CRITICAL(); //进入临界区/* 创建 LED1_Task 任务 */xReturn = xTaskCreate((TaskFunction_t )LED1_Task, 	/* 任务入口函数 */(const char* )"LED1_Task", 				/* 任务名字 */(uint16_t )512, 						/* 任务栈大小 */(void* )NULL,  							/* 任务入口函数参数 */(UBaseType_t )2, 						/* 任务的优先级 */(TaskHandle_t* )&LED1_Task_Handle);		/* 任务控制块指针 */if (pdPASS == xReturn)printf("创建 LED1_Task 任务成功!\r\n");/* 创建 LED2_Task 任务 */xReturn = xTaskCreate((TaskFunction_t )LED2_Task, 	/* 任务入口函数 */(const char* )"LED2_Task",				/* 任务名字 */(uint16_t )512, 						/* 任务栈大小 */(void* )NULL,  							/* 任务入口函数参数 */(UBaseType_t )3, 						/* 任务的优先级 */(TaskHandle_t* )&LED2_Task_Handle);		/* 任务控制块指针 */if (pdPASS == xReturn)printf("创建 LED2_Task 任务成功!\r\n");vTaskDelete(AppTaskCreate_Handle); //删除 AppTaskCreate 任务taskEXIT_CRITICAL(); //退出临界区}

2.5 启动任务 vTaskStartScheduler()

在创建完任务的时候,我们需要 开启调度器,因为创建仅仅是把任务添加到系统中,还没真正调度,并且空闲任务也没实现,定时器任务也没实现,这些都是在开启调度函数 vTaskStartScheduler() 中实现的。

任务调度器只启动一次,之后就不会再次执行了。从此,任务管理都由 FreeRTOS 管理,此时是真正进入 实时操作系统

 /****************************************************************** @brief 主函数* @param 无* @retval 无* @note 第一步:开发板硬件初始化第二步:创建 APP 应用任务第三步:启动 FreeRTOS,开始多任务调度****************************************************************/int main(void){BaseType_t xReturn = pdPASS;	/* 定义一个创建信息返回值,默认为 pdPASS *//* 第1步 开发板硬件初始化 */BSP_Init();/* 第2步 创建 AppTaskCreate 任务 */xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */		(1)(const char* )"AppTaskCreate", 	/* 任务名字 */			(2)(uint16_t )512, 				/* 任务栈大小 */  		(3)(void* )NULL,					/* 任务入口函数参数 */ 	(4)(UBaseType_t )1, 				/* 任务的优先级 */  		(5)(TaskHandle_t* )&AppTaskCreate_Handle); /* 任务控制块指针 */ (6)/* 第3步 启动任务调度 */if (pdPASS == xReturn)vTaskStartScheduler(); /* 启动任务,开启调度 */elsereturn -1;while (1); /* 正常不会执行到这里 */}  

3、常用的任务函数

3.1 任务挂起 vTaskSuspend()

任务可以通过调用 vTaskSuspend() 函数都可以将处于任何状态的任务挂起,被挂起的任务得不到 CPU 的使用权,也不会参与调度,它相对于调度器而言是不可见的,除非它从挂起态中解除。

注:任务可以调用 vTaskSuspend() 这个函数来挂起任务自身,但是在挂起自身的时候会进行一次任务上下文切换,需要 挂起自身就将 xTaskToSuspend 设置为 NULL 传递进来即可。
无论任务是什么状态都可以被挂起,只要调用了 vTaskSuspend() 这个函数就会挂起成功,不论是挂起其他任务还是挂起任务自身。

代码示例:

 static TaskHandle_t LED_Task_Handle = NULL;	/*LED任务句柄*/static void KEY_Task(void* parameter){while (1) {if ( Key_Scan(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == KEY_ON ) {/*K1被按下*/printf("挂起 LED 任务!\n");vTaskSuspend(LED_Task_Handle);	/*挂起LED任务*/}vTaskDelay(20);			/*延时20个tick*/}}

3.2 任务恢复 vTaskResume()

任务恢复 就是让挂起的任务 重新进入就绪状态,恢复的任务会保留挂起前 的状态信息,在恢复的时候 根据挂起时的状态,继续运行。
如果被恢复任务在所有就绪态任务中,处于最高优先级列表的第一位,那么系统将进行任务上下文的切换。

代码示例:

static TaskHandle_t LED_Task_Handle = NULL;		/* LED  任务句柄 */static void KEY_Task(void* parameter)
{while (1) {if ( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON ) {/* K2 被按下 */printf("恢复 LED 任务!\n");vTaskResume(LED_Task_Handle);	/* 恢复LED任务!*/}vTaskDelay(20);				/* 延时20个tick */}
}

3.3 任务删除 vTaskDelete()

vTaskDelete() 用于删除一个任务。
(1) 当一个任务 删除另外一个任务时,形参为 要删除任务 创建时返回的任务句柄;
(2) 如果是删除自身, 则形参为 NULL。

要想使用该函数必须在 FreeRTOSConfig.h 中把 INCLUDE_vTaskDelete 定义为 1,删除的任务将从所有 就绪,阻塞,挂起和事件列表中删除。

代码示例:


/*  删除任务本身 */
vTaskDelete( NULL );/*  在其他任务删除 DeleteTask 任务 */
vTaskDelete( DeleteHandle );

3.4 阻塞延时函数

3.4.1 相对延时函数 vTaskDelay()

阻塞延时的阻塞,是指任务调用该延时函数后,任务会被剥离 CPU 使用权,然后进入阻塞状态,直到延时结束,任务重新获取 CPU 使用权才可以继续运行。在任务阻塞的这段时间,CPU可以去执行其它的任务,如果其它的任务也在延时状态,那么 CPU就将运行空闲任务。延时的时长由形参 xTicksToDelay 决定,单位为系统节拍周期, 比如系统的时钟节拍周期为 1ms,那么调用 vTaskDelay(1) 的延时时间则为 1ms。

vTaskDelay() 延时是相对性的延时,它指定的延时时间是从调用 vTaskDelay() 结束后开始计算的,经过指定的时间后延时结束。
比如 vTaskDelay(100), 从调用 vTaskDelay() 结束后,任务进入阻塞状态,经过 100 个系统时钟节拍周期后,任务解除阻塞。因此,vTaskDelay() 并不适用与周期性执行任务的场合。此外,其它任务和中断活动,也会影响到 vTaskDelay() 的调用(比如调用前,高优先级任务抢占了当前任务),进而影响到任务的下一次执行的时间。

任务的延时在实际中运用特别多,因为需要暂停一个任务,让任务放弃 CPU,延时结束后再继续运行该任务,如果任务中没有阻塞的话,比该任务优先级低的任务 则无法得到CPU的使用权,就无法运行。

代码示例:

void vTaskA( void * pvParameters ){while (1) {// ...// 这里为任务主体代码// .../*  调用相对延时函数, 阻塞 1000 个 个 tick */vTaskDelay( 1000 );}}

3.4.2 绝对延时函数 vTaskDelayUntil()

在 FreeRTOS 中,除了相对延时函数,还有绝对延时函数 vTaskDelayUntil(),这个绝对延时常用于较精确周期运行任务,比如我有一个任务,希望它以 固定频率定期执行,而不受外部的影响,任务从上一次运行开始到下一次运行开始的时间间隔是绝对的,而不是相对的。

函数原型:

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement );

代码实例:

void vTaskA( void * pvParameters ){/*  用于保存上次时间。调用后系统自动更新 */static portTickType PreviousWakeTime;/*  设置延时时间,将时间转为节拍数 */const portTickType TimeIncrement = pdMS_TO_TICKS(1000);/*  获取当前系统时间 */PreviousWakeTime = xTaskGetTickCount();while (1) {/*  调用绝对延时函数, 任务时间间隔为 1000 个 个 tick */vTaskDelayUntil( &PreviousWakeTime ,TimeIncrement );// ...// 这里为任务主体代码// ...}
}

注意:在使用的时候要将延时时间转化为系统节拍,在任务主体之前要调用延时函数。
任务会先调用 vTaskDelayUntil() 使任务进入 阻塞态,等到时间到了就从阻塞中解除,然后执行主体代码,任务主体代码执行完毕。会继续调用 vTaskDelayUntil() 使任务进入阻塞态,然后就是循环这样子执行。

即使任务在执行过程中发生中断,那么也不会影响这个任务的运行周期,仅仅是缩短了阻塞的时间而已,到了要唤醒的时间依旧会将任务唤醒。


http://chatgpt.dhexx.cn/article/lJPOs3Jf.shtml

相关文章

FreeRTOS 移植

源码 FreeRTOS源码 选择 FreeRTOS 的最新版本 V9.0.0(2016 年)比较稳定 1)解压后的文件 提取的文件, FreeRTOS—>Source->portable目录下的MemMang,RVDS MemMang 存放内存相关的源文件,heap_1.c,heap_2.c,he…

初识FreeRTos

初识FreeRTos Preface一、FreeRTos简介二、 为什么选择FreeRTos三、FreeRTos资料和源码的下载四、介绍我自己的开发环境4.1FreeRTos4.2AlienTek Summary Preface 距离我上一次写博客已经差不多有5个月了,最近想给自己挖个新坑,讲一讲关于FreeRTos 相关的…

FreeRTOS移植

1. 前言 本文是基于FreeRTOSv9.0.0版本的实时系统,移植到STM32F103芯片平台上。移植环境使用的是MDK5.32版本,我在移植之前就已经构建好了一个裸机工程源码了,而且已经确保了这份裸机代码是没有问题的。开始移植之前我强烈建议一定要确认自己…

FreeRTOS快速入门-初探FreeRTOS

首发,公众号【一起学嵌入式】 对于 RTOS 入门系列文章,已经更新完一款(RT-Thread): 助你快速入门 RT-Thread 这个系列的文章结合 RT-Thread,介绍过 RTOS 相关的核心知识。 接下来,开始另外一…

FreeRTOS系列|FreeRTOS简介

1. RTOS简介 RTOS全称为 Real Time Operation System,即实时操作系统。RTOS强调的是实时性,又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作,不允许超时;而软实时里对处理过程超时的要求则没有很严格。RTOS的核心就…

freertos任务基础知识(freertos篇)

多任务 对于单任务系统就是常说裸机大while循环,有的时候也需要加一些中断服务函数完成一些处理,相比于多任务而言上面的单任务系统也叫做前后台系统,即(中断服务函数叫前台程序,大while叫后台程序) 前后台…

FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架

目录 一、为什么要学习FreeRTOS 二、前言------从0到1认识FreeRTOS 1、逻辑系统与多任务系统 1.1、裸机系统:裸机系统通常分成轮询系统和前后台系统 1.2、多任务系统 2、数据结构-列表与列表项 三、任务 3.1基本属性 3.1.1任务栈 3.1.2任务控制块 3.1.3任…

一、初识FreeRTOS之FreeRTOS简介

目录 一、什么是FreeRTOS? 二、为什么选择FreeRTOS? 三、FreeRTOS的特点 四、FreeRTOS资料与源码下载 五、FreeRTOS源码文件介绍 一、什么是FreeRTOS? Free即免费的,RTOS的全称是Real time operating system,中文就是实时操作…

Docker技术入门与实战-第3版.pdf OCR 高清 可复制

Docker技术入门与实战-第3版.pdf OCR 高清 可复制 Docker技术入门与实战-第3版.pdf OCR 高清 可复制简介预览下载地址 Docker技术入门与实战-第3版.pdf OCR 高清 可复制 简介 本书从Docker基本原理开始,深入浅出地讲解Docker的构建与操作,内容系统全面…

从docker到kubernetes(k8s)入门与实战--docker教程

安装docker 装个依赖 yum -y install gcc gcc-c 卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 安装依…

Docker 入门到实战教程(二)安装Docker

一.卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…

Docker入门及进阶教程

阅读声明: 该教程笔记来源于dockers——菜鸟教程 一、Docker介绍 1. Docker教程 Docker是一个开源的容器引擎,基于Go语言并遵从Apache2.0协议开源。 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器,然后发…

Docker 实战

目录 一、常用操作 1、镜像创建 2、镜像查询 3、镜像删除 4、镜像运行 5、查询容器进程 6、查询容器执行日志 7、删除容器 8、进入容器 二、导入和导出 1、save 和 load 2、export 和 import 3、区别 三、案例 1、检查是否安装依赖 2、安装依赖 3、docker打包镜…

Docker 实战教程之从入门到提高 (四)

本系列的前三篇文章,我们学习了如何在 Ubuntu 操作系统安装 Docker,并且通过实战练习,了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理,以及 Docker Volume 的工作原理。通过动手对 Nginx Docker 镜像进行修改&#xf…

Docker快速入门实战

为什么使用容器? 1、上线流程繁琐 2、资源利用率低 3、扩容/缩容不及时 4、服务器环境臃肿 5、环境不一致性 容器VS虚拟机 VM VS Container Docker 是什么 1、使用最广泛的开源容器引擎 2、一种操作系统级的虚拟化技术 3 、依赖于Linux内核特性&#xff1…

Docker教程(Docker实战)

Docker快速入门教程 **欢迎关注公众号【程猿薇茑】** 【仅需一次订阅,作者所有专栏都能看】 推荐【Kafka】https://bigbird.blog.csdn.net/article/details/108770504 推荐【rabbitmq】https://bigbird.blog.csdn.net/article/details/81436980 推荐【Flink】https://blog.csdn…

Docker最全教程——从理论到实战(一)

容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。 本篇教程持续编写了2个星期左右,只是为了大家更好地了解、理解和消化这个技术,能够搭上这波车。 你可以关注我们的公众号“magicco…

Docker 实战教程之从入门到提高(二)

本系列第一篇文章,Docker 实战教程之从入门到提高 (一),我们已经介绍了如何在 Ubuntu 操作系统中安装 Docker,以及 Proxy 和 Insecure Registry 的配置。 本文继续 Docker 的实战学习。 练习1:通过一个简单例子学习 Docker 和宿…

docker简单实战

1.为ubuntu镜像添加ssh服务 1.1查看可用的ubuntu版本 1)访问ubuntu镜像库地址:https://hub.docker.com/search?qubuntu&typeimag1e 2)点击第一个ubuntu的官方镜像,选择tag标签,可以选择下载对应的ubuntu镜像 3…

Docker入门与进阶(基础+实战+进阶+Compose+Swarm)超详细版

Docker入门与进阶(基础实战进阶) 一、Docker入门1.1 Docker 概述1.2 Docker 安装、配置、卸载1.3 Docker 使用流程1.4 Docker 访问原理1.5 Docker 常用命令1.5.1 基础命令1.5.2 镜像命令1.5.3 容器命令1.5.4 其他常用命令1.5.5 镜像导出、导入 1.6 制作D…