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

推荐订阅源

大猫的无限游戏
大猫的无限游戏
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
V2EX - 技术
V2EX - 技术
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
S
Schneier on Security
I
InfoQ
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The GitHub Blog
The GitHub Blog
S
Security @ Cisco Blogs
O
OpenAI News
W
WeLiveSecurity
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
Cloudbric
Cloudbric
The Last Watchdog
The Last Watchdog
The Hacker News
The Hacker News
Google Online Security Blog
Google Online Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
GbyAI
GbyAI
NISL@THU
NISL@THU
T
Tailwind CSS Blog
V
Visual Studio Blog
PCI Perspectives
PCI Perspectives
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
D
DataBreaches.Net
B
Blog RSS Feed
N
News and Events Feed by Topic
N
News and Events Feed by Topic
H
Heimdal Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
腾讯CDC
Latest news
Latest news
V
Vulnerabilities – Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
V
V2EX
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Register - Security
The Register - Security
Help Net Security
Help Net Security

博客园 - 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 即可。(实际测试可行)