centos7通过docker搭建nginx+php环境
以下环境都是基于centos7.9完成。
1.安装docker
yum install docker-ce
说明:这一步,由于centos软件仓库没有收纳docker,需要自己去官网爬文档安装。
安装完成之后,就是启动docker服务以及添加到开机启动。
systemctl enable docker
systemctl start docker
2.拉取镜像
这里是使用的nginx作为web服务
docker pull nginx:1.15
说明:这里nginx:1.15是nginx的1.15版本,这里根据需要来修改,例如需要nginx的1.20版本,这里就是docker pull nginx:1.20
查看拉取的镜像是否成功
docker images ls
如果成功,就可以看到拉取的nginx 的1.15版本的一条记录。
3.创建docker内建网络
docker network create -d bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 docker-net
参数说明:
-d: 网络驱动类型,
–subnet: 子网网段以及掩码
–gateway:子网网关
docker-net: 这是创建的网络的名称,根据自己喜好进行定义。
查看docker 网络命令
docker network ls
查看某个指定的网络信息
docker network inspect <network name| network id>
4.创建docker容器
sudo docker run \ --name nginx1 \ -d \ --restart always \ --network docker-net \ --ip 172.18.0.2 \ -p 8080:8080 \ -v /home/sqm/documents/workspaces/wwwroot:/var/www/html \ -v /home/sqm/documents/dockerconfig/nginx1/nginx.conf:/etc/nginx/nginx.conf \ -v /home/sqm/documents/dockerconfig/nginx1/conf.d:/etc/nginx/conf.d/ \ -v /home/sqm/documents/dockerconfig/logs/nginx1:/var/logs/nginx \ nginx:1.15
参数说明:
–name: 容器名称,根据喜好自定义
-d : 后台运行
–restart: 启动类型
–network: 使用的docker网络名,这里是需要使用docker网络中存在的网络名称
–ip: 指定该容器绑定的ip,这里建议绑定,否则容器重启,可能出现容器的IP发生改变的情况
-p: 端口映射,宿主机端口: docker容器端口
-v: 文件或文件夹映射,宿主机路径:docker容器内部路径
nginx:1.15: 使用的镜像名称以及版本
补充说明:部分容器可能会出现需要设置容器内部软件的启动命令,例如redis容器中redis启动,命令如下:
sudo docker run \ --name redis \ -d \ --restart=always \ --network docker-net \ --ip 172.18.0.5 \ -p 6379:6379 \ --log-opt max-size=100m \ --log-opt max-file=2 \ -v /home/sqm/documents/dockerconfig/redis/redis.conf:/etc/redis/redis.conf \ -v /home/sqm/documents/workspaces/redisdata:/data \ -v /home/sqm/documents/dockerconfig/logs/redis:/var/log/redis \ redis:latest \ redis-server /etc/redis/redis.conf
最后一行的命令就是设置在容器启动的时候,就执行redis启动的命令。
查看容器的ip命令:
docker inspect <container_id || container_name>
5.创建php容器
sudo docker run \ --name php72 \ -d \ --restart always \ --network docker-net \ --ip 172.18.0.3 \ -p 9000:9000 \ -v /home/sqm/documents/workspaces/wwwroot:/var/www/html \ -v /home/sqm/documents/dockerconfig/php7.2/php-fpm.conf:/usr/local/php/etc/php-fpm.conf \ -v /home/sqm/documents/dockerconfig/php7.2/www.conf:/usr/local/php/etc/php-fpm.d/www.conf \ -v /home/sqm/documents/dockerconfig/php7.2/php.ini:/etc/php.ini \ -v /home/sqm/documents/dockerconfig/logs/php:/var/log/php \ php:7.2-fpm
如果缺少拓展,可以去https://pecl.php.net/ 下载需要的拓展,然后进行安装。以下以swoole作为例子:
docker cp swoole.6.1.2 php72:/usr/src/php/ext/swoole
将解压出来的swoole目录复制到php72容器中的/usr/src/php/ext/下,并重命名为swoole。
docker exec -it php72 bash
进入到php72容器中
/usr/local/bin/docker-php-ext-install swoole
在容器中执行的命令,意思是将swoole编译安装并加入到php中。
6.mysql安装
至于mysql 建议在宿主机上进行安装。
6.1 添加源
http://repo.mysql.com/ 这个地址去查找对应的源 这里下载的是mysql57-community-release-el7-9.noarch.rpm
6.2.安装
sudo yum -y install mysql-community-server
6.3.出现如下错误
Failing package is: mysql-community-common-5.7.43-1.el7.x86_64
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
说明是key过期了,需要更新
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
6.4.启动
systemctl start mysqld
systemctl enable mysqld
6.5. 初始密码
方法一:sudo cat /var/log/mysqld.log | grep “password” 查看
方法二:vim /etc/my.cnf 添加在[mysqld]下面 skip-grant-tables
然后重启服务
6.6.登录 mysql -u root -p
6.7.用命令修改密码 alter user ‘root’@‘localhost’ identified by ‘Admin123!@#’; 用方法二重置密码的,需要重新去配置文件中将添加的配置注释或者删除
特别说明:以上的命令中的本机映射路径,最好提前创建好,否则会出现在容器搭建完成,容器无法启动而报错的问题,如果是配置文件,最好提前拿到并放到指定的地方。
至此整个环境安装完成。
如果需要做数据库的主从,可以研究一下mysql的docker容器的安装。
熟悉了上面的环境,可以在虚拟机中搭建一个简易的负载均衡的环境,本机nginx + 2个docker-nginx +
1个docker-php容器。 在本机nginx上配置负载均衡的策略,将连接转发到2个docker-nginx中。
以下是自己在做这套环境的时候,做的记录,特此记录,以备后续可能会使用到。
vmware workstation 下载地址:https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0
提前安装宿主机的nginx,下载php的源码安装包,redis源码包,主要是需要这三个的配置文件mkdir -p /home/sqm/documents/workspaces/wwwroot mkdir -p
/home/sqm/documents/dockerconfig/nginx1 mkdir -p
/home/sqm/documents/dockerconfig/nginx2 mkdir -p
/home/sqm/documents/dockerconfig/logs/nginx1 mkdir -p
/home/sqm/documents/dockerconfig/logs/nginx2 mkdir -p
/home/sqm/documents/dockerconfig/php7.2 mkdir -p
/home/sqm/documents/dockerconfig/logs/php mkdir -p
/home/sqm/documents/dockerconfig/redis mkdir -p
/home/sqm/documents/workspaces/redisdata mkdir -p
/home/sqm/documents/dockerconfig/logs/redis安装docker yum -y install docker-ce 查找自己需要的镜像 docker search nginx:ver
#ver 是版本号 拉取镜像 docker pull nginx:1.15 #这里拉取nginx1.15的版本 创建docker 需要的网络 docker network create -d bridge --subnet 172.18.0.0/16 --gateway
172.18.0.1 docker-net 创建docker容器 sudo docker run
–name nginx1
-d
–restart always
–network docker-net
–ip 172.18.0.2
-p 8080:8080
-v /home/sqm/documents/workspaces/wwwroot:/var/www/html
-v /home/sqm/documents/dockerconfig/nginx1/nginx.conf:/etc/nginx/nginx.conf
-v /home/sqm/documents/dockerconfig/nginx1/conf.d:/etc/nginx/conf.d/
-v /home/sqm/documents/dockerconfig/logs/nginx1:/var/logs/nginx \ nginx:1.15sudo docker run
–name nginx2
-d
–restart always
–network docker-net
–ip 172.18.0.4
-p 8081:8081
-v /home/sqm/documents/workspaces/wwwroot:/var/www/html
-v /home/sqm/documents/dockerconfig/nginx2/nginx.conf:/etc/nginx/nginx.conf
-v /home/sqm/documents/dockerconfig/nginx2/conf.d:/etc/nginx/conf.d/
-v /home/sqm/documents/dockerconfig/logs/nginx2:/var/logs/nginx \ nginx:1.15查看容器ip docker inspect <container_id || container_name>
sudo docker run
–name php72
-d
–restart always
–network docker-net
–ip 172.18.0.3
-p 9000:9000
-v /home/sqm/documents/workspaces/wwwroot:/var/www/html
-v /home/sqm/documents/dockerconfig/php7.2/php-fpm.conf:/usr/local/php/etc/php-fpm.conf
-v /home/sqm/documents/dockerconfig/php7.2/www.conf:/usr/local/php/etc/php-fpm.d/www.conf
-v /home/sqm/documents/dockerconfig/php7.2/php.ini:/etc/php.ini
-v /home/sqm/documents/dockerconfig/logs/php:/var/log/php \ php:7.2-fpmsudo docker run
–name redis
-d
–restart=always
–network docker-net
–ip 172.18.0.5
-p 6379:6379
–log-opt max-size=100m
–log-opt max-file=2
-v /home/sqm/documents/dockerconfig/redis/redis.conf:/etc/redis/redis.conf
-v /home/sqm/documents/workspaces/redisdata:/data
-v /home/sqm/documents/dockerconfig/logs/redis:/var/log/redis \ redis:latest \ redis-server /etc/redis/redis.confcp /etc/nginx/nginx.conf /home/sqm/documents/dockerconfig/nginx1/ cp
-r /etc/nginx/conf.d /home/sqm/documents/dockerconfig/nginx1/ 同理,将配置文件复制到nginx2中 注意:nginx1和nginx2中有个地方需要修改,在default.conf文件中:
/scripts$fastcgi_script_name; => d o c u m e n t r o o t document_root documentrootfastcgi_script_namephp容器中安装拓展
1.下载拓展包 地址https://pecl.php.net/,查找需要的。
2.将下载的包放到宿主机中,并且解压开来。
3.在宿主机中将解压开来的文件夹移动到php容器中指定位置 docker cp swoole.6.1.2 php72:/usr/src/php/ext/swoole
4.进入到容器中,使用命令进行安装 /usr/local/bin/docker-php-ext-install swoole
5.安装gd库 docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/centos7 安装mysql 1 添加源 http://repo.mysql.com/ 这个地址去查找对应的源
这里下载的是mysql57-community-release-el7-9.noarch.rpm
2.安装 sudo yum -y install mysql-community-server3.出现如下错误 Failing package is: mysql-community-common-5.7.43-1.el7.x86_64 GPG Keys are configured
as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 说明是key过期了,需要更新 rpm
–import https://repo.mysql.com/RPM-GPG-KEY-mysql-20224.启动 systemctl start mysqld systemctl enable mysqld
5. 初始密码 方法一:sudo cat /var/log/mysqld.log | grep “password” 查看 方法二:vim /etc/my.cnf 添加在[mysqld]下面 skip-grant-tables 然后重启服务
6.登录 mysql -u root -p
7.用命令修改密码 alter user ‘root’@‘localhost’ identified by ‘Admin123!@#’; 用方法二重置密码的,需要重新去配置文件中将添加的配置注释或者删除出现ssl过期的问题: yum install ca-certificates -y 或 update-ca-trust extrac
连接数据库出现 QLSTATE[HY000] [2002] No such file or
directory错误:将host的localhost 改成127.0.0.1 SQLSTATE[HY000]: General
error: 1364 Field ‘date’ doesn’t have a default val 解决办法:
在配置文件中将sql-mode="STRICT TRANS TABLES,NO AUTO CREATE USER,NO ENGINE
SUBSTITUTION"注释,
没有就不管,然后重新加入一行sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION。重启服务php gd库添加freetype
1.下载freetype 并安装
2.进入到php源码目录下的ext目录的gd目录 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config --with-jpeg-dir=/usr/include --with-png-dir=/usr/include --with-freetype-dir=/usr/include/ --with-zlib-dir --with-gd sudo make sudo make install
相关文章:
centos7通过docker搭建nginx+php环境
以下环境都是基于centos7.9完成。 1.安装docker yum install docker-ce 说明:这一步,由于centos软件仓库没有收纳docker,需要自己去官网爬文档安装。 安装完成之后,就是启动docker服务以及添加到开机启动。 systemctl enable do…...
Node.js 学习笔记
小插件Template String Converter 当输入${}时,自动为其加上 反引号 一、node入门 node.js是什么 node的作用 开发服务器应用 开发工具类应用 开发桌面端应用 1.命令行工具 命令的结构 常用命令 切换到D盘——D: 查看D盘目录——dir 切换工作目录——c…...
RabbitMQ之发布确认高级
RabbitMQ之发布确认高级 一、发布确认 SpringBoot 版本1.1 确认机制方案1.2 代码架构图1.3 配置文件1.4 添加配置类1.5 消息生产者1.6 回调接口1.7 消息消费者1.8 结果分析 二、回退消息2.1 Mandatory 参数2.2 消息生产者代码2.3 回调接口2.4 结果分析 三、备份交换机3.1 代码架…...
lv5 嵌入式开发-10 信号机制(下)
目录 1 信号集、信号的阻塞 2 信号集操作函数 2.1 自定义信号集 2.2 清空信号集 2.3 全部置1 2.4 将一个信号添加到集合中 2.5 将一个信号从集合中移除 2.6 判断一个信号是否在集合中 2.7 设定对信号集内的信号的处理方式(阻塞或不阻塞) 2.8 使进程挂起(…...
【postgresql】 ERROR: multiple assignments to same column “XXX“
Cause: org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: multiple assignments to same column "XXX"; 原因:or…...
一文读懂Llama 2(从原理到实战)
简介 Llama 2,是Meta AI正式发布的最新一代开源大模型。 Llama 2训练所用的token翻了一倍至2万亿,同时对于使用大模型最重要的上下文长度限制,Llama 2也翻了一倍。Llama 2包含了70亿、130亿和700亿参数的模型。Meta宣布将与微软Azure进行合…...
完整指南:如何使用 Node.js 复制文件
文件拷贝指的是将一个文件的数据复制到另一个文件中,使目标文件与源文件内容一致。Node.js 提供了文件系统模块 fs,通过该模块可以访问文件系统,实现文件操作,包括拷贝文件。 Node.js 中文件拷贝方法 在 Node.js 中,有…...
ElementUI - 主页面--动态树右侧内容管理
一.左侧动态树 1.定义组件 ①样式&数据处理 <template><el-menu class"el-menu-vertical-demo" background-color"#334157"text-color"#fff" active-text-color"#ffd04b" :collapse"collapsed" router :def…...
全国排名前三的直播公司无锋科技入驻天府蜂巢成都直播产业基地
最近,全国排名前三的直播公司——无锋科技,正式宣布入驻位于成都的天府蜂巢直播产业基地,这一消息引起了业内人士的高度关注。成都直播产业基地一直是中国直播产业的重要地标之一,其强大的技术和资源优势为众多直播公司提供了广阔…...
机器人中的数值优化|【五】BFGS算法非凸/非光滑处理
机器人中的数值优化|【五】BFGS算法的非凸/非光滑处理 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化࿰…...
ESP32S3的MPU-6050组件移植教程
前言 (1)实习公司要搞ESP32BOX的驱动移植,所有资料自己找还是比较折磨人的现在我分享几个官方的组件移植资料: <1>Find the most exciting ESP-IDF components(ESP32的官方组件都可以在里面查,按照他…...
excel筛选后求和
需要对excel先筛选,后对“完成数量”进行求和。初始表格如下: 一、选中表内任意单元格,按ctrlshiftL,开启筛选 二、根据“部门”筛选,比如选择“一班” 筛选完毕后,选中上图单元格,然后按alt后&…...
pyspark 检测任务输出目录是否空,避免读取报错
前言 在跑调度任务时候,有时候子任务需要依赖前置任务的输出,但类似读取 Parquet 或者 Orc 文件时,如果不判断目录是否为空,在输出为空时会报错,所以需要 check 一下,此外Hadoop通常在写入数据时会在目录中…...
「网页开发|前端开发|Vue」10 vuex模块化:将数据划分成不同modules分别管理
本文主要介绍如何使用vuex的modules将状态数据根据不同模块进行划分并分别管理以及如何使用mapGetters快速将状态管理中的数据导入成local变量。 文章目录 本系列前文传送门一、场景说明二、使用modules划分不同模块三、使用Getters获取状态管理数据Getter传参mapGetters 辅助…...
苹果CMS插件-苹果CMS全套插件免费
网站内容的生成和管理对于网站所有者和内容创作者来说是一个挑战。有一些强大的工具可以帮助您轻松地解决这些问题。苹果CMS插件自动采集插件、采集发布插件以及采集伪原创发布插件,是这些工具之一。它们不仅可以极大地节省您的时间和精力,还可以提高您网…...
域环境介绍
一、概述 内网也指局域网,指的是某个区域由多台计算机互连而成的计算机组,范围通常在数千米以内,在局域网中,可以实现文件管理,应用软件共享,打印机共享、工作组内的日程安排、电子邮件和传真通信服务等&a…...
地球同步静止轨道上的中国卫星
3万6千公里地球同步静止轨道上的中国控制的卫星(包括香港属非国产平台卫星、外国属中国平台卫星),共80颗;截止到2023年8月3日,共有563颗在轨卫星。 号定位名称发射时间用途重量1141.1W中星1C(FH2C)2015.12.10DFH4平台…...
HAProxy代理TCP(使用HAProxy 为TiDB-Server 做负载均衡)
目录 一、使用HAProxy 为TiDB-Server 做负载均衡环境1、创建文件夹2、配置haproxy.cfg3、创建 docker-compose.yaml 文件haproxy.cfg 配置说明[参照官方文档](https://pingcap.com/docs-cn/v3.0/reference/best-practices/haproxy/ "参照官方文档") 一、使用HAProxy …...
全新自适应导航网模板 导航网系统源码 网址导航系统源码 网址目录网系统源码
高价值目录网导航网整站源码 | 2999元价值,最新版本源码下载推荐 1、导航网一键获取目标站SEO信息,7.5版本增加会员中心一键获取网站信息网站权重,增加小程序提交发布,全新自适应模板; 2、可设置游客提交、游客提交人工审核,会员免审提交,会员提交人工审核,VIP会员免…...
无人直播间
失败!! 采用 ffmpeg 技术进行推流 推流代码: 【需要将rtmp替换为你的推流地址】 ffmpeg -re -stream_loop -1 -i "rain.mp4" -c copy -f flv ""推流地址获取 以哔哩哔哩为例 点击下方链接 开播设置 - 个人中心 - …...
Linux 服务器防止 ssh 暴力密码登录破解之使用 fail2ban
前言,网络安全越来越重要,如何保证网站安全至关重要,在使用 Linux 服务器时,如果未设置有效安全登录屏障,每日将会有数百甚至数万次的密码暴力尝试登录,本篇章将介绍两种 Linux 登录安全防护 一࿱…...
第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 D: 合并数列
[蓝桥杯 2023 国 B] 合并数列 【问题描述】 小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案,分别将他们列为两个数组 { a 1 , a 2 , ⋯ a n } \{a_1, a_2, \cdots a_n\} {a1,a2,⋯an} 和 { b 1 , b 2 , ⋯ b m } \{b…...
ChatGPT必应联网功能正式上线
今日凌晨发现,ChatGPT又支持必应联网了!虽然有人使用过newbing这个阉割版的联网GPT4,但官方版本确实更加便捷好用啊! 尽管 ChatGPT 此前已经展现出了其他人工智能模型无可比拟的智能,但由于其训练数据的限制ÿ…...
DETR中的问题汇总(代码)
一、讲述一下torch.tensor()和torch.as_tensor()的区别 torch.tensor() 和 torch.as_tensor() 都是 PyTorch 中用于创建张量(Tensor)的函数,但它们有一些区别,主要涉及到张量的内存管理方式和数据拷贝。以下是它们的主要区别&…...
华为云云耀云服务器L实例评测|使用华为云耀云服务器L实例的CentOS部署Docker并运行Tomcat应用
目录 前言 步骤1:登录到华为云耀云服务器L实例 步骤2:安装Docker 并验证Docker安装 步骤3:拉取Tomcat镜像并运行Tomcat容器 步骤4:放行8080端口 步骤5:访问tomcat 步骤6:管理Tomcat容器 小结 前言 …...
Java基础---第八篇
系列文章目录 文章目录 系列文章目录一、a=a+b与a+=b有什么区别吗?二、try catch finally,try里有return,finally还执行么?三、Excption与Error包结构一、a=a+b与a+=b有什么区别吗? += 操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果…...
(附源码)springboot体检预约APP 计算机毕设16370
目 录 摘要 1 绪论 1.1开发背景 1.2研究现状 1.3springboot框架介绍 1.4论文结构与章节安排 2 Springboot体检预约APP系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1 数据添加流程 2.2.2 数据…...
Spring的注解开发-@Component的三个衍生注解
由于JavaEE开发是分层的(三层架构体系,控制层、服务层、持久层),为了每层Bean标识的注解语义化更加明确,Component又衍生出以下三个注解 注解用途Repository(仓库)标识持久层(DAO&am…...
无线WIFI工业路由器可用于楼宇自动化
钡铼4G工业路由器支持BACnet MS/TP协议。BACnet MS/TP协议是一种用于工业自动化的开放式通信协议,被广泛应用于楼宇自动化、照明控制、能源管理等领域。通过钡铼4G工业路由器的支持,可以使设备间实现高速、可靠的数据传输,提高自动化水平。 钡…...
基于长短期神经网络铜期货价格预测,基于LSTM的铜期货价格预测,LSTM的详细原理
目录 背影 摘要 代码和数据下载:基于长短期神经网络的铜期货开盘价格预测,基于长短期神经网络的铝价格期货开盘价预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88230626 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM…...
个人购买域名做企业网站/厦门网站制作
nginx -s reload :修改配置后重新加载生效nginx -s reopen :重新打开日志文件nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确关闭nginx:nginx -s stop :快速停止nginx quit :完整有序的停止nginx其他的停…...
广扬建设集团网站/微商引流一般用什么软件
本文来源于dotNET全栈开发说起命令行终端,即便不是搞编程开发的也都略知一二。在昨天的Build 2020开发者大会上,微软公布了Windows Terminal 1.0的正式版本,这就是一个全新的、功能强大的命令行终端工具,在此前长达一年的预览期间…...
网站开发vs2013/今日新闻最新头条
在 09/11/2020 时,我们再次遇到该错误 问题描述 我们再次遇到该问题,发现导致异常的原因并不是 Matcher 没有匹配到内容。如下代码可以重现错误: pipeline {agent anystages {stage(xterm testing) {steps {script {def pageContent "&…...
php网站开发 课程介绍/衡水seo排名
LTH7R座充充电管理 IC 一、 概述 LTH7R.是恒流/恒压座充充电器芯片,主要应用于单节锂电池充电。无需外接检测电阻,其内部为 MOSFET 结构,因此无需外接反向二极管。 LTH7R.在大功率和高环境温度下可以自动调节充电电流以限制芯片温度。它的充电…...
风铃网站具体是做那方面的/北京网站优化公司
在Linux当中有一些命令只有root账户才能使用,怎么样才能使普通的用户可以执行root权限的命令呢,就是要使用一个名字叫做sudo的命令,下面是对sudo命令的一些介绍sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,…...
做网站新闻/网站关键词优化方案
又是汉诺塔~ 回顾一下汉诺塔的移动过程。 从左到右设为A,B,C 3个盘子的时候 1: No.1 A -> C 2: No.2 A -> B 3: No.1 C -> B 4: No.3 A -> C 5: No.1 B -> A 6: No.2 B -> C 7: No.1 A -> C .把第n个盘子移动到C前,第n-1个盘子要移动到…...