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

推荐订阅源

S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
A
Arctic Wolf
Security Latest
Security Latest
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
Latest news
Latest news
Help Net Security
Help Net Security
S
Security Affairs
Webroot Blog
Webroot Blog
The Hacker News
The Hacker News
AI
AI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tor Project blog
Forbes - Security
Forbes - Security
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
H
Help Net Security
L
Lohrmann on Cybersecurity
S
SegmentFault 最新的问题
Google Online Security Blog
Google Online Security Blog
MongoDB | Blog
MongoDB | Blog
Cyberwarzone
Cyberwarzone
The Last Watchdog
The Last Watchdog
S
Securelist
N
News and Events Feed by Topic
S
Secure Thoughts
F
Fortinet All Blogs
博客园_首页
C
Cybersecurity and Infrastructure Security Agency CISA
量子位
M
MIT News - Artificial intelligence
F
Full Disclosure
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Microsoft Security Blog
Microsoft Security Blog
I
InfoQ
P
Privacy International News Feed
L
LangChain Blog
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes

博客园 - 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学习(6)-数据持久化与网络通信 学会 Git Tag,让版本管理不再混乱 docker学习(5)-Dockerfile docker学习(4)-Docker常用命令 docker学习(3)-一个简单的例子 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学习(8)-从 Windows 开发到 Linux 部署
xiashengwang · 2026-04-16 · via 博客园 - xiashengwang

一、本阶段目标

  • 在 Windows 上开发一个最简单的 Web 应用(Flask)
  • 编写 Dockerfile,构建镜像
  • 将镜像推送到 Docker Hub(免费公共仓库)
  • 在 Linux 环境(可以是云服务器,或者 Windows 上的 WSL 2 Ubuntu)中拉取镜像并运行
  • 实现应用更新(修改代码后重新构建、推送、部署)

二、前置条件

  • Windows 10/11 已安装 Docker Desktop,并且 Docker 正常运行(docker version 可查看)
  • 注册一个 Docker Hub 账号(免费)

地址:https://app.docker.com/

  • 一个可用的 Linux 环境

三、在 Windows 上创建示例项目

3.1 创建项目文件夹
在 Windows 上,打开 PowerShell 或 CMD,执行:

mkdir D:\docker-deploy-demo
cd D:\docker-deploy-demo

3.2 编写一个简单的 Flask 应用
创建文件 app.py,内容如下:

import os
from flask import Flask

app = Flask(__name__)

# 从环境变量读取问候语,默认为 "Hello"
greeting = os.environ.get('GREETING', 'Hello')

@app.route('/')
def hello():
    return f'{greeting} from Docker!'

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

3.3 编写依赖文件
创建 requirements.txt,内容:

flask==2.3.3

3.4 编写 Dockerfile
创建 Dockerfile(无扩展名),内容:

# 使用轻量级 Python 镜像
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.5 本地测试(可选)
在项目目录下执行:

docker build -t my-flask-app .
docker run -d --name test-app -p 5000:5000 my-flask-app

打开浏览器访问 http://localhost:5000 ,应该看到 Hello from Docker!。然后停止并删除容器:

docker stop test-app
docker rm test-app

四、将镜像推送到 Docker Hub

4.1 登录 Docker Hub
在 PowerShell 中执行:

docker login

输入你的 Docker Hub 用户名和密码。
注意:Docker Hub 现在要求使用 Personal Access Token 而不是密码。

登录 Docker Hub 网站 → 点击头像 → Settings → Personal Access Token → New Access Token

生成一个 token(例如 docker-cli-token),复制 token

在 docker login 提示输入密码时,粘贴这个 token 作为密码

登录成功会显示 Login Succeeded。

4.2 给本地镜像打标签
标签格式:<用户名>/<仓库名>:<版本>。例如我的用户名是 zhangsan,那么:

docker tag my-flask-app zhangsan/my-flask-app:v1.0

如果不确定用户名,可以用 docker images 查看已有的镜像名。
image
可以看到这个新的tag镜像。

4.3 推送镜像到 Docker Hub

docker push zhangsan/my-flask-app:v1.0

等待上传完成。推送成功后,可以在 Docker Hub 网站上看到这个镜像(仓库是公开的)。
image
如果推送时显示没有权限,那大概率是需要重新登录下(docker login 命令重新登录下)。

推送的速度比较快,虽然看起来有200M,但是在服务器上已经有的镜像层,docker hub一般是不会重复推送的,节约网络和空间,这一点很智能。

五、准备 Linux 环境

如果从来没有安装过docker,演示centos 7下安装docker步骤
安装必要的工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

换aliyun的docker安装源,国内安装提高速度,实测国外也可以

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker(3分钟安好)

sudo yum install -y docker-ce docker-ce-cli containerd.io

验证安装成功:
image

安装完docker是没有启动的,启动,并设置为开机自启动。

# 启动 Docker 服务
systemctl start docker
 
 
# 查看 Docker 运行状态
systemctl status docker
 
 
# 设置开机自启 Docker
systemctl enable docker

六、在 Linux 上拉取并运行镜像

假设你已经进入 Linux 环境(WSL 或 SSH 到云服务器)。以下命令在 Linux 终端中执行。

6.1 拉取镜像

docker pull zhangsan/my-flask-app:v1.0

如果速度慢,可以配置镜像加速器(参考之前章节)。

6.2 运行容器

docker run -d --name myapp -p 5000:5000 zhangsan/my-flask-app:v1.0

6.3 测试访问
如果使用 WSL:在 Windows 浏览器中访问 http://localhost:5000 即可。

如果使用云服务器:在浏览器中访问 http://<服务器公网IP>:5000。注意需要在云服务器安全组中开放 5000 端口。

你应该看到 Hello from Docker!。

6.4 查看容器日志

docker logs myapp

七、使用环境变量定制行为

7.1 在 Linux 上通过 -e 传递环境变量
停止并删除旧容器:

docker stop myapp
docker rm myapp

重新运行,设置 GREETING 环境变量:

docker run -d --name myapp -p 5000:5000 -e GREETING="Hi there" zhangsan/my-flask-app:v1.0

刷新浏览器,应该显示 Hi there from Docker!。

7.2 使用环境变量文件
创建文件 env.list(在 Linux 上):

echo "GREETING=Welcome" > env.list

然后运行:

docker run -d --name myapp -p 5000:5000 --env-file env.list zhangsan/my-flask-app:v1.0

效果相同。

八、应用更新流程

8.1 修改代码(在 Windows 上)
编辑 app.py,将返回的字符串改一下,例如:

    return f'{greeting} from Docker! (Version 2)'

8.2 重新构建镜像并推送

docker build -t my-flask-app .
docker tag my-flask-app zhangsan/my-flask-app:v2.0
docker push zhangsan/my-flask-app:v2.0

也可以同时更新 latest 标签:

docker tag my-flask-app zhangsan/my-flask-app:latest
docker push zhangsan/my-flask-app:latest

8.3 在 Linux 上更新容器
拉取新镜像:

docker pull zhangsan/my-flask-app:v2.0

停止并删除旧容器:

docker stop myapp
docker rm myapp

启动新容器:

docker run -d --name myapp -p 5000:5000 zhangsan/my-flask-app:v2.0

刷新浏览器,应该看到新内容。

8.4 优化更新流程(零停机)
如果希望更新时不中断服务,可以使用滚动更新策略。简单方式:先启动一个新容器(映射不同端口),测试无误后切换端口,再删除旧容器。或者使用 Docker Compose 的 --scale 和负载均衡。对于简单学习,上述方法足够。

九、使用 Docker Compose 部署(在 Linux 上)

为了方便,可以编写 docker-compose.yml 文件,在 Linux 上直接启动。

9.1 创建 docker-compose.yml
这里需要先安装docker-compose,由于国内不能访问github,所以在线方式安装行不通,那么就先到https://github.com/docker/compose/releases/tag/v2.23.0 上下载编译好的文件,这里我选的是v2.23.0的docker-compose-linux-x86_64,兼容我的老centos7,下载完毕后,先上传到服务器上,比如放在/data下:/data/ocker-compose-linux-x86_64。
然后依次执行:

mv /data/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

在 Linux 上(例如在 WSL 的 home 目录下),创建一个文件夹 deploy,然后创建 docker-compose.yml:

version: '3'

services:
  web:
    image: zhangsan/my-flask-app:latest
    ports:
      - "5000:5000"
    environment:
      - GREETING=Hello from Compose
    restart: always

9.2 启动

docker-compose up -d

9.3 更新
修改 docker-compose.yml 中的镜像标签为 v2.0,然后执行:

docker-compose down
docker-compose pull
docker-compose up -d