从 0 到 1:使用 Docker 部署个人博客系统

ops/2025/2/28 8:48:25/

引言

在当今数字化时代,拥有一个个人博客来记录自己的学习、生活和见解是一件非常有意义的事情。然而,传统的博客部署方式往往涉及复杂的环境配置和依赖管理,容易让人望而却步。而 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.


http://www.ppmy.cn/ops/161909.html

相关文章

vim临时文件泄露

##解题思路 感觉ctfshow的题目都挺有意思的&#xff0c;大家可以去做做 首先题目提示vim临时文件泄露&#xff0c;一般在vim编辑的时候&#xff0c;会有个swp的中间文件生成&#xff0c;根据这个特性&#xff0c;从而可以猜测&#xff0c;我们可以通过访问一个swp文件路径&am…

神经网络的激活函数(三)ReLU和它的变种Leaky ReLU、PReLU

本文我们介绍深度学习的功臣ReLU及其变种&#xff0c;它们在神经网络中的广泛应用&#xff0c;对于提高网络的性能和加速训练具有重要意义。 1. ReLU函数 1.1 定义 ReLU&#xff08;Rectified Linear Unit&#xff0c;修正线性单元&#xff09;激活函数是现代深度学习中最常用…

蓝桥杯2024年第十五届省赛真题-传送阵

#include<stdio.h> #include<stdbool.h> #define MAX 100000 int circle[MAX];//记录每个环大小 int parent[MAX];//记录每个传送阵所属的环 int m[MAX]; bool visited[MAX]; int circleIndex0;//当前环的编号 //迭代实现换的查找void findcircle(int start){int c…

DeepSeek-R1技术全解析:如何以十分之一成本实现OpenAI级性能?

一、现象级爆火背后的技术逻辑 2025年1月20日&#xff0c;中国AI公司深度求索&#xff08;DeepSeek&#xff09;发布新一代大模型R1&#xff0c;其性能直接对标OpenAI的o1版本&#xff0c;但训练成本仅为后者的1/20&#xff08;600万美元 vs. 1.2亿美元&#xff09;&#xff0…

PHP 反序列化漏洞

PHP 反序列化漏洞&#xff0c;主要由于不当处理用户可控的序列化数据导致代码执行或敏感操作。 1. 序列化与反序列化 序列化&#xff1a;将对象转换为字符串&#xff08;serialize()&#xff09; class User {public $username admin;public $isAdmin true; } $obj new Use…

嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)

目录 步骤 1&#xff1a;准备工作 步骤 2&#xff1a;创建 Keil 项目&#xff0c;并配置工程 步骤 3&#xff1a;在MDK工程上添加 CMSIS-DSP 库 步骤 5&#xff1a;编写代码 步骤 6&#xff1a;配置时钟和优化 步骤 7&#xff1a;调试与验证 步骤 8&#xff1a;优化和调…

接口自动化测试框架搭建整体步骤

需求分析与规划 在需求分析阶段&#xff0c;测试需与开发对齐接口定义、业务逻辑、数据依赖及异常处理规则&#xff0c;通过会议、文档共享和代码审查确保测试范围与开发实现一致。 1. 接口范围确定 数据来源&#xff1a; 开发提供的 Swagger/OpenAPI 文档&#xff08;主来源&a…

无框架简易Java服务器后端

不使用像 Spring Boot 这样的框架&#xff0c;使用 Java 内置的HttpServer&#xff08;从 Java 1.7 开始引入&#xff09;来创建一个简单的 Web 后端&#xff0c;处理xxxx/test/query接口&#xff0c;接收 JSON 请求体并返回字符串响应。 示例代码&#xff1a; import com.go…