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和虚拟机的区别

notion image
  • 隔离性:在于隔离性上面,由于vm对操作系统也进行了虚拟化,隔离的更加彻底。而Docker共享宿主机的操作系统,隔离性较差。
  • 运行效率:由于vm的隔离操作,导致生成虚拟机的速率大大低于容器Docker生成的速度,因为Docker直接利用宿主机的系统内核。它们的启动速度是在数量级上的差距。
  • 资源利用率:在资源利用率上虚拟机由于隔离更彻底,因此利用率也会相对较低。 经典名句:虚拟机已死,容器才是未来

1.5 Docker架构

Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
notion image
notion image

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 开启虚拟化
可以通过任务管理器-性能,查看虚拟化是否开启
notion image
一般电脑都已经开启,如果没有开启,重启电脑,开机时按主板快捷键(联想F2、戴尔F12、华硕F8)进入BIOS,找到“Virtualization Technology”(虚拟化技术),设置为“Enabled”(启用),保存并重启电脑。
2.1.2 启用WSL和虚拟机平台功能
必须运行Windows10的 2004及更高版本(内部版本19041及以上)或Windows11
Win+R 输入winver,直接查看
在控制面板-程序-启用或关闭Windows功能中勾选适用于Linux的Windows子系统以及虚拟机平台(wsl2需要)
notion image
2.1.3 更新WSL内核
如果通过命令更新会非常慢。为了加快速度,直接从github里面下载最新版本。
下载完成后,双击安装。
notion image
注意:如果是arm架构请选择对应的文件。
测试:

2.2 Docker安装与验证

2.2.1 下载Docker安装包
访问Docker官方下载页,下载“Docker Desktop for Windows”安装包。
notion image
注意:如果是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,否则连接失败。
notion image
4.2.4 编写Python连接脚本(app.py):
app.py
4.2.5 验证效果
注意:这里前面已经安装果mysql,故Dockerfile用的image:
  • 常用命令
    • 如果启动失败,可以尝试其他命令。
      • 示例:
      本地访问:
      http://localhost:5000/docs#/
      notion image

      环境移植到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 = 一个临时房间,用完就

      ⚠️ 踩坑提醒

      1. exec 进不去容器?
        1. 说明容器没在运行,用 docker compose ps 检查状态,如果状态是 Exited,用 run 进去排查。
      1. run 里改的文件不会保存?
        1. 因为 --rm 会删除容器,所有修改都丢了。如果需要保存,去掉 --rm,但这样会留下一个停止的容器,需要手动清理。
      1. execrun 的网络是一样的吗?
        1. 是的,两个容器都在同一个 Compose 网络中,可以通过服务名访问其他容器。

      现在彻底搞清楚了吧?😊 如果还是有点晕,记住这句就行了:
      服务跑着就用 exec,服务没跑或只想测配置就用 run --rm
       
       
      镜像仓库:
       
      💡
      有关Docker安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
      Docker 笔记:两个配置文件Dockerfile 与 docker-compose.yml效率提升方法论
      Loading...
      迷途
      迷途
      OR的博客,用知识和技术创造未来!!!
      Announcement
      🎉OR科技,用心服务🎉
      -- 分享知识,点亮生活 ---
      保持热爱追逐远方
      路虽远行则将至
      事虽难不为不成
      为之则易不为则难
      👏欢迎您的来访👏
      距离2026年春节仅有
      -- 免责声明 ---
      ⚠️ 本站内容仅代表个人观点,可以转载,但请注明出处。 ⚠️ 本站分享内容仅供学习参考使用,请勿用于其他用途。