惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Latest news
Latest news
G
GRAHAM CLULEY
P
Privacy International News Feed
Know Your Adversary
Know Your Adversary
N
Netflix TechBlog - Medium
C
CERT Recently Published Vulnerability Notes
O
OpenAI News
T
Tenable Blog
Attack and Defense Labs
Attack and Defense Labs
S
Schneier on Security
The GitHub Blog
The GitHub Blog
M
MIT News - Artificial intelligence
PCI Perspectives
PCI Perspectives
博客园 - 司徒正美
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
Martin Fowler
Martin Fowler
S
Secure Thoughts
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
T
The Exploit Database - CXSecurity.com
U
Unit 42
The Register - Security
The Register - Security
Google DeepMind News
Google DeepMind News
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
WordPress大学
WordPress大学
B
Blog
Project Zero
Project Zero
NISL@THU
NISL@THU
Cloudbric
Cloudbric
TaoSecurity Blog
TaoSecurity Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
MongoDB | Blog
MongoDB | Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
I
Intezer
L
Lohrmann on Cybersecurity
Webroot Blog
Webroot Blog
P
Proofpoint News Feed
C
Check Point Blog
Schneier on Security
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Hugging Face - Blog
Hugging Face - Blog
I
InfoQ
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Threatpost
Apple Machine Learning Research
Apple Machine Learning Research
Spread Privacy
Spread Privacy
The Hacker News
The Hacker News

博客园 - xiashengwang

Rocky Linux 9 安装docker Rocky Linux 9 与Centos区别,以及软件安装dnf命令 《Linux 基础点滴》:(17)SSH 密钥生成与管理 – 免密登录的利器 Linux服务器安全登录:从入门到实践 putty 基础 《Linux 基础点滴》:(16)firewalld 防火墙管理命令 《Linux 基础点滴》:(15)用户管理 – 创建、删除、权限与 sudo 《Linux 基础点滴》:(14)定时任务 – 用 crontab 自动化 《Linux 基础点滴》:(13)文本编辑入门 – 使用 Vim 《Linux 基础点滴》:(12)tldr – 简化版命令手册 《Linux 基础点滴》:(11)系统信息与资源监控 – 掌握服务器状态 《Linux 基础点滴》:(10)压缩与打包 – tar 的艺术 《Linux 基础点滴》:(9)查找与过滤 – find, grep, 管道 《Linux 基础点滴》:(8)网络基础 – 查看 IP、连通性与端口 《Linux 基础点滴》:(7)进程管理 – 查看与控制运行中的程序 《Linux 基础点滴》:(6)文件权限与所有者 – 保护你的文件 《Linux 基础点滴》:(5)文件与目录操作 – 增删改查必会命令 《Linux 基础点滴》:(4)磁盘空间查看 – df 和 du 的妙用 《Linux 基础点滴》:(3)Linux 文件系统概览 – 一切皆文件 《Linux 基础点滴》:(2)SSH 连接与基础命令 – 从登录到第一次操作 《Linux 基础点滴》:(1)初识 Linux 大家族 – 发行版分类与选择 docker学习(7)-docker compose 文件 docker学习(11)- 容器的日志(log) docker学习(10)-利用Github Action 自动化部署 docker学习(9)-Docker Swarm + Nginx 跨机器负载均衡 docker学习(8)-从 Windows 开发到 Linux 部署 docker学习(6)-数据持久化与网络通信 学会 Git Tag,让版本管理不再混乱 docker学习(5)-Dockerfile docker学习(4)-Docker常用命令 docker学习(2)-安装 docker学习(1)-基本概念 Github 使用 Self-hosted Runner 实现服务器自动化部署 github创建分支 + Pull Request 合并 Git Rebase vs Git Merge:深入理解与实战选择 Git 系统学习教程:从零到团队协作 AI学习笔记(2)-OpenClaw安装 windbg分析dmp文件 docker desktop 和 Vmware冲突的解决办法
docker学习(3)-一个简单的例子
xiashengwang · 2026-04-15 · via 博客园 - xiashengwang

2026-04-15 17:58  xiashengwang  阅读(10)  评论()    收藏  举报

创建一个简单的项目

一个简单的web网页,点击按钮计数器加1,用python+redis实现

1、创建项目

image
app.py

import os
import redis
from flask import Flask

app = Flask(__name__)
# 从环境变量获取 Redis 地址,如果未设置则默认用 'redis'
redis_host = os.environ.get('REDIS_HOST', 'redis')
redis_client = redis.Redis(host=redis_host, port=6379, db=0)

@app.route('/')
def hello():
    count = redis_client.incr('visits')
    return f'Hello! This page has been visited {count} times.'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

编写requirements.txt

flask==2.3.3
redis==5.0.1

2、编写dockfile

Dockerfile 是 Docker 用来构建镜像的蓝图。
在项目的同目录下新建Dockerfile(没有扩展名,注意不要写成 Dockerfile.txt)。

# 使用轻量级 Python 3.9 镜像
FROM python:3.9-slim
# 设置工作目录(容器内的路径)
WORKDIR /app
# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码到容器中
COPY app.py .
# 暴露应用运行的端口
EXPOSE 5000
# 启动命令
CMD ["python", "app.py"]

3、编写docker-compose.yml

Docker Compose 文件用于定义和管理多个容器。这里我们要启动两个容器:一个是我们自己的应用,一个是 Redis。
项目根目录下建立一个docker-compose.yml文件
docker-compose.yml

version: '3'
services:
  redis:
    image: redis:alpine
    restart: always
    volumes:
      - redis-data:/data
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      - REDIS_HOST=redis
    depends_on:
      - redis
    restart: always
volumes:
  redis-data:  

解释:

  • version:指定 Compose 文件格式版本。
  • services:定义两个服务。
    • redis:使用官方 Redis 的 alpine 版本(体积小)。volumes 将名为 redis_data 的卷挂载到容器内的 /data,这样 Redis 数据会持久化到磁盘(即使删除容器,卷还在)。restart: always 表示容器退出后自动重启。
    • web:build: . 表示使用当前目录的 Dockerfile 构建镜像;ports 将主机的 5000 端口映射到容器的 5000 端口;environment 设置环境变量 REDIS_HOST=redis,这样应用就知道 Redis 的地址了(在 Compose 网络中,服务名就是主机名);depends_on 确保 Redis 先启动(但不会等待它完全就绪,不过这里足够用)。
  • volumes:定义了一个名为 redis_data 的卷,用于持久化 Redis 数据。

4、构建并启动项目

打开powershell,切换到本项目的根目录。
运行如下命令:
docker build -t my-flask-app .

  • docker build:构建镜像。
  • -t my-flask-app:给镜像起个名字(标签),这里叫 my-flask-app。
  • .:指定构建上下文为当前目录(Docker 会把当前目录下的文件发送给守护进程)。

报错了,原因是Docker hub在国外,网络连接超时,需要配置国内镜像。
image

配置镜像
image
镜像如果不可用,这里有可用数据源的实时更新(太难了)
https://github.com/dongyubin/DockerHub?tab=readme-ov-file
切换镜像源后,再次运行docker build -t my-flask-app .编译通过了。
image
这里可以看到刚才编译生成的image
image

5、启动所有服务

docker-compose up -d启动容器。

docker-compose ps查看容器是否运行。
image

6、访问应用

浏览器输入:
http://localhost:5000/
image
页面每次刷新,计数器加1,说明部署成功的:
image

7、删除应用

docker-compose down
这个会删除当前的容器,但不会删除redis的数据。如果要删除数据需要:
docker-compose down -v

8、手动构建

手动构建和运行(可选,了解底层命令)
如果你只想用 docker run 而不是 docker-compose,也可以手动运行两个容器,但需要自己创建网络和连接。这有助于理解 Compose 背后做了什么。

创建一个自定义网络

docker network create my-network

运行 Redis 容器

docker run -d --name my-redis --network my-network redis:alpine

运行你的应用容器

docker run -d --name my-web --network my-network -p 5000:5000 -e REDIS_HOST=my-redis my-flask-app

然后同样访问 http://localhost:5000 即可。(实际测试可行)