Last edited time
Jul 12, 2026 06:03 AM
password
AI summary
type
Post
status
Published
date
Jul 12, 2026
slug
docker
summary
tags
开发
工具
建站
Python
category
知行合一
icon
前言:
- 开发在自己电脑上跑得好好的,一放到测试 / 生产环境就报错。
- 换一台服务器,就要重新装系统、装依赖、配配置,步骤繁琐又容易出错。
- 项目版本一多,环境差异、依赖冲突、兼容性问题,会让开发和运维非常痛苦
Docker 正是为了解决这个痛点诞生的。它提供了一套标准化的环境打包与运行方案:把代码、依赖、配置、系统环境全部打包在一起,形成一个可移植的容器。
📝 Docker容器化部署
介绍
1.1 产生背景
在没有Docker之前,软件开发和上线会遇到一个经典难题:环境不一致。
- 开发在自己电脑上跑得好好的,一放到测试 / 生产环境就报错。
- 换一台服务器,就要重新装系统、装依赖、配配置,步骤繁琐又容易出错。
- 项目版本一多,环境差异、依赖冲突、兼容性问题,会让开发和运维非常痛苦
很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。Docker 正是为了解决这个痛点诞生的。它提供了一套标准化的环境打包与运行方案:把代码、依赖、配置、系统环境全部打包在一起,形成一个可移植的容器。这样一来:
- 开发只管写代码,容器里是什么环境,上线就是什么环境。
- 运维不用再反复配置机器,直接运行容器即可。
- 彻底解决了 “在我电脑上能跑,上线就不行” 的协作痛点。
1.2 Docker简介
- docker 是一个开源的应用容器引擎,基于Go语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
- Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
- 总之一句话:
只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作 。
1.3 Docker的优势
- 可移植性 Docker容器可以在任何支持Docker的环境中运行,包括本地开发环境、测试环境和生产环境,从而提高了应用程序的可移植性。
- 可伸缩性 Docker容器可以根据负载的变化进行快速扩展和收缩,从而更好地满足应用程序的需求。
- 隔离性 Docker容器提供了隔离的运行环境,从而使得不同容器中运行的应用程序互相隔离,避免了应用程序之间的干扰。
1.4 Docker和虚拟机的区别

- 隔离性:在于隔离性上面,由于vm对操作系统也进行了虚拟化,隔离的更加彻底。而Docker共享宿主机的操作系统,隔离性较差。
- 运行效率:由于vm的隔离操作,导致生成虚拟机的速率大大低于容器Docker生成的速度,因为Docker直接利用宿主机的系统内核。它们的启动速度是在数量级上的差距。
- 资源利用率:在资源利用率上虚拟机由于隔离更彻底,因此利用率也会相对较低。 经典名句:虚拟机已死,容器才是未来
1.5 Docker架构
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。


1.6 Docker核心概念
1.6.1 镜像(Image)—类比「软件安装包」
- 定义:镜像就是一个只读的模板,包含了运行某个应用程序所需的全部环境(比如操作系统、软件依赖、配置文件等)。
- 实操关联:我们后续会下载「mysql:8.0.45」镜像(MySQL 8.0.45的“安装包”)、「python:3.12」镜像(Python 3.12的“安装包”),这些镜像都是从官方仓库(Docker Hub)下载的,无需手动配置环境。
- 关键特点:只读(不能直接修改),可作为模板,创建多个容器。
1.6.2 容器(Container)—类比「已安装好的软件」
- 定义:容器是镜像的运行实例,是一个可读写的独立环境,相当于“把安装包安装好后,能直接使用的软件”。
- 实操关联:我们执行「docker run」命令,就是基于「mysql:8.0.45」镜像,创建并启动一个MySQL容器(相当于“安装并启动MySQL服务”);启动后,容器内的MySQL就能正常使用,且和本地其他环境互不干扰。
- 关键特点:可启动、停止、删除,多个容器相互独立;容器删除后,里面的数据默认会丢失(可通过“数据卷”保留,后续会讲)。
1.6.3 仓库(Repository)—类比「手机应用商店」
- 定义:仓库是用于存放和下载镜像的平台,相当于“镜像的聚集地”,最常用的是官方仓库Docker Hub。
- 实操关联:我们执行「docker pull 镜像名」命令,就是从Docker Hub下载对应的镜像(比如「docker pull mysql:8.0.45」,就是下载MySQL 8.0.45的镜像)。
- 官方仓库地址:https://hub.docker.com/ (无需注册也能下载公开镜像,注册后可保存自定义镜像)。
1.6.4 数据卷(Volume)—— 类比「电脑的D盘(专门存数据)」
- 定义:数据卷是Docker中用于持久化数据的工具,相当于“给容器挂一个独立的存储盘”,容器删除后,数据卷中的数据不会丢失。
- 实操关联:我们在Docker Compose配置中,会用「volumes: mysql-data:/var/lib/mysql」配置数据卷,用于保存MySQL的数据,这样即使删除MySQL容器,下次启动新容器,之前的数据库、表、数据依然存在,移植时数据也能保留。
1.7 核心工具
1.7.1 Dockerfile —自定义镜像的“构建脚本”
- 定义:Dockerfile是一个纯文本文件(无后缀名),包含一系列简单的指令,用于告诉Docker“如何构建自定义镜像”。
- 核心作用:解决“环境配置繁琐、版本不一致”的问题。比如我们需要一个“包含Python 3.12+pymysql依赖+自定义脚本”的镜像,无需手动安装Python和依赖,只要编写Dockerfile,执行一条命令,Docker就会自动构建出符合需求的镜像。
- 实操关联:后续我们会编写Dockerfile,构建一个包含Python环境和连接脚本的镜像,用于和MySQL容器联动。
1.7.2 Docker Compose —多容器的“一键管理工具”
- 定义:Docker Compose是一个用于管理多容器的工具,通过一个yaml格式的配置文件(固定命名为docker-compose.yml),定义多个关联容器的配置(比如镜像、端口、依赖关系),执行一条命令就能一键启动、停止所有容器。
- 核心作用:简化多容器部署。比如我们需要同时启动MySQL容器和Python容器,且Python容器要依赖MySQL容器(先启动MySQL,再启动Python),无需手动逐个启动,用Docker Compose一键搞定。
- 实操关联:后续我们会编写docker-compose.yml,配置MySQL(8.0.45)和Python两个容器,实现一键启动和联动。
Win11下Docker安装与卸载
Docker在Win11上运行需依赖WSL2(Windows子系统),必须先完成准备工作,否则Docker无法启动。
2.1 安装前准备
2.1.1 开启虚拟化
可以通过任务管理器-性能,查看虚拟化是否开启

一般电脑都已经开启,如果没有开启,重启电脑,开机时按主板快捷键(联想F2、戴尔F12、华硕F8)进入BIOS,找到“Virtualization Technology”(虚拟化技术),设置为“Enabled”(启用),保存并重启电脑。
2.1.2 启用WSL和虚拟机平台功能
必须运行Windows10的 2004及更高版本(内部版本19041及以上)或Windows11
Win+R 输入winver,直接查看
在控制面板-程序-启用或关闭Windows功能中勾选适用于Linux的Windows子系统以及虚拟机平台(wsl2需要)

2.1.3 更新WSL内核
如果通过命令更新会非常慢。为了加快速度,直接从github里面下载最新版本。
下载完成后,双击安装。

注意:如果是arm架构请选择对应的文件。
测试:
2.2 Docker安装与验证
2.2.1 下载Docker安装包
访问Docker官方下载页,下载“Docker Desktop for Windows”安装包。

注意:如果是arm架构请选择对应的文件。
- AMD64:适用于 99% 的 Intel Core(酷睿)和 AMD Ryzen(锐龙)处理器的电脑。(绝大多数人都是这个)
- ARM64:适用于高通的 Snapdragon(骁龙)处理器,或者苹果 M 系列芯片的 Mac 通过虚拟机跑 Windows 的情况。
2.2.2 安装Docker
双击下载的安装包,,点击“下一步”,默认安装即可,安装完成后Docker会自动启动,如果安装的过程中有阻止对host的修改,点击允许。
2.2.3 验证安装
打开Win11终端(CMD或PowerShell),执行以下两条命令,若均能显示版本号,说明安装成功:
2.3 Docker卸载
若Docker安装失败、版本不兼容,或无需使用Docker,可按以下步骤彻底卸载,避免残留文件影响后续操作:
2.3.1 停止Docker服务
找到任务栏右下角的 Docker 鲸鱼图标(可能在隐藏图标里,点 ^ 展开) ,右键点击 → 选择 Quit Docker Desktop / 退出 Docker Desktop ,等待几秒,Docker 就完全停止了
2.3.2 卸载Docker应用
打开 “控制面板” → “程序” → “卸载”,在搜索框输入“Docker Desktop”,点击右侧“三个点” → “卸载”,按提示完成卸载(过程约1-2分钟)。
2.3.3 删除 WSL 2 相关的 Docker 发行版(关键)
以管理员身份打开 PowerShell,执行
2.3.4 删除残留文件(可选,彻底清理)
- 删除用户目录下的Docker残留:打开文件资源管理器,进入 C:\Users\你的用户名.docker,删除整个.docker文件夹;
- 删除C:\Users\你的用户名\AppData\Local\Docker,docker-secrets-engine(WSL 虚拟磁盘、日志)
- 删除C:\Program Files\Docker(安装目录残留)
2.3.5 验证卸载
终端执行 docker --version,若提示“不是内部或外部命令”,说明卸载成功。
2.3.6 卸载wsl
- 右键wsl.2.6.3.0.x64.msi卸载wsl
- 取消勾选 虚拟机平台
- 取消勾选 适用于Linux的Windows子系统
案例1:Win11下Python连接MySQL
原来我们自己在windows上安装的MySQL,现在MySQL从Docker镜像下载。
基础案例适合初学者理解“镜像→容器→连接”的核心流程,手动操作、步骤简单,无需复杂工具,重点掌握“下载镜像→启动容器→本地连接”的逻辑。
3.1 下载并启动MySQL 8.0.45容器(Win11终端执行):
具体如下:
3.2.1 编写Python连接脚本
新建test_mysql.py文件,复制以下代码(将host改为localhost,密码与启动容器时一致)
test_pymysql.py
3.2.2 本地安装Python及依赖
确保本地已经有python环境以及安装了pymysql依赖
3.2.3 运行脚本
执行python test_pymysql.py,能看到MySQL版本和“连接成功”提示,即完成基础版连接。
案例2:Win11下FastAPI连接MySQL
进阶版是实际开发中最常用的方式,核心用到「Dockerfile」和「Docker Compose」两个工具,实现“一键启动多容器、环境可复用”,本节将两个工具融入实操,边用边理解。
4.1 核心工具说明
- Dockerfile 纯文本构建脚本,用于构建自定义镜像(比如包含Python环境+依赖+脚本的镜像),避免手动配置环境;
- Docker Compose 多容器管理工具,通过yaml配置文件,一键启动、停止多个关联容器(比如MySQL和Python容器),简化部署。
4.2 实操步骤
4.2.1 新建项目目录
在Win11桌面新建一个文件夹,命名为docker-fastapi-mysql(名称可自定义,后续命令对应即可)。
4.2.2 编写Dockerfile(构建Python自定义镜像):
进入docker-python-mysql目录,新建一个文本文件,删除后缀名(确保文件名为“Dockerfile”,无.txt),复制以下代码
先准备好依赖文件
- requirements.txt
- Dockerfile
4.2.3 编写docker-compose.yml(配置多容器):
- docker-compose.yml
💡 关键提醒MySQL密码为123456,可自定义修改,但需同步修改Python容器的MYSQL_PASSWORD,否则连接失败。

4.2.4 编写Python连接脚本(app.py):
app.py
4.2.5 验证效果
注意:这里前面已经安装果mysql,故Dockerfile用的image:
- 常用命令
- 如果启动失败,可以尝试其他命令。
- 示例:
本地访问:
http://localhost:5000/docs#/
环境移植到Ubuntu
准备好Ubuntu环境,这里省略,详见:docker官网
移植核心目标:将Win11下的“MySQL(8.0.45)+ Python”完整环境,移植到Ubuntu系统,无需重新配置,数据保留,两种移植方式
- 在线下载式(简单,适合网络良好场景)
- 离线同步式(无网络也能用,环境 100% 一致)
5.1 前置准备(两种方式都需执行)
5.1.1 在 Win11 终端进入docker-python-mysql目录,执行
5.1.2 确认 Win11 的核心文件 / 目录
确保 Win11 的docker-python-mysql目录包含以下文件(后续需上传到 Ubuntu):
docker-compose.yml(容器配置文件)
test_mysql1.py(Python 连接脚本,可选,镜像已包含)
Dockerfile(可选,离线同步式无需)
5.2 方式1:在线下载式(简单,推荐网络良好场景)
5.2.1 上传文件
将 Win11 下的docker-python-mysql目录(包含docker-compose.yml等核心文件)上传到Ubuntu 的/home/你的用户名/docker-python-mysql目录下。
5.2.2 Ubuntu 终端操作(一键启动)
离线同步式(无网络可用,环境 100% 一致)
5.3.1 查看 Win11 本地镜像(确认需要打包的镜像)
5.3.2 打包 MySQL 8.0.45 镜像(离线文件)
5.3.3 打包自定义 Python 镜像(关键)
5.3.4 准备同步文件清单(需上传到 Ubuntu)
- 镜像包:mysql-8.0.45.tar、python-app.tar
- 配置文件:docker-compose.yml
5.3.5 上传所有文件到 Ubuntu
将Win11的docker-python-mysql目录(含镜像包 + 配置)上传到Ubuntu的/home/你的用户名/docker-python-mysql
5.3.6 Ubuntu 离线导入镜像
5.3.7 修改 Ubuntu 的 docker-compose.yml
docker-compose.yml
5.3.8 验证
附录:Docker常用命令
8.1 镜像管理(核心高频)
命令 | 作用 | 示例 |
docker pull <镜像名:版本> | 拉取镜像(版本不写默认 latest) | docker pull mysql:8.0.26 |
docker images | 查看本地所有镜像 | docker images(精简)docker images -a(含中间层) |
docker rmi <镜像ID/镜像名> | 删除单个镜像 | docker rmi mysql:8.0.26 |
docker rmi -f $(docker images -q) | 强制删除所有本地镜像(慎用) | - |
docker search <关键词> | 搜索 Docker Hub 镜像 | docker search mysql |
docker build -t <自定义镜像名:版本> . | 基于 Dockerfile 构建镜像 | docker build -t my-app:1.0 . |
docker save -o <保存文件名.tar> <镜像名> | 导出镜像为压缩包(离线传输) | docker save -o mysql8.tar mysql:8.0.26 |
docker load -i <压缩包.tar> | 导入本地镜像压缩包 | docker load -i mysql8.tar |
8.2 容器管理(核心高频)
命令 | 作用 | 示例 |
docker run [参数] <镜像名> | 创建并启动容器(最核心) | docker run -d --name mysql-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.26 |
docker ps | 查看正在运行的容器 | docker ps(精简)docker ps -a(含已停止的) |
docker start <容器名/容器ID> | 启动已停止的容器 | docker start mysql-db |
docker stop <容器名/容器ID> | 停止运行中的容器(优雅停止) | docker stop mysql-db |
docker restart <容器名/容器ID> | 重启容器 | docker restart mysql-db |
docker rm <容器名/容器ID> | 删除已停止的容器 | docker rm mysql-db |
docker rm -f <容器名/容器ID> | 强制删除运行中的容器 | docker rm -f mysql-db |
docker rm -f $(docker ps -aq) | 强制删除所有容器(慎用) | - |
docker exec -it <容器名> <命令> | 进入容器交互终端(最常用) | docker exec -it mysql-db bash(进容器)docker exec -it mysql-db mysql -uroot -p(直接进 MySQL) |
docker logs <容器名> | 查看容器日志 | docker logs mysql-db(实时)docker logs -f mysql-db(实时跟踪) |
docker inspect <容器名/镜像名> | 查看容器/镜像详细信息(排障用) | docker inspect mysql-db |
8.3 Docker Compose 常用命令
分类 | 命令 | 作用 | 教程适配示例 |
核心启动 | docker compose up -d | 后台启动项目:自动下载/构建镜像、创建容器、启动服务,处理依赖 | docker compose up -d(启动 MySQL+Python) |
核心启动 | docker compose up -d mysql-db | 后台仅启动指定服务(如 MySQL) | docker compose up -d mysql-db(仅启动 MySQL) |
核心启动 | docker compose up python-app | 前台启动指定服务(如 Python),实时输出日志 | docker compose up python-app(前台运行 Python 脚本) |
停止管理 | docker compose stop | 停止所有运行中的服务(保留容器) | docker compose stop(停止 MySQL+Python) |
停止管理 | docker compose stop mysql-db | 仅停止指定服务(如 MySQL) | docker compose stop mysql-db(仅停止 MySQL) |
停止管理 | docker compose down | 停止并删除容器 + 自定义网络,保留镜像和数据卷 | docker compose down(停止项目,保留数据) |
状态查看 | docker compose ps | 查看运行中的容器状态 | docker compose ps(检查 MySQL 是否运行) |
状态查看 | docker compose ps -a | 查看所有容器状态(含已退出的 Python 容器) | docker compose ps -a(查看 Python 容器状态) |
docker compose比较
这两个命令,用更直白的大白话和生活场景来类比,保证你听完再也忘不了。
🏠 生活场景类比(先看故事)
想象你住在一个别墅小区(Docker Compose 项目),小区里有两栋楼:
- A 栋 =
mysql-db服务(MySQL 容器)
- B 栋 =
python-app服务(你的 FastAPI 容器)
现在,你要去 B 栋里干点活(比如查看文件、执行命令)。
场景 1:docker compose exec python-app bash
你直接从自己家(宿主机)走地道,溜进 B 栋,进去干完活,出来,B 栋还在那里,没任何变化。
- B 栋本来就是存在的(容器正在运行中)
- 你只是进去一趟,干点活
- 你离开后,B 栋继续保持原样运行
场景 2:docker compose run --rm python-app sh
你打电话让物业(Docker)在小区里临时建一栋一模一样的“B 栋复制品”,你进去干活,干完活后,物业当场把这栋复制品拆掉,消失得无影无踪。
- 原来那个 B 栋(正在运行的容器)根本没动
- 物业临时新建了个复制品(新容器)
- 你干完活,复制品立刻拆除(容器被删除)
📦 再对比一下
项目 | exec | run --rm |
容器是否存在 | 必须已经存在,且正在运行 | 不需要,会临时创建一个新的 |
执行完容器还在吗 | ✅ 在,继续运行 | ❌ 删除( --rm 作用) |
会对正在运行的服务产生影响吗 | 会(比如你修改了文件,会直接影响运行中的服务) | 不会(因为操作的是临时复制品) |
执行速度 | 快(直接进入已有容器) | 慢(要先创建容器,再执行命令,再删除) |
适用场景 | 日常查看日志、修改配置、调试正在运行的服务 | 测试 docker-compose.yml 配置是否正确、执行一次性任务 |
🧪 实战演示
✅ 什么时候用哪个?
你的需求 | 用哪个命令 |
服务正在运行,想进去看一下日志、改个配置 | docker compose exec python-app bash |
服务正在运行,想执行一次数据库迁移脚本 | docker compose exec python-app python migrate.py |
服务启动失败了,想进入容器排查原因 | docker compose run --rm python-app sh(因为服务没起来,exec 进不去) |
想测试 docker-compose.yml 里的环境变量是否正确 | docker compose run --rm python-app env |
想安装一个临时调试工具(比如 vim),但不希望污染运行中的容器 | docker compose run --rm python-app sh 进去安装 |
生产环境,想在不影响主容器的情况下测试新代码 | docker compose run --rm python-app python new_script.py |
🧠 记忆口诀
exec= 进 入已经开着的房间(进去出来,房间还在)
run --rm= 建 一个临时房间,用完就 拆
⚠️ 踩坑提醒
exec进不去容器?
说明容器没在运行,用
docker compose ps 检查状态,如果状态是 Exited,用 run 进去排查。run里改的文件不会保存?
因为
--rm 会删除容器,所有修改都丢了。如果需要保存,去掉 --rm,但这样会留下一个停止的容器,需要手动清理。exec和run的网络是一样的吗?
是的,两个容器都在同一个 Compose 网络中,可以通过服务名访问其他容器。
现在彻底搞清楚了吧?😊 如果还是有点晕,记住这句就行了:
服务跑着就用exec,服务没跑或只想测配置就用run --rm。
镜像仓库:
有关Docker安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
- Author:迷途
- URL:http://blog.ortech.nyc.mn/%E7%9F%A5%E8%A1%8C%E5%90%88%E4%B8%80/docker
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts





