基于华为云平台的 “微信公众号后台消息回复” + “云容器快速搭建网站”
基于华为云平台的
“微信公众号后台消息回复”
+
“云容器快速搭建网站”
目录
2.7.2 handle.py 文件:定义服务请求、接受、发送、处理等相关方法 8
2.7.3 receive.py 文件:定义相关信息处理的类和方法 9
2.7.4 reply_text.xml 文件:执行信息回复时使用的数据包 11
3.4 创建弹性云服务器 ECS & 安装 docker 16
3.5.2 制作 redis 和 redisslave 镜像 20
1、 实验简介
1.1实验背景
Cloud 2.0时代,企业更加关注应用上云,期待应用的高效迁移部署和快速迭代开发。在容器 运用日趋普及的当下,利用容器来提升资源利用率、优化算力、简化运维已成了企业云上开发 与运维的共识。在电商、游戏、互联网等众多行业,应用容器化已经成为了必然趋势,面对流 量高峰期,容器的秒级启动为弹性伸缩提供了很好的基础,用户几乎可以实时地根据应用的需 要去扩展/缩小容器规模,这在应用负载多变的场景中及其重要。
1.1.1微信公众号
微信公众号是开发者或商家在微信公众平台上申请的应用账号。通过公众号,商家可以在微 信平台上实现和特定群体的文字、图片、语音、视频的全方位沟通、互动,形成一种主流的线 上线下微信互动营销方式。
本次实验通过弹性云服务器 ECS、弹性公网 IP 搭建微信公众号处理后台,使用 Python 语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果给最终用户,体验基于华为公有云服务不一样的感受。
1.1.2 云容器快速搭建网站
云容器引擎CCE是基于 K8s 和 Docker 的企业级容器服务,为企业应用提供快速部署、自动化运维、弹性伸缩等容器生命周期管理能力。
实验通过docker容器以及云容器引擎 CCE 平台快速实现了网站搭建,体验到容器为企业应用所带来的极大的便利性。
1.2实验目的
• 理解弹性云服务器与镜像以及弹性公网 IP 的关系及作用;
• 掌握在华为公有云服务器上软件安装下载以及版本升级的操作方法;
• 掌握 WinSCP 工具的正确使用方法;
• 利用弹性公网 IP 以及 token 成功对接弹性云服务器;
• 理解容器与镜像的关系及作用;
• 掌握镜像制作与上传的原理及流程;
• 利用镜像创建容器工作负载并发布网站服务;
• 利用token验证对传统HTTP无状态协议进行改进
• 利用CCE集群搭建自己的个人网站
2、 微信公众号后台消息回复
使用 Python+Web.py 组合完成微信公众号开发,在弹性云服务器 ECS 上部署微信公众号后台,配置开发者模式,通过弹性公网 IP 以及 token 成功对接弹性云服务器 ECS。
2.1实验架构
图2-1 实验原理架构
由于HTTP是一种没有状态的协议,它并不知道是谁访问了我们的应用,用户使用用户名还有密码通过了身份验证,不过下次这个用户再发送请求的时候,还得再验证一下。
而Token是服务端生成的一串加密字符串,用作客户端进行请求的一个“令牌”。当用户第一次使用账号密码成功进行登录后,服务器便生成一个Token及Token失效时间并将此返回给客户端,若成功登陆,以后客户端只需在有效时间内带上这个Token前来请求数据即可,无需再次带上用户名和密码。
2.2实验流程
图2-2 实验流程图
2.3注册微信公众号
1) 输入微信公众平台网站平台https://mp.weixin.qq.com/,在上方点击“立即注册”;
2) 在弹出的注册界面中,选择“订阅号”,并点击;
3) 选择“订阅号”后,按照腾讯公众号指引流程进行引导注册,填写“基本信息”;
4) 完成注册,公众号管理界面如图2-3所示。
图2-3 微信公众号注册成功
2.4创建虚拟私有云VPC
1) 登陆华为云控制台,点击左侧图标找到“网络>虚拟私有云 VPC”,进入网络控制台,点击“创建虚拟私有云”进入创建界面;
2) 创建虚拟私有云vpc-shiyan,其相关配置如图2-4所示;
图2-4 虚拟私有云创建成功
3) 配置vpc-shiyan的子网subnet-shiyan如图2-5所示
图2-5 VPC子网配置成功
4) 在网络控制台左侧菜单栏中点击“访问控制 > 安全组”进入安全组页面,点击需要修改的安全组“Sys-default”,在“入方向规则”中点击“添加规则”。
5) 添加两条规则如图2-6所示:
(a) 开放80端口
(b) 开放22端口
图2-6 安全组设置
其中22端口用于远程连接服务器,80端口用于启动python程序以及相关服务。
2.5创建弹性云服务器ECS
1) 登陆华为云控制台,点击“计算>弹性云服务器 ECS”,进入云服务器控制台,购买弹性云服务器,其相关配置如下图2-7所示:
图2-6 弹性云服务器相关配置
2) 利用华为云CloudShell进入刚刚购买的服务器ecs-shiyan,选择公网登陆,输入密码便可登陆进入服务器控制台界面;
图2-7 成功登陆服务器ecs-shiyan
2.6安装Python及相关框架
1) 使用如下命令“wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0a1.tar.xz”下载 Python 安装包,并解压;
图2-8 成功解压python安装包
2) 进入Python-3.6.0a1目录下(cd Python-3.6.0a1),执行命令“./configure”(检查、配置),生成“ Makefile”文件后,执行命令“ make && make install ”(编译源码、并将编译结果复制到相应目录中)
图2-9 “./configure”成功生成“ Makefile”文件
图2-10 python安装成功(但是pip安装错误)
3) 查看Python3版本,python3安装成功!
图2-11 python版本Python 3.6.0a1
4) 重新安装pip(由于前面安装提示pip安装错误)
5) 使用命令yum install openssl-devel-y安装openssl-devel包
6) 执行命令make && make install,完成pip安装
图2-12 pip安装成功
7) 使用命令pip3 install --upgrade pip,成功将pip升级到最新版本
图2-13 pip升级成功
8) 使用如下命令安装web.py框架: “pip3 install web.py == 0.40.dev0”
图2-14 web.py安装成功
2.7利用WinSCP上传相关代码
通常情况下,我们在本地Windows操作系统上编辑代码,完成后再上传至ECS弹性云服务器上。WinSCP一个Windows环境下使用的SSH的开源图形化SFTP客户端,同时支持SCP协议。它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。打开浏览器输入WinSCP安装链接:https://winscp.net/eng/docs/lang:chs即可下载。
此外,我们还需要在这一步编写服务所需的相关python代码
2.7.1 main.py文件:主程序
1) 在本地新建一个记事本文件,输入代码如下:
# -*- coding: utf-8 -*-
# filename: main.py
import web
from handle import Handle
urls = ('/wx', 'Handle',)
if __name__ == '__main__':
app = web.application(urls, globals())
app.run()
2) 将该记事本文件另存为,格式如下:
• 文件名:main.py
• 保存类型:所有文件
• 编码:UTF-8
3) main.py主程序用于调用相关方法,启动自动回复消息的程序服务
2.7.2 handle.py文件:定义服务请求、接受、发送、处理等相关方法
1) 在本地新建一个记事本文件,输入代码如下:
# -*- coding: utf-8 -*-
# filename: handle.py
import hashlib
import web
import receive
import time
import os
class Handle(object):
def __init__(self):
self.app_root = os.path.dirname(__file__)
self.templates_root = os.path.join(self.app_root, 'templates')
self.render = web.template.render(self.templates_root)
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "weixin"
list = [token, timestamp, nonce]
list.sort()
s = list[0] + list[1] + list[2]
hashcode = hashlib.sha1(s.encode('utf-8')).hexdigest()
print( "handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return echostr
except (Exception) as Argument:
return Argument
def POST(self):
try:
webData = web.data()
print("Handle Post webdata is:\n", webData)
#打印消息体日志
recMsg = receive.parse_xml(webData)
if isinstance(recMsg, receive.Msg) and recMsg.MsgType == 'text':
toUser = recMsg.FromUserName
fromUser = recMsg.ToUserName
content = "欢迎关注!" + str(recMsg.Content)
print('Reply message info:\n')
print('toUser =', toUser)
print('fromUser = ', fromUser)
print('content = ', content)
return self.render.reply_text(toUser, fromUser, int(time.time()),content)
else:
print("不支持的消息类型:",recMsg.MsgType)
return "success"
except (Exception) as Argment:
return Argment
2) 将该记事本文件另存为,格式如下:
• 文件名:handle.py
• 保存类型:所有文件
• 编码:UTF-8
3) 在handle.py中定义了两类方法,Get方法和Post方法,Get中定义了token的取值,Post方法中定义了对应消息的回复语句,并通过receive.py以及main.py形成相关调用
2.7.3 receive.py文件:定义相关信息处理的类和方法
1) 在本地新建一个记事本文件,输入代码如下:
# -*- coding: utf-8 -*-
# filename: receive.py
import xml.etree.ElementTree as ET
def parse_xml(web_data):
if len(web_data) == 0:
return None
xmlData = ET.fromstring(web_data)
msg_type = xmlData.find('MsgType').text
if msg_type == 'text':
return TextMsg(xmlData)
elif msg_type == 'image':
return ImageMsg(xmlData)
elif msg_type == 'location':
return LocationMsg(xmlData)
elif msg_type == 'event':
return EventMsg(xmlData)
class Event(object):
def __init__(self, xmlData):
self.ToUserName = xmlData.find('ToUserName').text
self.FromUserName = xmlData.find('FromUserName').text
self.CreateTime = xmlData.find('CreateTime').text
self.MsgType = xmlData.find('MsgType').text
self.Eventkey = xmlData.find('EventKey').text
class Msg(object):
def __init__(self, xmlData):
self.ToUserName = xmlData.find('ToUserName').text
self.FromUserName = xmlData.find('FromUserName').text
self.CreateTime = xmlData.find('CreateTime').text
self.MsgType = xmlData.find('MsgType').text
self.MsgId = xmlData.find('MsgId').text
class TextMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.Content = xmlData.find('Content').text
class ImageMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.PicUrl = xmlData.find('PicUrl').text
self.MediaId = xmlData.find('MediaId').text
class LocationMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.Location_X = xmlData.find('Location_X').text
self.Location_Y = xmlData.find('Location_Y').text
class EventMsg(Msg):
def __init__(self, xmlData):
Event.__init__(self, xmlData)
self.Event = xmlData.find('Event').text
2) 将该记事本文件另存为,格式如下:
• 文件名:handle.py
• 保存类型:所有文件
• 编码:UTF-8
2.7.4 reply_text.xml文件:执行信息回复时使用的数据包
1) 新建templates文件夹,在文件夹下新建记事本文件,输入代码如下:
$def with (toUser,fromUser,createTime,content)
<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[$content]]></Content>
</xml>
2) 将该记事本文件另存为,格式如下:
• 文件名:reply_text.xml
• 保存类型:所有文件
• 编码:UTF-8
3) 当用户发送文本消息给公众号时,会产生一个POST请求,开发者可以在响应包(Get)中返回特定XMIL结构,来对该消息进行响应
4) XML文件是公众号需要执行回复消息功能的一个数据包,其中包括了多个参数:
‘ToUserName ’:接收方帐号(收到的OpenID )
‘FromUserName’:开发者微信号
‘CreateTime’:消息创建时间(整型)
‘MsgType’:消息类型,文本为text
‘Content’:回复的消息内容
2.7.5 利用WinSCP上传代码
1) 打开 WinSCP,在界面中输入弹性云主机的弹性公网IP 123.249.65.1、用户名以及密码,确认输入无误后,点击登录;
2) 在本地创建一个名称为wx的文件夹,将上述代码文件拖入到该文件夹中;
3) 用 WinSCP 工具将wx文件夹上传到云服务器的根目录中;
图2-15 文件传输成功
2.8对接微信公众号接口 & 启动服务
1) 使用如下命令python3 main.py 80启动服务。启动成功如图2-16所示
图2-16 服务启动成功
开放80端口启动python微信公众号自动回复消息服务
2) 登录微信公众平台,选择“设置与开发 > 基本配置”,单击“修改配置”;
3) 填写配置信息如图2-17所示,单击“提交”,等待验证 token 成功,单击“启用”;
图2-17 微信公众号配置服务器接口
URL:填写 ECS 上配置的弹性公网 IP,此处应该写:http://123.249.65.1/wx。
Token:需要与 handle.py 中对应 token 取值完全一致,此处为 weixin。
EncodingAESKey:随机生成。
消息加解密方式:选择简单的“明文模式”。
2.8实验结果验证
根据python中的程序设计,对公众号输入任何信息message,公众号都会回复“欢迎关注! + message”如图2-20所示的信息
图2-18 查找公众号
图2-19 根据客户端请求的服务器响应信息
图2-20 公众号自动回复信息
HTTP 是以ASCII 码传输的,建立在TCP/IP 协议之上的应用层规范。HTTP 请求包括:请求行、请求头、消息主体数据。
由图2-19不难看出,handle.py文件根据其定义的Get方法获取并处理客户端的请求,结合xml文件形成需要回复的信息,并保存于变量content,最后Post回复给客户端。最后可见如图2-19中白框里的HTTP -200 OK,表示响应成功。
3、 制作私有镜像搭建 Guestbook
在安装好docker环境的虚拟机中制作 Guestbook的三个镜像:frontend, redis和redisslave,并上传到云容器引擎 CCE 的镜像仓库中,通过私有镜像发布容器服务,搭建 Guestbook留言簿。
3.1实验架构
图3-1 实验架构
容器为App提供独立的、受控的运行环境,是一种轻量级的操作系统虚拟化。
Docker是目前使用最广泛的容器技术,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。利用该技术,可以将一款软件打包成一个标准化的软件开发单元,其中包括软件运行所需的全部内容:代码、运行时间、系统工具和系统库等。Docker能够在任何环境下快速、可靠、一致地部署应用程序。
3.2实验流程
图3-2 实验流程图
3.3创建虚拟私有云VPC
1) 在控制台,在“服务列表”下点击“网络 > 虚拟私有云”,进入网络控制台,点击“创建虚拟私有云”进入创建界面,配置如图2-4、图2-5所示,完成后点击“立即创建”;此处可直接采用上一个实验创建的虚拟私有云VPC
图3-3 直接采用上一个实验创建的VPC
2) 在网络控制台左侧菜单栏中点击“访问控制”下“安全组”进入安全组页面,选择 Sys-default默认安全组进行配置规则。为 Sys-default 安全组添加一条如下图3-4所示的入方向规则,点击“添加规则”。
图3-4 安全组添加入方向规则
3.4创建弹性云服务器 ECS & 安装docker
1) 登录华为云控制台,在“服务列表”下点击“计算 > 弹性云服务器”,进入云服务器控制台,点击购买弹性云服务器ECS,其相关配置如下图3-5所示。
图3-5 弹性云服务器demo-ecs相关配置
2) 利用华为云CloudShell进入刚刚购买的服务器demo-ecs,选择公网登陆,输入密码便可登陆进入服务器控制台界面;
图3-6 成功登录弹性云服务器demo-ecs
3) 利用指令“apt install docker.io”快速安装Docker;
原实验指导书上使用的curl -fsSL get.docker.com -o get-docker.sh指令此处不适用,采用华为云服务器提示提供的指令“apt install docker.io”快速安装
4) 安装完成后利用docker version命令查询到 docker 版本;
图3-7 docker安装成功(检查版本)
3.5制作Guestbook镜像;
制作Guestbook镜像中,需要制作三个镜像:frontend作为前端网页服务镜像,代码逻辑全在Frontend组件内,redis和redisslave负责存储,互为主备。
3.5.1 制作Frontend 组件镜像
1) 分别执行如下命令,新建用于存放frontend组件文件的目录;
mkdir guestbook
cd guestbook
mkdir frontend
cd frontend
2) 新建guestbook.php文件,并填写相关代码到guestbook.php文件中;
使用指令vi guestbook.php新建文件,先按“i”,再在文件中填写代码,退出时先按“esc”,再按“:wq”保存并退出;
图3-8 guestbook.php文件相关代码
3) 新建controllers.js文件,并填写相关代码到controllers.js文件中,具体操作同上;
图3-9 controllers.js文件相关代码
4) 新建index.html文件,并填写相关代码到index.html文件中,具体操作同上;
图3-10 index.html文件相关代码
5) 在当前frontend目录下,利用vi Dockerfile编写Dockerfile文件构建frontend镜像;
图3-11 编写Dockerfile文件
FROM 语句:表示使用 php:5-apache 镜像作为基础。
RUN 语句:表示使用 apt-get 命令来更新软件包列表和安装 Predis。
ADD 语句:将本地代码文件添加到镜像中。
6) 执行“docker build –t frontend .”(此处的指令必须手打)命令制作 frontend 镜像
图3-12 成功制作frontend镜像
3.5.2 制作redis和redisslave镜像
1) 返回guestbook目录下,创建redisslave文件夹;
2) 编写run.sh文件;
图3-13 编写run.sh文件
3) 在当前redisslave目录下,编写redisslave镜像的Dockerfile文件;
图3-14 编写Dockerfile文件
4) 执行命令“docker build –t redisslave .”,制作redisslave的镜像;
图3-15 成功制作redisslave镜像
5) 执行docker images命令,可以查看到已经制作好的guestbook的三个镜像;
图3-16 成功制作redisslave镜像
3.6在CCE上创建集群并添加节点
云容器引擎(Cloud Container Engine,简称CCE)提供高度可扩展的、高性能的企业级Kubernetes集群,支持运行Docker容器。借助云容器引擎,您可以在华为云上轻松部署、管理和扩展容器化应用程序。
1) 在“服务列表”下选择容器服务>云容器引擎 CCE,进入云容器引擎页面;
2) 在云容器引擎“总览”界面,点击“购买 CCE集群”;
3) 创建集群,设置集群参数如下图3-17所示,确认并购买;
图3-17 CCE集群相关配置
原实验指导书上要求创建Kubernetes集群,但现在华为云不提供可以直接创建Kubernetes集群的方法,因此此处直接创建包含Kubernetes生态的CCE集群
4) 等待CCE集群创建成功,成功后如图3-18所示,点击右下角创建节点;
图3-18 CCE集群创建成功
原实验指导书上创建节点是在购买集群的时候创建的,但现在华为云只支持集群创建成功之后才能创建节点
5) 创建节点,设置参数参考如下图3-19所示;
图3-19 CCE集群节点配置
6) 等待一段时间后,CCE集群创建成功。
图3-20 CCE集群创建成功
3.7连接华为云私有镜像仓库并上传镜像
1) 返回云容器引擎控制台,进入“镜像仓库”;
2) 在容器镜像服务中,选择“组织管理”创建组织;
此处创建一个新组织saika_xuan如图3-21所示
图3-21 组织创建成功
3) 组织创建成功后,进入“我的镜像”,单击“客户端上传”。点击弹出对话框中的“生成临时 docker login 指令docker login -u cn-north-4@1IIK1L5253KM6X46XYXX -p abec48bd8cb6e434621a921ab16f941234e15687eaef9db1a701e86870dda335 swr.cn-north-4.myhuaweicloud.com
4) 在云服务器中粘贴docker login指令,成功连接镜像仓库后,执行 docker images 命令,查看到已制作好的三个镜像以及镜像的版本(TAG),现在需要对这三个镜像打上新的标签,然后推送到镜像仓库中。
其使用的相关指令如下:
打标签:
docker tag frontend:latest swr.cn-north-4.myhuaweicloud.com/saika_xuan/frontend:latest
docker tag redisslave:latest swr.cn-north-4.myhuaweicloud.com/saika_xuan/redisslave:latest
docker tag redis:3.0 swr.cn-north-4.myhuaweicloud.com/saika_xuan/redis:3.0
推送:
docker push swr.cn-north-4.myhuaweicloud.com/saika_xuan/frontend:latest
docker push swr.cn-north-4.myhuaweicloud.com/saika_xuan/redisslave:latest
docker push swr.cn-north-4.myhuaweicloud.com/saika_xuan/redis:3.0
图3-22 镜像推送成功
图3-23 华为云平台上可见新的镜像
3.8创建 guestbook 容器工作负载
为已经上传的 guestbook 三个镜像创建容器工作负载,因为三个工作负载有相关性,需要按照顺序进行创建:1.redis;2.redisslave;3.frontend。
1) 进入到云容器引擎控制台,打开“工作负载”界面,点击“创建无状态工作负载”;
2) 创建redis工作负载,填写工作负载基本信息,参数参考如下;
(a) redis工作负载基本配置
(b) redis-master服务
图3-24 创建redis工作负载
3) 点击添加服务,添加 redis-master 服务,设置参数参考如上;
4) 以同样的方式创建 redisslave 工作负载,添加容器中选择 redisslave 镜像。添加服务
中设置服务名称为“redis-slave”,容器端口与访问端口均为“6379”;
5) 返回云容器引擎界面,继续创建 guestbook 无状态工作负载;
其基本配置如上相同,除了镜像选择不同;
6) 添加guestbook服务,设置参数如下
图3-25 创建guestbook服务
7) 返回工作负载列表,可以看到三个工作负载正常工作
图3-26 工作负载正常工作
8) 利用均衡负载的弹性公网IP 114.116.223.174访问网站
图3-27 均衡负载实例
3.9实验结果验证
输入网址 http://114.116.223.174/ 即可打开刚刚搭建好的网站。
图3-28 均衡负载实例
云容器引擎(CCE)提供高度可扩展的、高性能的企业级Kubernetes集群,支持运行Docker容器。借助云容器引擎,这使得我们可以在华为云上轻松部署、管理和扩展容器化应用程序。
由图3-28不难看出,本次实验成功实现了在线留言网站的基础搭建,体现了华为云CCE集群的便捷性、可靠性、高效性。
4、 实验中遇到的问题
4.1微信公众号无法正常回复
在图4-1中,前面的信息没有被成功回复是因为服务器出现问题,经检查相关报错信,发现是因为python的程序handle.py中缩进格式出现问题。Python是强缩进要求的语言,因此不能出现“tab”和“space”混用的情况。
图4-1 微信公众号无法正常回复
4.2工作负载redisslave无法正常启动
第一次创建好redisslave工作负载后,华为云系统上显示该工作负载无法正常使用,经检查其系统日志发现,是因为创建镜像的时候,run.sh文件编写错误,导致无法识别该指令,进而导致系统报错。
图4-2 redisslave工作负载日志
如图4-2所示,在云服务器中将run.sh文件的指令代码“redis-erver”改为“redis-server”,再重新创建镜像,上传至华为云镜像库即可。
但是再次上传后,依旧报送了相同的错误,我认为这可能是再次创建的镜像和之前的名字相同的原因,因此我改变了创建的镜像的名称,成功实现了系统的功能。
5、 创新性内容
利用前文应用的方法,将自己制作的网站html、css和js文件利用WinSCP上传至云服务器端,利用docker进行镜像制作,在打标推送至华为云镜像平台,利用CCE集群生成相关工作负载,并利用弹性负载的弹性公网IP查找便可进入网站。
可见利用华为云容器引擎CCE平台可以十分便捷的实现网站的搭建。
图5-2 个人信息页面
6、 实验总结
通过本次实验,我学会了如何利用华为弹性云服务器ECS搭建简易的微信公众号自回复功能,以及如何利用华为云容器引擎CCE搭建属于自己的简易网站。以上这些犯错的经历,我明白了当在部署服务器的过程中遇到问题时,不用慌张,认真阅读系统给出的错误代码和原因,并根据原因去查找错误的地方,再查询相关资料来解决问题。
通过本次实验,我了解了一个网站应用部署的大致流程,熟悉了linux系统中的一些基础操作,包括如何转到对应的文件夹目录下“cd”,如何从网络上获取相应的数据或文件“wget”,如何利用vi编辑文件等基本指令。
我还理解了docker容器的基本工作原理,学会了如何创建一个个人镜像,以及如何创建一个CCE集群并在上面搭载网站,并在最后成功搭建了一个个人网站。
此外,我还成功创建了一个属于自己的微信公众号平台,并学会了公众号后台开发的一些基本流程和方法,实现了简易的消息自回复功能。
- 点赞
- 收藏
- 关注作者
评论(0)