Tinywebserver项目运行(docker部署mysql)
使用docker中的mysql容器连接Tinywebserver项目
前言
Tinywebserver是github上一个十分优秀的开源项目,帮助初学者学习如何搭建一个服务器.
本文讲述如何在使用docker部署mysql容器的情况下跟该项目进行连接并将项目运行起来,而不是直接使用普通的mysql与该项目连接
主流的运行方式
运行Tinywebserver服务器
运行项目
下面讲述如何把mysql容器和项目进行连接,前提是你需要有一个正在运行的mysql容器.
1.下载项目的源代码
git clone https://github.com/qinguoyi/TinyWebServer.git
2.使用文本编辑器或者Clion打开项目,找到main.cpp
在这个位置,写入你docker中mysql容器的用户名,密码,还有数据库的名字,这里数据库的名字随意.
3.进入mysql容器之中创建一个跟你上面名字一样的数据库(前提是保证你的mysql容器正在运行,可以参考之前的文章)
docker exec -it mysql bash
mysql -u root -p
创建一个数据库
create database yourdb;
USE yourdb;
CREATE TABLE user(
username char(50) NULL,
passwd char(50) NULL
)ENGINE=InnoDB;
INSERT INTO user(username, passwd) VALUES('name', 'passwd');
这样才能跟项目中登陆界面的用户名-密码相匹配.
运行好项目之后,用户的登录名-密码就会存在这个表之中
4.将mysql的容器的ip地址和端口绑定到项目上
在项目中的sql_connection.cpp文件中,定义了数据库的属性IP地址,端口,数据库名,密码等.
然后在项目中的Webserver.cpp中,定义了初始化数据库连接池的函数
其中url默认是 localhost
如果你是直接下载的mysql,而非docker实例化的mysql容器的话,这里的localhost是不需要更改的.
但是如果是docker实例化的mysql容器,我们需要把localhost替换成mysql容器的IP地址
我们可以用如下方式查看容器的IP地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名称或容器ID>
之后就会在控制台上显示一行ip地址,替换localhost即可
接下来我们还要检查一下端口,原项目默认的端口是3306,如果你的mysql容器所占用的端口不是3306的话,你需要也把这里的3306替换成的mysql容器的端口
使用命令
docker ps
即可看到mysql容器对应的端口了
绑定好mysql容器的端口和ip地址之后,接下来的操作就都一样了
5.编译Tinywebserver服务器项目
cd Tinywebserver
sh ./build.sh
这里是用shell解释器,执行build.sh脚本中的shell命令
这个build.sh脚本中只有一行命令,就是【make server】,构建server目标文件
这个地方对应该项目中的makefile文件,接下来我们来分析一下它的makefile文件
不关心这部分的话可以直接跳过这部分内容直接往下看.
makefile
CXX ?= g++
DEBUG ?= 1
ifeq ($(DEBUG), 1)
CXXFLAGS += -g
else
CXXFLAGS += -O2
endif
server: main.cpp ./timer/lst_timer.cpp ./http/http_conn.cpp ./log/log.cpp ./CGImysql/sql_connection_pool.cpp webserver.cpp config.cpp
$(CXX) -o server $^ $(CXXFLAGS) -lpthread -lmysqlclient
clean:
rm -r server
CXX ?= g++:定义了一个变量CXX,并将其默认值设置为"g++",表示编译器的命令。
DEBUG ?= 1:定义了一个变量DEBUG,并将其默认值设置为"1",表示是否开启调试模式。
ifeq ($(DEBUG), 1) 和 else 和 endif:这是一个条件语句块,用于根据DEBUG的值设置CXXFLAGS变量。如果DEBUG的值为1,则将CXXFLAGS设置为"-g",表示开启调试信息;否则,将CXXFLAGS设置为"-O2",表示优化编译。
server: main.cpp ./timer/lst_timer.cpp ./http/http_conn.cpp ./log/log.cpp ./CGImysql/sql_connection_pool.cpp webserver.cpp config.cpp:定义了一个目标"server",它依赖于多个源文件,包括main.cpp、lst_timer.cpp、http_conn.cpp、log.cpp、sql_connection_pool.cpp、webserver.cpp和config.cpp。
$(CXX) -o server $^ $(CXXFLAGS) -lpthread -lmysqlclient:这是生成目标"server"的命令。使用变量$(CXX)表示编译器命令,-o指定输出文件名为"server",$^表示所有依赖文件的列表,$(CXXFLAGS)表示编译器选项,-lpthread和-lmysqlclient表示链接的库文件。
clean: rm -r server:定义了一个目标"clean",用于删除生成的目标文件"server"。通过运行make clean命令,可以执行此命令来清理编译过程中生成的文件。
该Makefile文件的主要作用是定义了编译目标"server"的规则,包括依赖关系和编译选项。通过运行make server命令,可以编译生成名为"server"的可执行文件。而运行make clean命令则可以清理生成的目标文件。
编译时遇到的错误:fatal error: mysql.h: No such file or directory
解决方法:安装链接库
apt-get install libmysqlclient-dev
./server
此时命令是不会退出的,会一直占用控制台.
如果命令直接退出,就是运行失败,此时可以查看项目的日志查看报错信息;在项目中会生成一个serverlog文件
如果该文件中有这样的提示,说明数据库没连接上
你需要检查你的数据库名,密码,IP地址,端口,表结构等信息确保数据库没有问题.
接着在浏览器中输入 ip地址:9006即可进入项目
查看虚拟机的ip地址:
ip addr
端口9006是项目默认的端口
它的位置在Config.cpp文件中,可以自行修改
接下来就可以直接在浏览器中输入 ip:9006运行项目,运行结果如图:
出了这个图代表运行成功了
运行时遇到的一些其他问题
重启mysql容器时发现端口被占用
当我使用命令
docker restart mysql
时,系统提示我这个端口正在使用,重启失败,但是我通过docker ps
查看所有正在运行的容器时,并没有mysql,使用 docker stop mysql也无济于事.
如下是解决方法:
sudo lsof -i :端口号
这样就可以找到占用这个端口号的进程,接下来使用指令
sudo kill 进程号
就可以杀死这个进程,正常使用该端口了
更多推荐
所有评论(0)