1. 为什么FastAPI项目要用Docker,这篇能帮你解决什么
写这一篇的时候,我其实有点感慨。前面25篇,咱们从FastAPI最基础的路径参数、请求体、依赖注入,一路走到JWT认证、数据库迁移、部署上线,已经把FastAPI本身的玩法讲得差不多了。但是有个问题一直绕不开:环境。你自己电脑上跑得好好的项目,换一台机器就起不来,数据库连不上、Redis找不到、Python版本不对、依赖冲突,这些问题几乎每个做后端的人都被坑过。所以系列到第26篇,我决定专门腾出一整篇来聊Docker,而且重点放在安装这个环节。
Docker对FastAPI项目的意义,说白了就一句话:把你的整个运行环境打包带走。假设你本地用的是Python 3.12,MySQL 8.0,Redis 7,别人电脑上是Python 3.8,MySQL 5.7,没有Redis,那你的FastAPI代码在他那边大概率是跑不起来的。而Docker能把Python解释器、系统依赖、所有Python包、甚至MySQL和Redis本身,全都封装成一个或多个独立的“集装箱”,不管换到哪里,只要装好了Docker,就能一键启动一模一样的环境。
这篇教程面向的读者,我大概分了三类。第一种是完全没接触过Docker的小白,你只需要照着文章一步步点,把环境搭起来就行。第二种是已经听说Docker很火、但之前安装失败过、被各种报错劝退的朋友,这篇文章会把你可能遇到的坑提前都踩一遍,告诉你每种报错怎么处理。第三种是已经在用Docker、但装的是老版本或者环境比较乱的朋友,你可以对照文章检查一下自己的安装方式,尤其是镜像源配置和虚拟化设置这两块。
不管你属于哪一类,这篇文章最终要达成的目标只有三个:装好Docker、跑通第一个容器、确保后续FastAPI项目能用上MySQL和Redis这类基础服务。安装的部分我尽量讲得细,因为我知道很多人在docker run、docker-compose这些命令上卡住,根子都是环境没装明白。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前必做的准备工作,直接决定你后面顺不顺
很多人在Docker安装上翻车,不是操作不对,而是准备工作没做好。我见过太多同学在Windows上装了Docker Desktop,双击打开直接报错,然后一脸懵。实际上,Docker在Windows和Linux上的安装逻辑是完全不同的,而Windows又分好几种情况。
2.1 Windows用户先搞清楚自己属于哪种情况
Windows下装Docker,第一件事不是下载安装包,而是搞清楚你的系统版本和硬件虚拟化支持情况。
如果你是Windows 10 64位专业版、企业版或教育版,或者Windows 11,那可以直接用Docker Desktop,它基于WSL2(Windows Subsystem for Linux 2),体验最接近原生Linux。如果你用的是Windows 10家庭版,也可以装Docker Desktop,但需要先手动启用WSL2功能。这里多说一句,WSL2是微软提供的轻量级Linux虚拟化方案,Docker Desktop在Windows上运行的本质,其实就是先在WSL2里跑一个Linux虚拟机,然后Docker跑在虚拟机里。
还有一种情况是你用的老版本Windows(比如Windows 7、Win8),那基本上是装不了Docker Desktop的,只能装Docker Toolbox,但那个已经停止维护了,我强烈不建议新项目用,装了也是给自己找麻烦。
判断方法很简单:按Win+R,输入winver回车,弹出的窗口里能看到系统版本和内部版本号。如果显示的是1903及以上版本,WSL2这条路是通的。
2.2 确认虚拟化已开启,这一步最容易被忽略
Virtualization(虚拟化)没开,是Docker Desktop在Windows上启动失败的头号原因,对应报错就是热词里那个virtualization support not detected docker desktop failed to start。
怎么确认虚拟化开没开?打开任务管理器,切到“性能”选项卡,看左下角“CPU”,右侧会显示“虚拟化:已启用”或“虚拟化:已禁用”。如果显示已禁用,需要重启电脑,按Del或者F2(不同主板按键不一样)进入BIOS设置,找到Intel Virtualization Technology(Intel平台)或者SVM Mode(AMD平台),把它改成Enabled,保存退出重启。
这里有个常见误区:BIOS里虚拟化选项叫法五花八门,有的叫VT-x,有的叫Vanderpool,AMD那边还有叫Secure Virtual Machine的。不用纠结叫什么,看到带Virtualization或者SVM字样的,打开就对了。
还有一点,如果你用的是笔记本,部分机型需要在BIOS里把“安全启动”(Secure Boot)关掉才能正常启用虚拟化,尤其是某些国产品牌。不过关安全启动可能会影响Windows 11的系统要求校验,这个权衡你自己判断,一般来说关掉没太大问题。
2.3 Linux用户千万别用别人给的脚本糊里糊涂装
如果你用的是Ubuntu服务器或者桌面版,安装Docker的路径跟Windows完全不同,不需要Docker Desktop,而是直接装Docker Engine。
但我也要提醒一句:网上很多教程让你直接用curl -fsSL https://get.docker.com | sh这个一键安装脚本,图省事没问题,但我建议你在用之前先了解它到底干了什么。这个脚本会卸载旧版本、添加官方源、安装最新版Docker Engine,通常没问题,但如果你打算后续用Docker做生产部署,最好还是手动配apt源来装,这样对版本控制更有把握。
另外,如果你之前装过docker.io(Ubuntu自带的那个老版本),要先卸载干净再装新的,不然两个版本共存会出现各种奇怪冲突。卸载命令记一下:sudo apt remove docker docker-engine docker.io containerd runc。
2.4 网络环境:不提前搭好加速器,安装会卡到你怀疑人生
Linux下通过apt源装Docker本身一般不会太慢,但真正痛苦的是后面docker pull拉镜像镜像的那个环节。默认的Docker Hub镜像源在国内速度很不稳定,往往会中途超时。
解决办法有两个:一是用阿里云的镜像加速器,二是改用国内镜像仓库(比如各种云服务商的容器镜像服务地址)。配置方法在后面的3.4和4.3小节里我会分别演示Windows和Ubuntu下的具体操作。提前说这个是因为很多新手在装好Docker之后发现跑不起来第一个容器,根本不是Docker没装好,而是镜像拉不下来,然后误以为安装过程有问题,直接重装系统,太冤了。
3. Windows环境下Docker Desktop安装实操,一步步照着做
接下来进入正题。Windows装Docker,我用的是Docker Desktop,这是官方出品、对普通用户最友好的一条路。整体流程分成四步:启用WSL、下载安装包、做基础配置、启动验证。
3.1 先手动启用WSL2,别等装完再报错
现在的新版Docker Desktop其实会自动帮你处理WSL2的启用,但自动处理有时候会失败,失败之后弹出来的报错又非常抽象,对新手极不友好。我的建议是:先手动把WSL2装好,再装Docker Desktop,这样每一步都是可控的。
以管理员身份打开PowerShell,先执行下面这条命令:
bash复制wsl --install
这条命令会启用WSL功能,并且默认安装Ubuntu发行版。执行完之后会要求重启电脑,先别急着重启,再执行一条命令把默认版本设为WSL2:
bash复制wsl --set-default-version 2
顺便说一句,wsl --install的效果相当于把两个旧命令一起执行了:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux和Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform。如果你执行wsl --install报错,可以手动把这两条命令加上重启试试。
重启之后,在命令行输入wsl --status,如果显示默认版本: 2,说明WSL2环境已经准备好。
这里还有个知识点:WSL2对内存的占用是动态的,默认会拿到宿主机内存的50%。如果你电脑内存本身只有8G,再跑Docker桌面端和你的IDE、浏览器,就很容易卡。解决方案是在用户主目录下建一个.wslconfig文件,写上:
ini复制[wsl2]
memory=4GB
processors=4
swap=0
这样可以把WSL2的内存限制到4GB,为宿主机留出足够空间。这个文件不是每次都要建,但你如果感觉装了Docker之后电脑变卡了,这是第一个需要排查的位置。
3.2 下载Docker Desktop并完成安装
WSL2搞定之后,去Docker官网下载Docker Desktop安装包。安装包大概四五百兆,下载时如果网速不好,可以找国内镜像源的下载链接,这不算什么高深技巧,就是省时间。
双击安装包,进入安装界面之后基本全程下一步就行。有两个选项值得注意:一个是Use WSL 2 instead of Hyper-V,保持勾选,这决定后续Docker跑在哪层虚拟化上;另一个是Add shortcut to desktop,可勾可不勾,看个人习惯。
装完之后系统会提示你重启电脑。重启完之后,桌面上打开Docker Desktop,第一次启动会有一个接受服务协议的弹窗,点Accept就行。
正常情况下,Docker Desktop会开始启动引擎,右下角的鲸鱼图标会从动画状态变成静止状态,表示启动成功。如果这里有任何一步报错,直接跳到第5章看排查方案,大部分坑我都列在那里了。
3.3 Docker Desktop的初始设置
启动之后,右上角齿轮进入Settings,有几个设置建议第一时间改掉,不然后面用着难受。
第一,General面板里,默认启动行为设置为“Launch Docker Desktop when you log in”,省得每次开机手动打开。第二,Resources -> Advanced里,CPU和内存分配别默认拉满,稍微调小一点,给宿主系统留资源。第三,Docker Engine面板里的JSON配置,先不用动,后面配置镜像加速时改这里。
关于磁盘映像位置:Docker Desktop默认会把镜像数据和容器数据放在C:\Users\你的用户名\AppData\Local\Docker下,如果C盘空间紧张,需要在Resources -> Advanced里把虚拟磁盘位置改到D盘或其他大分区。这个改法最好在还没有拉取大量镜像之前做,否则迁移又要折腾半天。迁到另一个盘之后,Docker会要求重启,确认路径无误就行。
3.4 Windows下配置镜像加速
这是Windows下最容易忽略但回报最高的一个步骤。还是Settings里,切到Docker Engine选项卡,把下面的JSON内容替换进去:
json复制{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.nju.edu.cn"
]
}
这些镜像加速地址,如果某一个失效了,就去Docker Hub或相关社区找最新的替代。国内可用的镜像加速源一直在变动。替换完之后点Apply & Restart,Docker会重启,之后拉取Docker Hub上的镜像速度会明显提升。
顺便提醒一句:配置镜像加速只是改镜像仓库地址,不会影响Docker本身的使用逻辑。而且如果你后续在公司或云服务器上拉取的是私有仓库镜像,这些加速地址也完全不冲突,公共仓库走加速,私有仓库走你自己的登录凭据。
3.5 验证Windows安装是否成功
命令行打开PowerShell,执行:
bash复制docker --version
如果出现类似Docker version 27.x.x,说明客户端装好了。再执行:
bash复制docker run hello-world
如果看到Hello from Docker!,说明不止装好了,而且能正常从镜像源拉取镜像、创建容器、运行容器,整个链路都通了。
这个hello-world镜像虽然很小,但它能验证的事情其实不少:Docker引擎在运行、镜像源可访问、容器能创建并能运行。任何一环出问题,这里都会报错。很多人问我怎么确认Docker装好了,我通常让他跑这条命令,比看一堆文档有用得多。
4. Ubuntu环境下Docker Engine安装实操,服务器部署的核心
服务器上部署FastAPI项目,大概率面对的是Ubuntu系统,所以我单独把Ubuntu的Docker安装拿出来讲。服务器上不装桌面端,只装Engine就够了,这也是在Linux上唯一合理的安装方式。
4.1 通过官方apt源安装Docker Engine
用apt源安装最稳,方便后续用apt upgrade统一升级Docker相关组件。整个流程可以分成两组命令,我用的是Ubuntu 22.04/24.04 LTS环境。
先安装依赖并添加Docker官方GPG密钥:
bash复制sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
然后添加apt源仓库:
bash复制echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$UBUNTU_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
这里解释一下为什么那么麻烦:Docker官方的apt仓库不像Ubuntu自带的源一样在系统安装时配好了,需要你自己手动添加。GPG密钥的作用是确保下载的包是官方的、没被篡改的。$(dpkg --print-architecture)会自动识别你的CPU架构(x86_64还是arm64),这样同一套命令在树莓派上也能跑。
然后正式安装:
bash复制sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
这六个包分别对应Docker引擎、命令行客户端、容器运行时、构建扩展和Compose插件。装上之后,默认只有root用户能执行docker命令,普通用户用docker命令会报权限不足。
把当前用户加入docker组来解决:
bash复制sudo usermod -aG docker $USER
newgrp docker
重新登录之后执行docker version,就能正常使用了。
4.2 懒人方案:官方脚本一键安装
如果你只是在自己开发机上临时用,不想用前面那么多条命令,可以直接用Docker官方提供的一键安装脚本:
bash复制curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
脚本会检测系统、添加源、安装Docker Engine并用systemd启动服务。优点是快,缺点是装完之后系统里多了一堆自动化步骤,你不太清楚具体状态,后续遇到问题不好回滚。
我的建议是:正式服务器或生产环境,别用一键脚本,手动apt装至少你知道自己加了什么源、装了哪些包;临时开发机可以省时间用脚本。
4.3 Ubuntu下的镜像加速配置
Ubuntu的Docker Engine配置文件在/etc/docker/daemon.json,没有就创建一个:
bash复制sudo mkdir -p /etc/docker
然后用编辑器写入:
json复制{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.nju.edu.cn"
]
}
保存之后重启Docker:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
检查配置是否生效:
bash复制docker info | grep -A 5 "Registry Mirrors"
如果列出了你配置的镜像地址,说明加速生效了。这一步做完,后面拉MySQL、Redis、Python镜像会舒服很多。
4.4 启动Docker服务并设置为开机自启
安装Docker Engine后,服务默认会被systemd启用,但为了保险起见,还是手动确认一下:
bash复制sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
status命令如果显示Active: active (running),说明一切正常。以后如果你改了daemon.json或者加挂磁盘,需要用到sudo systemctl restart docker,这条命令要记住,它是Docker遇到配置问题后的第一响应。
这里还要扩展一点:Docker数据默认存储在/var/lib/docker,服务器上最好把这块分配到独立的数据盘或者至少确保根分区空间够大。可以用df -h看一下磁盘使用率,如果根分区紧张,考虑改Docker数据目录,或者用软链接把/var/lib/docker指到大分区。改数据目录前一定要先把Docker服务停掉,否则会出现数据不一致。
4.5 验证Ubuntu安装
跟Windows一样,跑一次docker run hello-world验证。如果看到类似:
code复制Hello from Docker!
This message shows that your installation appears to be working correctly.
说明环境完全OK。如果提示permission denied while trying to connect to the Docker daemon socket,那就是用户组权限没配上,回到4.1那一节把usermod和newgrp执行一遍。
5. 装完之后马上能做的事:FastAPI项目常用服务编排实践
环境装好不能放着吃灰,我直接给你演示三个跟FastAPI开发强相关的实操场景。很多网上的热词比如“docker安装mysql8.0并使用”、“docker安装redis主从”,其实本质就是这两个服务用Docker跑起来的事。
5.1 用docker compose拉起MySQL 8.0并接入FastAPI
以后的实战篇里,我会用FastAPI对接MySQL做完整示例,这里先把MySQL拉起来。不推荐直接用docker run参数一大堆去跑,而是建议在一个空目录里创建docker-compose.yml文件。
yaml复制services:
mysql:
image: mysql:8.0
container_name: fastapi-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: fastapi_demo
MYSQL_USER: fastapi_user
MYSQL_PASSWORD: fastapi_pass
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
mysql_data:
在docker-compose.yml所在目录执行docker compose up -d,MySQL 8.0就启动了。
这里我解释几个关键配置,新手最容易懵的就是volumes和ports。ports里的3306:3306表示把容器内的3306端口映射到宿主机的3306端口,这样你本地的Navicat或者其他数据库客户端连localhost:3306就能访问MySQL,不需要进容器。volumes里的mysql_data是命名卷,作用是把MySQL的数据文件持久化到宿主机磁盘上。没有这一步,你删了容器,数据库里的数据就全部蒸发了。我在自己项目里吃过大亏,很不希望你重蹈覆辙。
检查是否跑起来:
bash复制docker ps
如果fastapi-mysql的状态是Up,再进入容器测试连接:
bash复制docker exec -it fastapi-mysql mysql -uroot -p
输密码进入MySQL命令行之后,show databases;看看有没有fastapi_demo这个库。后面FastAPI的SQLAlchemy连接串就可以写成:
python复制DATABASE_URL = "mysql+pymysql://fastapi_user:fastapi_pass@localhost:3306/fastapi_demo?charset=utf8mb4"
有同学可能会问,为什么端口映射用的是3306而不是其他端口?其实可以换成任意端口,比如13306:3306,这样把3306留给本机已有的MySQL。但这个建议在本地已经有3306端口被占用的情况下使用,否则就按默认的3306来,少一层心智负担。另外,本地同时装了MySQL和Docker容器里的MySQL,最容易出现的错误就是端口冲突,要把其中一边的端口改掉,否则另一个服务直接起不来。
5.2 用Docker临时跑一个Redis做缓存测试
FastAPI做接口缓存或者配合Celery用Redis是高频场景。测试环境用Docker跑Redis比在本地编译安装省事一万倍:
bash复制docker run -d --name fastapi-redis -p 6379:6379 redis:7-alpine
然后进入容器测试:
bash复制docker exec -it fastapi-redis redis-cli ping
返回PONG就代表Redis就绪。FastAPI里连接Redis可以用:
python复制import redis
r = redis.Redis(host="localhost", port=6379, decode_responses=True)
r.set("key", "FastAPI Redis OK")
刚才那条docker run命令我拆开解析一下:-d是后台运行容器,--name给容器起名字便于管理,-p 6379:6379映射端口,redis:7-alpine是镜像名称,alpine是体积精简的Linux发行版,镜像比完整版小很多。如果后面你在正式环境配置Redis主从,思路就是起两个容器,一个做主节点一个做从节点,从节点的启动命令里加参数指向主节点,本质也就是多跑几个容器的问题,学会了第一篇,后面都是重复操作。
5.3 后续实战预告:Docker Compose会成为你的主力工具
以上两个服务如果分开用docker run去搞,场景多了之后会非常混乱。Docker Compose的价值就是把你项目依赖的所有服务写到一个docker-compose.yml文件里,一条docker compose up -d全部拉起来,一条docker compose down全部停掉。FastAPI项目后期的数据库、Redis、消息队列、镜像服务,一个Compose文件全搞定。
我打算在后面第27篇开始写完整的FastAPI + MySQL + Redis + Vue3的前后端分离部署实战。到时候会从一个空的目录开始,用uv创建虚拟环境,把FastAPI项目写到容器里跑起来。所以这一篇的Docker安装,不是孤立的知识点,是整个容器化实战的地基。地基打得牢不牢,直接决定后面项目能不能顺利跑起来。
5.4 给Windows开发环境补一条提醒
如果你是Windows开发环境,本地数据库服务和容器里的服务同时开启,很容易产生端口冲突。比如你Windows上已经装了MySQL并且占用了3306端口,再启动Docker里的MySQL就会报端口绑定失败。解决办法就是上一小节说的,把容器端口映射改掉,这不算什么问题,但新手最容易在这里卡住,我提前给你打个预防针。
还有,Windows下Docker Desktop的配置文件如果改了daemon.json,重启Docker时一旦重启失败,它可能不会自动回滚配置。你检查的时候,看到Docker鲸鱼图标变红或者弹窗报错,第一反应不要是重装,先看一眼%USERPROFILE%\AppData\Local\Docker下面的日志,大多数问题都是镜像加速地址不可用、磁盘空间不足或者WSL2出了问题。
6. 安装失败的常见问题与排查技巧实录
这一章是我写整篇文章最想让你仔细看的部分,因为我发现很多人安装Docker卡住,不是操作不对,而是压根不知道去哪里看报错信息。下面按热词里出现的报错频率,一个坑一个坑给你过一遍。
6.1 Docker Desktop启动失败:virtualization support not detected
这个报错我见的次数最多,基本就是虚拟化没开或没完全开。排查顺序是这样的:
先用Windows任务管理器确认CPU虚拟化状态是不是“已启用”。如果显示“已启用”,但Docker Desktop仍报这个错,那问题大概率出在Hyper-V或WSL2组件没启全。用管理员PowerShell跑一下:
bash复制dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
然后重启,再启动Docker Desktop试试。如果BIOS里没开虚拟化,任务管理器直接会显示“已禁用”,那就必须重启进BIOS去设置。有些电脑的BIOS里虚拟化选项藏得比较深,名字可能叫Advanced -> CPU Configuration -> Intel Virtualization Technology,注意是Intel的CPU而不是AMD的SVM。
6.2 WSL相关的启动报错
如果你看到报错里有WSL 2 installation is incomplete或者The Windows Subsystem for Linux optional component is not enabled,说明WSL2组件没弄好。处理方式是在管理员PowerShell里执行:
bash复制wsl --update
wsl --shutdown
更新完之后重启WSL,再启动Docker Desktop。如果wsl --update提示找不到更新,检查一下系统版本是不是太老,Windows 10 1903以下的版本要先升级系统,这个没有绕路办法。
6.3 Docker命令提示权限不足
这个主要出现在Linux环境上。docker ps报Got permission denied while trying to connect to the Docker daemon socket,或者是dial unix /var/run/docker.sock: connect: permission denied,说明普通用户没有socket访问权限。
解决方案就是前面说的:
bash复制sudo usermod -aG docker $USER
newgrp docker
注意usermod生效要重新登录。如果你是在服务器上通过SSH连的,就断开重连一次。另外,别为了方便直接sudo chmod 777 /var/run/docker.sock,相当于把Docker的完全控制权交给所有用户,非常危险,不推荐这么干。
6.4 拉取镜像超时或太慢
如果docker pull卡在等待层下载,多半是镜像加速没配好。对照3.4或4.3重新配置registry-mirrors。还有可能出现一种情况:加速地址失效了。网上的镜像加速地址变动快,唯一的检测标准是docker pull hello-world到底能不能通。如果不能通,就把daemon.json里的镜像地址换掉,保留多个加速源能提高稳定性。
6.5 端口被占用导致容器无法启动
Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use,说明你映射的端口已经被其他进程占用了。
排查命令:
bash复制netstat -ano | findstr :3306
找到占用端口的PID,然后去任务管理器结束那个进程,或者反过来改docker-compose里的端口映射。这个属于容器使用初期最高频的报错之一,几乎每个玩Docker的人都遇到过。
6.6 pycharm安装FastAPI失败的关联提醒
热词里出现了“pycharm安装fastapi失败报错”,这个跟Docker的关系其实很微妙,这里多写一句。很多人在PyCharm里新建项目时勾选了创建venv,但因为网络问题或者Python解释器版本太旧,导致FastAPI装到一半失败。如果你打算沿用本系列文章的建议、用uv来管理虚拟环境:
bash复制uv init fastapi-demo
cd fastapi-demo
uv add fastapi uvicorn[standard]
uv是个用Rust写的Python包管理器,创建虚拟环境和安装依赖的速度比pip快很多。装完之后启动FastAPI:
bash复制uv run uvicorn main:app --reload
这个跟Docker的关系在哪里?等你开发完项目,要把FastAPI装进容器时,容器里同样需要一个干净、可复现的Python环境。uv的uv.lock文件能锁定精确到每个依赖的版本,放到Docker镜像构建阶段,可以避免“本地能跑,容器里跑不起来”的经典问题。所以这里一并推荐给你,后面实战篇会经常用到。
6.7 常见问题速查表
方便你后期排查,我把核心问题整理成一张表,可以先存一下:
| 症状 | 大概率原因 | 解决方案 |
|---|---|---|
| Docker Desktop无法启动,提示virtualization support not detected | BIOS虚拟化未开启或WSL2组件未装全 | 进BIOS开启虚拟化;PowerShell执行dism启用WSL与VirtualMachinePlatform |
| docker命令不存在 | 安装不完整或没重启 | 重装Docker或重启电脑;确认PATH中包含Docker安装目录 |
| docker pull一直卡住 | 镜像加速没配或加速地址失效 | 修改registry-mirrors,换可用的加速源 |
| docker启动容器报“bind: address already in use” | 宿主机端口被占用 | 换映射端口或释放原端口 |
| permission denied while trying to connect to the Docker daemon socket | 当前用户不在docker组 | sudo usermod -aG docker $USER后重新登录 |
| 启动WSL报错0x80370102 | BIOS里虚拟化被禁用 | 进入BIOS开启虚拟化后重启 |
| Docker Desktop显示login failed | 未登录Docker账号 | 运行docker login,或跳过登录直接使用公共镜像 |
| 磁盘空间不足导致容器启动失败 | Docker数据目录所在盘满了 | 清理无用镜像(docker system prune -a),或把数据目录迁移到大分区 |
7. 最后再分享几个Docker顺手的小技巧
文章到这里,其实安装、验证、常见排查都已经讲完了。最后这部分算是个人经验加餐,分享几个我在日常FastAPI开发里用得最顺手的小习惯,你装完Docker之后马上就能用上。
第一,别急着用一个又一个docker run去起服务,尽早习惯用docker compose文件管理一切。FastAPI项目加上数据库、缓存、队列,服务一多起来,Compose文件的可维护性远超一堆裸命令,而且docker compose logs -f --tail=50看日志也方便很多。第二,开发阶段容器起完了要确认端口和网络是否正常,多用docker ps、docker logs,不要只看容器是否在运行列表里。第三,用docker exec -it <容器名> bash进容器查看文件路径、检查环境变量,这是排障必备技能。
关于Docker Desktop在Windows上的资源占用,我再多说一句:如果你只是偶尔做FastAPI开发,不需要一直开着Docker Desktop,因为它常驻后台会吃不少内存。用的时候启动,不用了右下角退出就行,不影响已创建的compose项目。
我个人的体会是,Docker本身不复杂,复杂的是它跟操作系统、硬件虚拟化、网络的组合方式。尤其在中国网络环境下,安装过程和镜像拉取的问题会被放大。你只要把环境建好、加速配好、常见报错排查思路理顺,后面所有容器化的实战都会很顺。这一篇的任务是让你“把Docker真正跑起来”,下一篇我会直接从FastAPI项目的容器化改造开始,把前面学到的Docker知识一点点串成线,咱们到时候见。
