从 0 到 1:使用 Docker 部署个人博客系统
引言
在当今数字化时代,拥有一个个人博客来记录自己的学习、生活和见解是一件非常有意义的事情。然而,传统的博客部署方式往往涉及复杂的环境配置和依赖管理,容易让人望而却步。而 Docker 的出现,为我们提供了一种简单、高效的解决方案。本文将结合实际案例,详细介绍如何使用 Docker 部署一个基于 Python Flask 框架的个人博客系统。
案例背景
我们的目标是搭建一个简单的个人博客系统,允许用户发布文章、查看文章列表和文章详情。博客系统采用 Python Flask 框架开发,数据库使用 MySQL。为了确保博客系统在不同环境下的一致性和可移植性,我们将使用 Docker 进行部署。
步骤 1:开发博客系统
1.1 创建项目目录和虚拟环境
首先,创建一个项目目录,并在其中创建一个虚拟环境:
mkdir my-blog
cd my-blog
python3 -m venv venv
source venv/bin/activate
1.2 安装依赖库
pip install flask mysql-connector-python
1.3 编写博客系统代码
创建一个名为 app.py 的文件,编写博客系统的核心代码:
from flask import Flask, render_template, request
import mysql.connectorapp = Flask(__name__)# 连接 MySQL 数据库
mydb = mysql.connector.connect(host="localhost",user="your_username",password="your_password",database="blog_db"
)@app.route('/')
def index():cursor = mydb.cursor()cursor.execute("SELECT * FROM posts")posts = cursor.fetchall()return render_template('index.html', posts=posts)@app.route('/post/<int:post_id>')
def post(post_id):cursor = mydb.cursor()cursor.execute("SELECT * FROM posts WHERE id = %s", (post_id,))post = cursor.fetchone()return render_template('post.html', post=post)@app.route('/add_post', methods=['GET', 'POST'])
def add_post():if request.method == 'POST':title = request.form['title']content = request.form['content']cursor = mydb.cursor()sql = "INSERT INTO posts (title, content) VALUES (%s, %s)"val = (title, content)cursor.execute(sql, val)mydb.commit()return 'Post added successfully!'return render_template('add_post.html')if __name__ == '__main__':app.run(debug=True)
1.4 创建模板文件
在项目目录下创建一个名为 templates 的文件夹,并在其中创建 index.html、post.html 和 add_post.html 三个模板文件。以下是 index.html 的示例代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>My Blog</title>
</head>
<body><h1>My Blog</h1>{% for post in posts %}<h2><a href="/post/{{ post[0] }}">{{ post[1] }}</a></h2><p>{{ post[2] }}</p>{% endfor %}<a href="/add_post">Add Post</a>
</body>
</html>
步骤 2:创建 Dockerfile
为了将博客系统打包成 Docker 镜像,我们需要创建一个 Dockerfile。在项目目录下创建一个名为 Dockerfile 的文件,并添加以下内容:
# 使用官方的 Python 3.9 镜像作为基础镜像
FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 将当前目录下的所有文件复制到容器的 /app 目录下
COPY. /app# 安装应用所需的依赖
RUN pip install --no-cache-dir -r requirements.txt# 暴露应用的端口
EXPOSE 5000# 定义容器启动时执行的命令
CMD ["python", "app.py"]
同时,在项目目录下创建一个名为 requirements.txt 的文件,列出应用所需的依赖库:
flask mysql-connector-python
步骤 3:创建 MySQL 容器
3.1 拉取 MySQL 镜像
使用以下命令从 Docker Hub 拉取 MySQL 镜像:
bash
docker pull mysql:8.0
3.2 运行 MySQL 容器
运行以下命令创建并启动一个 MySQL 容器:
docker run -d --name mysql-container -e MYSQL_ROOT_PASSWORD=your_password -e MYSQL_DATABASE=blog_db -p 3306:3306 mysql:8.0
-d:以守护进程模式运行容器。
–name:为容器指定一个名称。
-e:设置环境变量,这里设置了 MySQL 的 root 密码和数据库名称。
-p:将容器的 3306 端口映射到宿主机的 3306 端口。
3.3 创建数据库表
使用以下命令进入 MySQL 容器的命令行:
docker exec -it mysql-container mysql -uroot -p
输入之前设置的 root 密码,登录到 MySQL 数据库。然后创建一个名为 posts 的表:
USE blog_db;
CREATE TABLE posts (id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255),content TEXT
);
步骤 4:构建并运行博客系统容器
4.1 构建 Docker 镜像
在项目目录下,使用以下命令构建博客系统的 Docker 镜像:
docker build -t my-blog-app.
4.2 运行博客系统容器
运行以下命令创建并启动一个博客系统容器,并将其连接到 MySQL 容器:
docker run -d --name blog-container -p 5000:5000 --link mysql-container:mysql my-blog-app
–link:将博客系统容器连接到 MySQL 容器,并为 MySQL 容器指定一个别名 mysql。
步骤 5:访问博客系统
打开浏览器,访问 http://localhost:5000,你将看到博客系统的首页。现在,你可以发布文章、查看文章列表和文章详情了。
总结
通过使用 Docker,我们成功地将一个基于 Python Flask 框架的个人博客系统部署到了容器中。Docker 的容器化技术使得博客系统的部署变得简单、高效,同时也确保了系统在不同环境下的一致性和可移植性。希望本文能够帮助你快速上手 Docker,并将其应用到实际项目中。
注意事项
- 在实际生产环境中,建议使用更安全的方式管理 MySQL 的密码,例如使用 Docker 机密(Docker Secrets)。
- 可以使用 Docker Compose 来管理多个容器的部署,简化部署流程。
The end.
相关文章:
从 0 到 1:使用 Docker 部署个人博客系统
引言 在当今数字化时代,拥有一个个人博客来记录自己的学习、生活和见解是一件非常有意义的事情。然而,传统的博客部署方式往往涉及复杂的环境配置和依赖管理,容易让人望而却步。而 Docker 的出现,为我们提供了一种简单、高效的解…...
Python - Python操作Redis
安装Redis可参考 Redis-入门简介-CSDN博客 在Python中接入Redis数据库通常使用redis-py这个库 一、安装Redis 首先,需要安装redis-py库。通过pip来安装 pip install redis 二、连接Redis Redis连接操作import redisdef redis_connect():try:redisClient redi…...
Solidity 开发环境
Solidity 开发环境 Solidity编辑器:Solidity编辑器是⼀种专⻔⽤于编写和编辑Solidity代码的编辑器。常⽤的Solidity编辑器包括 Visual Studio Code、Atom和Sublime Text。以太坊开发环境:以太坊开发环境(Ethereum Development Environment&a…...
js基础案例
1.弹出警告框,显示Hello JS 2.在页面输出内容(内容在body标签里面) 3.在控制台输出内容 4.js代码是自上而下执行 5.将js代码编写到标签的onclick属性中,当点击时,js代码才会执行 6.将js写到超链接的href属性中…...
Unity TMPro显示中文字体
TMP默认的字体只能显示英语,那么怎么显示中文呢 1、找到支持中文的字体文件 在c盘搜索Fonts文件夹有很多支持中文的字体文件 我这里选择雅黑 PS.双击打开发现里面有粗体细体普通三个版本,也可以只导入一个版本进去 2、将其拖入到unity Assets里面 3…...
2025 GDC开发者先锋大会“人形机器人的开源之路”分论坛 | 圆桌会议:《开放协作:开源生态如何解锁人形机器人与具身智能的未来》(上篇)
在GDC全球开发者先锋大会期间,2月23日,由GDC组委会指导、国家地方共建人形机器人创新中心(以下简称“国地中心”)承办的“人形机器人的开源之路”主题论坛在上海西岸艺术中心成功举办。 在人工智能与机器人技术飞速发展的今天&…...
MySQL 数据库安全配置最佳实践
文章目录 MySQL 数据库安全配置最佳实践账户与权限管理账户最小化原则权限最小化配置密码策略强化 认证与访问控制禁用匿名账户启用安全认证 网络安全防护访问源限制禁用远程root访问启用SSL加密 日志审计与监控全量审计配置二进制日志管理 服务端安全加固关键参数配置文件权限…...
网络安全红队工具
目录 红队及发展趋势 基本概念 发展趋势 防守阶段 备战阶段 临战阶段 实战阶段 战后整顿 如果错过互联网,与你擦肩而过的不仅仅是机会,而是整整一个时代。 红队及发展趋势 基本概念 红队一般指实战攻防的防守方。 红队主要复盘总结现有防护系统的不足之处,为…...
【Qt】编程基础
目录 一、Qt体系框架: 编辑二、布局方式: 1.绝对布局 setGeometry()函数 2.盒子布局: QHBoxLayout:水平布局管理器 QVBoxLayout:垂直布局管理器 QGridLayout:网格布局管理器 三、基本控件及其函数 标签类 :QLabel 按…...
《SegFace: Face Segmentation of Long-Tail Classes》论文分享(侵删)
author{Kartik Narayan and Vibashan VS and Vishal M. Patel} 原文链接:[2412.08647] SegFace: Face Segmentation of Long-Tail Classes 摘要 人脸解析是指将人脸语义分割为眼睛、鼻子、头发等关键面部区域。它是各种高级应用程序的先决条件,包括人脸…...
Android AOSP系统裁记录
Android 系统裁剪是指根据需求移除不必要的组件和功能,以优化系统性能、减少存储占用或满足特定设备需求。以下是 Android 系统裁剪的基本步骤: 1. 准备环境 操作系统:推荐使用 Ubuntu 或 macOS。 工具: Android SDK Android N…...
音乐游戏Dance Dance Revolution(DDR)模拟器
文章目录 (一)Dance Dance Revolution(1.1)基本情况(1.2)机体 (二)模拟器(2.1)主程序(2.2)模拟器主题 (三)曲谱…...
Lua的table(表)
Lua表的基本概念 Lua中的表(table)是一种多功能数据结构,可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制,其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成: 数组部分…...
ZT36 小红和小紫的取素因子游戏
描述 小红和小紫拿到了一个正整数x,她们每次可以选择x的一个因子k(k>1),把x除以k,但要求k必须是素数。小红先手,谁先不能操作谁输。假设两人都足够聪明,最终谁取得胜利? 共进行t次游戏。 输入描述&…...
C# 使用 Newtonsoft.Json 序列化和反序列化对象实例
Newtonsoft.Json(也被称为 Json.NET)是一个广泛使用的用于在 C# 中进行 JSON 序列化和反序列化的开源库。下面将详细介绍如何使用它来序列化和反序列化对象。 1. 安装 Newtonsoft.Json 如果你使用的是 Visual Studio,可以通过 NuGet 包管理…...
用 AI 工具提升 UX/UI 设计效率:从研究到原型
—————————————————— 用 AI 工具提升 UX/UI 设计效率:从研究到原型 开篇引言: 在 UX/UI 设计领域,效率与创意之间的平衡一直是设计师们追求的目标。随着 AI 工具的崛起,设计师们不仅能更快地完成任务,…...
操作系统知识点12
1.在操作系统的结构设计中,采用层次结构的操作系统其最大优点是把整体问题局部化 2.非特权指令是指操作系统和用户均可以使用的指令 3.向处理器发出的中断信号称为中断请求 4.轮转法RR是单纯基于时间片考虑的 5.当进程处于就绪状态时,表示进程已获得…...
FASIONAD:自适应反馈的类人自动驾驶中快速和慢速思维融合系统
24年11月来自清华、早稻田大学、明尼苏达大学、多伦多大学、厦门大学马来西亚分校、电子科大(成都)、智平方科技和河南润泰数字科技的论文“FASIONAD : FAst and Slow FusION Thinking Systems for Human-Like Autonomous Driving with Adaptive Feedbac…...
Redis7——基础篇(八)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...
nvm安装
1.下载安装包 从官网下载https://github.com/nvm-sh/nvm/releases 这里下的是nvm-0.40.1.tar.gz 2.解压 tar -zxvf nvm-0.40.1.tar.gz 3. 修改配置文件 vi ~/.bashrc 在最后一行添加如下内容 export NVM_DIR"/usr/local/nvm-0.40.1"[ -s "$NVM…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
生信服务器 | 做生信为什么推荐使用Linux服务器?
原文链接:生信服务器 | 做生信为什么推荐使用Linux服务器? 一、 做生信为什么推荐使用服务器? 大家好,我是小杜。在做生信分析的同学,或是将接触学习生信分析的同学,<font style"color:rgb(53, 1…...
