docker web mysql_在 Docker 中完整部署 Web 应用

2023-10-26

原标题:在 Docker 中完整部署 Web 应用

一个完整的 Web 应用包含前端页面、数据库、后台逻辑等,按照一般流程去构建需要配置 Nginx、MySQL,以及后台服务器,运维涉及到的部分十分复杂。而 Docker 可以将这些东西(数据+服务)封装起来,虽然有些场合不建议数据和服务放在一起。本文就在一个 Docker 容器中完整部署整个 Web 应用的需求作详细的介绍。

‌‌

作者简介:外号夫子,长于长江之上「梨花岛」,总喜欢一个江湖的传说,如果你偶然记起关于「桃花岛」黄药师的传说,记得划船来找我。个人博客:fuzhii.com。其他博文《换个timeline看知乎》,《用机器学习的方法鉴别红楼梦作者》。

本文举例的 Web 应用为 『top-topic-Zhihu』(换个 timeline 看知乎),抓取「知乎」网站每天新提出的热门 top10 问题聚合显示,提供另一种看知乎的姿势,不被纷繁的 timeline 所迷惑。

项目地址:https://github.com/Huangtuzhi/top-topic-Zhihu Dockerfile 和依赖文件:https://github.com/Huangtuzhi/docker-toptopic 云服务商选择『灵雀云』提供容器服务:http://www.alauda.cn/ 镜像地址:https://hub.alauda.cn/repos/huangtuzhi/docker-toptopic Web页面展示:http://toptopic-huangtuzhi.myalauda.cn:19991/ 『top-topic-Zhihu』应用结构

需要这几步来完成目标:

“ 抓取——> 存储( 数据持久化) ——> 分析——> 展示

抓取:抓取部分主要是爬虫,先手动输入验证码获取登录 Cookie。然后带着该 Cookie 模拟发出 Get 请求来获得网页数据。思路是从自己的个人主页开始爬,先爬出现在主页 timeline 上的所有人,再爬这些人主页上的其他人…,直到数据量足够大。把人的 ID 存储在 people 中。接着继续爬 people 中所有人主页上提出的问题,并获得问题的关注人数和提问时间。把抓取到的问题存储在 question 中。

存储:存储可以把上面的 people,question 写入文本或者 MySQL 数据库。中间数据也应该放到数据库中,不然内存会被无穷多的递归生成的中间数据填满。本项目使用带主键的 MySQL 表模拟内存 set 来存储 people。

分析:网站目的是获取每天或者一个时间段内新提出的 top10 热门问题,所以需要对时间过滤,对关注人数排序。这都可以在 SQL 查询中完成。

展示:展示包括后台和前端两部分,后台需要在 DB 中取得数据构造成 JSON 格式以 CGI 的形式提供给前端调用。这里使用 Python Flask 框架提供 CGI 后台服务。前端页面主要是跨域 AJax 请求后台 CGI 来获得数据,结合定义的模板来展示页面。在版本 V1 中使用 AngularJS 来简单的编写模板及 AJax 请求的逻辑部分,在版本 V2 中使用 artTemplate 和封装原生的 JS 来满足需求。

文件目录

整个 Web 应用的目录结构如下所示:

f9253363ab8f2eec1b4a1d25bc8f6555.png

Dockerfile

Dockerfile 描述了容器的依赖和进行构建的步骤,下面会逐步解释语句的含义。

37e9fbdcad6c92f2bb6c968338c9fc62.png

ba648e5b3adf4a77f86a747047bb6359.png

MySQL 安装和配置

MySQL 服务器只需要用包管理器安装 mysql-server-5.6,因为后台使用 Python 作为服务器语言,还需要安装 MySQL 对 Python 语言的支持。需要使用 apt 安装 python ,libmysqlclient-dev 和 python-dev,然后使用 pip 管理器安装 MySQL-python。

MySQL 的默认字符集为 latin1,而网页显示一般是 utf8 字符集,需要将 MySQL 的配置文件的字符集置为 utf8。

使用命令

将本地已修改好的配置文件覆盖 Docker 中的 MySQL 配置文件。查看字符集

b86a80ddb352f3c64d48eef7c7f4ac20.png

若字符集如上所示,则说明已经修改成功。

MySQL 的坑

在上面的 Dockerfile 中看到分别给'root'@'127.0.0.1'和'root'@'localhost'都加了权限,'root'@'localhost'的权限在 SQL 语句最后才加上。这是因为

使用'root'@'localhost'没权限建数据库和表,报错

Access denied for user ‘root’@’localhost’ (using password: No)

使用 'root'@'127.0.0.1'进入 Docker 后没权限连接 Mysql,报错

Access denied for user ‘root’@’localhost’ (using password: YES)

于是这里用'root'@'127.0.0.1'来建数据库和表,最后再用'root'@'localhost'来连接数据库。

Nginx 安装和配置

Nginx 在这里作为静态页面的服务器,安装只需要用 apt 管理器安装即可。

Nginx 需要配置 root 目录来指定网站的文件位置,把本地的 global.conf和nginx.conf文件覆盖到 Docker 中。

在 global.conf 中我们指明服务器根目录为/usr/share/nginx/html/www

418416fe53b8b71ce4e869fda6183f41.png

在 Docker 中,我们将网站文件放到新建的 /home/toptopic/web/www目录。这里建立一个软链接将它们关联起来,便于修改和维护。

EXPOSE 两个端口

EXPOSE 在 Docker 中用来限制开放的端口。我们使用 Nginx 来提供静态页面访问,使用 Flask 框架来提供动态页面数据的获取,所以需要开放两个端口。

查询端口状态,可以看到宿主机 2333 端口被映射到 Docker 的 2333 端口,宿主机 5000 端口被映射到 Docker 的 5000 端口。

d9959dc6894a38162eb527326f6ddcd2.png

2223 端口与上节中的 Nginx 中设定的端口必须保持一致,因为 Nginx 使用 2223 端口提供服务,Docker 刚好必须把这个端口开放出去。

在基于 Flask 框架写的后台服务 dataCGI.py 中,服务器对应的监听地址为

host 必须设置为 0.0.0.0,表示监听所有的 IP 地址。如果 host 使用 127.0.0.1,在容器外将无法访问服务。同时,这里的端口 5000 和 Dockerfile 中开放的另一个端口一致。

启动脚本

在 Dockerfile 中的 CMD 中可以指定 Docker 运行时执行一些命令。

这三行分别启动 MySQL,Nginx 和后台服务。

构建命令

构建 Docker 容器

运行容器

需要注意的是若使用

无法启动 CMD 中的脚本命令,这是因为在 docker run 后指定了 /bin/bash 后会覆盖 CMD 中的命令。

在云平台上部署

在「灵雀云」上部署一个 Docker 应用需要两步:构建——创建服务。

e73c16e8f107e9f4989cee72d19faca9.png

点击「构建」——「创建镜像构建仓库」,然后选择 Github 仓库源。需要把预先写好的 Dockerfile 放在 Github中。

f4641b049d68d195ef3c58d68ba21792.png

构建好仓库之后,点击「创建服务」。

进行服务的设置,高级设置中服务地址类型选为 tcp-endpoint 即可(外部用户可以直接通过 TCP 方式访问这个服务地址,服务地址的端口是随机分配的,一般会大于 10000 小于 65535)。

最后点击最下方的「创建服务」完成部署。新建的服务如下所示:

7dde5e10e8e644a020beff5682c761ec.png

在浏览器中输入,或点击『阅读原文』即可访问网站。返回搜狐,查看更多

责任编辑:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker web mysql_在 Docker 中完整部署 Web 应用 的相关文章

  • 从0开始使用vue-element-admin

    目录 安装node js及npm 安装nrm 安装vscode 汉化 推荐安装一些好用的扩展 安装vue element admin 框架登陆原理简单分析 本教程经亲测支持最新版4 0 1vue element admin 安装node j
  • RabbitMQ宕机后,消息100%不会丢失吗

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 这篇文章 给不太熟悉MQ技术的同学 介绍一个生产环境中可能会遇到的问题 目前为止 你的RabbitMQ部署在线上服务器了 对吧 然后订单服务和仓储服务都可以基于Rab
  • 统计学习方法笔记(二)感知机

    感知机于1957年由Rosenblatt提出 是一种线性分类模型 属于判别模型 直接学习判别函数 是神经网络和支持向量机的基础 对于感知机的学习推导首先要知道他的模型是什么 然后是学习策略 损失函数 最后是学习算法 1 感知机的模型 假设空
  • vue设置全局时间格式化

    vue前台需要用户能看得懂的时间格式如常见的 2021 03 10 12 02 35 但是后台数据库则需要时间格式如LocalDateTime 2021 03 10T15 31 01 或者Date类型的 如果数据不经过处理 直接显示 肯定可
  • 如何在Windows上搭建web站点,并发布到公网?1-1

    系列文章 Windows用户如何安装使用cpolar内网穿透工具 如何在Windows上搭建web站点 并发布到公网 1 1 如何在Windows上搭建web站点 并发布到公网 2 2 如何在Windows下搭建WordPress博客站点
  • maven 引入qrcode.jar

    mvn install install file Dfile e QRCode jar DgroupId QRCode DartifactId QRCode Dversion 3 0 Dpackaging jar 3 在pom xml中增加
  • 逆变器STM32储能逆变器 BOOST 全桥 基于STM32F103设计,具有并网充电、放电

    逆变器STM32储能逆变器 BOOST 全桥 基于STM32F103设计 具有并网充电 放电 并网离网自动切换 485通讯 在线升级 风扇智能控制 提供过流 过压 短路 过温等全方位保护 基于arm的方案区别于dsp 有PCB 原理图及代码
  • 图像质量评估指标——SSIM介绍及计算方法

    图像质量评估指标 SSIM介绍及计算方法 SSIM全称为Structural Similarity 即结构相似性 用于评估两幅图像相似度的指标 常用于衡量图像失真前与失真后的相似性 也用于衡量模型生成图像的真实性 如图像去雨 图像去雾 图像
  • vue 集成ag-grid 组件,通过筛选条件操作列显示与隐藏

    关键代码 this columnApi setColumnVisible item false 此处item的位置 为ag grid列数据里面的colid 如无此项 可以用field的值来代替
  • 使用IBM SPSS Modeler进行随机森林算法预测

    IBM SPSS产品系列最主要的两款软件为IBM SPSS Statistics和IBM SPSS Modeler IBM SPSS Statistics主要用于统计分析 如均值比较 方差分析 相关分析 回归分析 聚类分析 因子分析 非参数
  • GDB交叉编译与问题解决

    GDB使用 交叉编译 Program received signal SIGILL Illegal instruction Program received signal SIGPIPE Broken pipe 交叉编译 bin bash
  • Linux项目实战——五子棋(单机人人对战版)

    Linux操作系统项目实战 五子棋 GIF 目录 Linux操作系统项目 五子棋 一 问题导引 二 实现要求 三 五子棋原理 1 落子数据信息保存载体 2 落子思路 3 判断 五子连珠 四 项目实现步骤 创建目录及文件 1 在Linux环境
  • 两个sed小技巧

    在写shell时使用sed处理一些输出 遇到两个问题 在网上找到了相应的解决办法 在此处备份一下 sed处理空字符 空字符 它的ASCII码值为0 在sed中如何标识空字符呢 看下面的例子 find print0 sed e s x0 n
  • 树(Tree)——(五)搜索二叉树的节点删除和销毁

    目录 节点删除的三种情况 第一种情况 第二种情况 第三种情况 代码实现 main函数 节点删除的三种情况 节点删除总共分成三种情况 第一种情况 若为叶子节点则直接删除 如左图节点1 3 8或者右图的1 4 8 若为单独一个根叶子要单独处理
  • WaveDrom 使用指南

    原文链接 WaveDrom 使用指南
  • Seventh season fifteenth episode,Joey got a new brain??????

    Scene Monica and Chandler s Monica Chandler Ross and Rachel are sitting around the table Monica I m glad you re here we
  • VMWARE修改CPUID

    在cmd shell下执行wmic cpu get ProcessorId命令 可是查看机器的cpuID 但这个命令显示的只是2组ID 实际CPUID 有4组 通过更改虚拟机配置文件 vmx可是实现任意cpu序列号的指定 而且重启虚拟机后c
  • html怎么在网页中加滚动条,在html中如何加滚动条?滚动条的用法!

    随着经济和科技的发展 互联网的大趋势造就了很大的就业机会 而且在我们日常的生活中大家多多少少会去浏览一些网站和网页吧 那么今天呀 我们就来说说在html中如何加滚动条 和一些有关于滚动条的用法 的经验分享 1 首先我们打开我们的前端的开发工
  • Docker安装Elasticsearch的遇到的那些坑

    1 根据百度到的一篇文章 https segmentfault com a 1190000004376504下载其最新镜像 hangxin1940 docker elasticsearch cn v2 1 0 使用 docker run d

随机推荐

  • 工作笔记-关于安卓和ios兼容遇到的问题

    工作笔记 关于安卓和ios兼容 一 移动端开发 客户端的键盘bug 现象 当用户点击卡面的按钮 弹出密码验证框和客户端键盘 此时点击验证框的按钮 ios的弹窗和键盘消失 然而并无其他事发生 bug定位 安卓功能完好 ios出现 所以采用打印
  • Spring Boot + Vue的网上商城之客服系统实现

    Spring Boot Vue的网上商城之客服系统实现 在网上商城中 客服系统是非常重要的一部分 它能够为用户提供及时的咨询和解答问题的服务 本文将介绍如何使用Spring Boot和Vue js构建一个简单的网上商城客服系统 思路 在本教
  • 编程猫编程平台的使用介绍

    编程猫编程平台的使用介绍 编程猫是由深圳点猫科技有限公司自主研发的国内知名青少年编程教育平台 通过图形化编程 可以创作出游戏 软件 动画 故事等 编程猫编程平台的使用介绍 cnds123的专栏 CSDN博客
  • ChatGPT专业应用:小红书文案生成

    正文共 1263 字 阅读大约需要 5 分钟 内容运营 社媒运营必备技巧 您将在5分钟后获得以下超能力 快速撰写小红书文案 Beezy评级 B级 经过简单的寻找 大部分人能立刻掌握 主要节省时间 推荐人 nanako 编辑者 Linda 此
  • 使用unixODBC并发连接mysql数据库频繁SIGSEGV及SIGABRT崩溃

    使用unixODBC并发连接mysql数据库频繁SIGSEGV及SIGABRT崩溃 2013 05 18 15 18 19 分类 UnixODBC 标签 unixodbc 举报 字号 订阅 下载LOFTER 我的照片书 这几周在测试自己写的
  • 编译XT720 gingerbread

    在android根目录下执行 build envsetup sh 然后执行lunch 选择你要的套餐 然后直接make 编译中有3处错误 1 packages apps CMStats Android mk中 把LOCAL STATIC J
  • [数值计算-3]:误差的种类、误差传播、误差分析

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119790035 目录 第1章
  • 华为校招机试题- 新员工座位安排系统-2023年

    题目描述 工位由序列F1 F2 Fn组成 Fi值为0 1或2 其中0代表空置 1代表有人 2代表障碍物 1 某一空位的友好度为左右连续老员工数之和 2 为方便新员工学习求助 优先安排友好度高的空位 给出工位序列 求所有空位中友好度的最大值
  • 统计学习方法 例7.1 超详细求解过程

    例7 1 已知一个如图所示的训练数据集 其正例点是 x 1 3 3
  • C#软件开发实例.私人订制自己的屏幕截图工具(九)使用自定义光标,QQ截图时的光标

    本实例全部文章目录 一 功能概览 二 创建项目 注册热键 显示截图主窗口 三 托盘图标及菜单的实现 四 基本截图功能实现 五 针对拖拽时闪烁卡顿现象的优化 六 添加配置管理功能 七 添加放大镜的功能 八 添加键盘操作截图的功能 九 使用自定
  • HashMap实现原理, 扩容机制,面试题和总结

    文章目录 1 讲下对HashMap的认识 2 HashMap的一些参数 3 为什么HashMap的长度必须是2的n次幂 4 HashMap 为什么在获取 hash 值时要进行位运算 5 HashMap在JDK1 7和JDK1 8中有哪些不同
  • PHP实现读取指定目录下的所有文件

    在php中读取指定目录下的文件主要用到了opendir和readdir函数 一 opendir 打开目录句柄 1 语法 opendir path context 2 参数说明 参数 描述 path 必需 规定要打开的目录路径 context
  • 【傻瓜向装系统】电脑重装&&加固态硬盘

    市面上大部分PE制作工具都会在操作系统中内嵌广告或软件等 慎重使用 重装 顺序步骤 重要数据备份 备份到移动硬盘或其他设备 格式化U盘 至少8G 准备作为系统启动盘 安装PE制作工具 如老毛桃等 制作启动盘 下载对应操作系统放到U盘中 某个
  • 极大极小树

    博弈树作为传统AI领域的一个传统又经典的算法 有着广泛的应用 尤其是棋类AI 记得曾经刚学C语言的时候 用控制台写了一个五子棋的程序 后来突发奇想 给它增加可以人机对战的AI 设计了一个简单的根据当前局面判断最优落子的AI 但是只能想到两手
  • DNS、HTTP 与 HTTPS

    DNS HTTP与HTTPS DNS 域名的层级 查找过程 优化 常见的 DNS 攻击 使用的协议 CDN 路由解析 内容分发 HTTP 协议 HTTP 请求报文 GET 和 POST 有什么区别 幂等性和非幂等性 前后端传参 HTTP响应
  • Ubuntu 20.04 开启SSH服务

    更新软件下载源 sudo apt update 安装ssh服务 sudo apt install openssh server 开启防火墙ssh的服务端口 sudo ufw allow ssh 附 还可以查看或更改ssh服务的状态 查看ss
  • Javaweb实现增删改查操作操作

    Javaweb实现增删改查操作操作 一 准备工作 1 Idea编辑器 eclispe和myeclispe都可以 个人推荐使用idea 新建一个web项目 2 数据库mysql 3 需要提前了解的知识点 servlet el和jstl表达式
  • 怎么检测两张照片的相似度,两张图片相似度测试

    计算图像相似度的算法有哪些 SIM StructuralSIMilarity 结构相似性 这是一种用来评测图像质量的一种方法 由于人类视觉很容易从图像中抽取出结构信息 因此计算两幅图像结构信息的相似性就可以用来作为一种检测图像质量的好坏 首
  • 服务器盘符名称修改,linux下powerpath对盘与更改盘符名的教程

    PowerPath 软件在服务器上运行并管理服务器和存储系统中的虚拟磁盘之间的路径 如果一条路径出现故障 它可以将I O 转发到有效路径中 并提供负载平衡来平均分配各条路径中的I O 负载 另外这里的路径由HBA 硬件和驱动程序 光纤 两个
  • docker web mysql_在 Docker 中完整部署 Web 应用

    原标题 在 Docker 中完整部署 Web 应用 一个完整的 Web 应用包含前端页面 数据库 后台逻辑等 按照一般流程去构建需要配置 Nginx MySQL 以及后台服务器 运维涉及到的部分十分复杂 而 Docker 可以将这些东西 数