從 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.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896376.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多進程網絡服務端詳細說明文檔

多進程網絡服務端詳細說明文檔 一、概述 本項目實現了一個基于多進程的 TCP 網絡服務端&#xff0c;主要用于處理多個客戶端的連接請求。為了提高代碼的可維護性和可復用性&#xff0c;分成了頭文件&#xff08;.h&#xff09;和多個源文件&#xff08;.cpp&#xff09;。具體…

HDFS數據多目錄、異構存儲、回收站

1.NameNode元數據多目錄 HDFS集群中可以在hdfs-site.xml中配置“dfs.namenode.name.dir”屬性來指定NameNode存儲數據的目錄&#xff0c;默認NameNode數據存儲在${hadoop.tmp.dir}/dfs/name目錄&#xff0c;“hadoop.tmp.dir”配置項在core-site.xml中。 我們也可以將NameNod…

TFChat:騰訊大模型知識引擎(DeepSeek R1)+飛書機器人實現AI智能助手

效果 TFChat項目地址 https://github.com/fish2018/TFChat 騰訊大模型知識引擎用的是DeepSeek R1&#xff0c;項目為sanic和redis實現&#xff0c;利用httpx異步處理流式響應&#xff0c;同時使用buffer來避免頻繁調用飛書接口更新卡片的網絡耗時。為了進一步減少網絡IO消耗&…

HTML5 面試題

1. HTML5 新增了哪些重要特性&#xff1f; 語義化標簽&#xff1a;這些標簽有助于提高頁面的可讀性和可維護性。多媒體支持&#xff1a;HTML5 引入了 和 標簽&#xff0c;可以直接嵌入音頻和視頻文件&#xff0c;無需依賴插件。本地存儲&#xff1a;引入了 localStorage 和 se…

【Linux】Linux常用命令

目錄 文件和目錄相關命令查看和管理進程磁盤和文件系統管理用戶和權限管理網絡相關命令文本處理命令系統狀態查看命令軟件包管理命令計劃任務和后臺作業其他常用命令 1. 文件和目錄相關命令 命令作用示例pwd顯示當前工作目錄pwdls列出目錄內容ls -l 查看詳細信息cd切換目錄cd…

布署elfk-準備工作

建議申請5臺機器部署elfk&#xff1a; filebeat(每臺app)--> logstash(2臺keepalived)--> elasticsearch(3臺)--> kibana(部署es上)采集輸出 處理轉發 分布式存儲 展示 ELK中文社區: 搜索客&#xff0c;搜索人自己的社區 官方…

DeepSeek:我的AI助手之旅

★【前言】: 初次使用AI助手幫我寫作,就像摸石頭過河一樣,一點點的前行。我在慢慢的摸索,慢慢的體會中,感悟出的一點個人心得體會現分享給大家。這也說明一個問題,網站上各種使用方法和技巧是對于已經使用過的人來說的方便和快捷,但對于剛剛接觸的使用者來說,網上的各…

esp8266 rtos sdk開發環境搭建

1. 安裝必要的工具 1.1 安裝 Git Git 用于從遠程倉庫克隆代碼&#xff0c;你可以從Git 官方網站下載 Windows 版本的安裝程序。安裝過程中可保持默認設置&#xff0c;安裝完成后&#xff0c;在命令提示符&#xff08;CMD&#xff09;或 PowerShell 中輸入git --version&#…

C# | GDI+圖像測距輔助線的實現思路

C# | GDI圖像測距輔助線的實現思路 文章目錄 C# | GDI圖像測距輔助線的實現思路一、輔助線需求概述二、坐標系與角度計算2.1 笛卡爾坐標系2.2 線長和角度計算方法2.3 文本角度矯正計算方法2.4 坐標變換實現步驟 三、與if判斷方式對比四、總結 一、輔助線需求概述 在圖像測量工…

記錄此刻:歷時兩月,初步實現基于FPGA的NVMe SSD固態硬盤存儲控制器設計!

背景 為滿足實驗室橫向項目需求&#xff0c;在2024年12月中下旬導師提出基于FPGA的NVMe SSD控制器研發項目。項目核心目標為&#xff1a;通過PCIe 3.0 x4接口實現單盤3000MB/s的持續讀取速率。 實現過程 調研 花了半個月的時間查閱了一些使用FPGA實現NVME SSD控制器的論文、…

python編寫liunx服務器登陸自動巡檢腳本

前言&#xff1a; 用戶需要一份用Python編寫的Linux系統巡檢腳本&#xff0c;檢查內存、磁盤、CPU使用率&#xff0c;還有網絡連通性。 首先&#xff0c;我得確定用戶的使用場景。可能用戶是系統管理員&#xff0c;需要定期監控服務器狀態&#xff0c;確保系統正常運行。 或者…

【二分查找】P9698 [GDCPC2023] Path Planning|普及

本文涉及的基礎知識點 本博文代碼打包下載 C二分查找 [GDCPC2023] Path Planning 題面翻譯 【題目描述】 有一個 n n n 行 m m m 列的網格。網格里的每個格子都寫著一個整數&#xff0c;其中第 i i i 行第 j j j 列的格子里寫著整數 a i , j a_{i, j} ai,j?。從 0…

springboot015基于SpringBoot的在線視頻教育平臺的設計與實現(源碼+數據庫+文檔)

源碼地址&#xff1a;基于SpringBoot的在線視頻教育平臺的設計與實現 文章目錄 1.項目簡介2.部分數據庫結構與測試用例3.系統功能結構4.包含的文件列表&#xff08;含論文&#xff09;前端運行截圖后端運行截圖 1.項目簡介 ? 隨著科學技術的飛速發展&#xff0c;各行各業都在…

《深度剖析:生成對抗網絡中生成器與判別器的高效協作之道》

在人工智能的前沿領域&#xff0c;生成對抗網絡&#xff08;GAN&#xff09;以其獨特的對抗學習機制&#xff0c;為數據生成和處理帶來了革命性的變革。生成器與判別器作為GAN的核心組件&#xff0c;它們之間的協作效率直接決定了GAN在圖像生成、數據增強、風格遷移等眾多應用中…

學習Flask:[特殊字符] Day 3:數據庫集成

學習目標&#xff1a;使用SQLAlchemy操作數據庫 from flask_sqlalchemy import SQLAlchemyapp.config[SQLALCHEMY_DATABASE_URI] sqlite:///site.db db SQLAlchemy(app)class User(db.Model):id db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(20),…

可以免費無限次下載PPT的網站

前言 最近發現了一個超實用的網站&#xff0c;想分享給大家。 在學習和工作的過程中&#xff0c;想必做PPT是一件讓大家都很頭疼的一件事。 想下載一些PPT模板減少做PPT的工作量&#xff0c;但網上大多精美的PPT都是需要付費才能下載使用。 即使免費也有次數限制&#xff0…

什么是 Java 中的線程安全?

回答 Java 中的線程安全&#xff08;Thread Safety&#xff09;指的是在多線程環境下&#xff0c;當多個線程同時訪問和操作共享資源&#xff08;如對象、變量、數據結構等&#xff09;時&#xff0c;能夠保證程序的正確性&#xff0c;不會出現數據不一致、競爭條件&#xff0…

建筑三維設計軟件如何實現彎道超車?

三個問題 建筑三維設計軟件屬于工業設計軟件的一種&#xff0c;在這個領域一直是國外公司壟斷。前些年&#xff0c;在房地產高歌猛進的時代&#xff0c;很多公司也嘗試投入到建筑三維設計軟件的研發。隨著房地產市場行業的下行&#xff0c;建筑三維設計軟件的發展也受到了影響…

Android OpenGLES2.0開發(十一):渲染YUV

人生如逆旅&#xff0c;我亦是行人 Android OpenGLES開發&#xff1a;EGL環境搭建Android OpenGLES2.0開發&#xff08;一&#xff09;&#xff1a;艱難的開始Android OpenGLES2.0開發&#xff08;二&#xff09;&#xff1a;環境搭建Android OpenGLES2.0開發&#xff08;三&am…