01. 软件的集装箱:Docker
在理解Docker是什么之前,先想象一个问题: 你为什么能在任何一台电脑的浏览器里,都访问到百度,而且看到的页面都是一样的? 因为慕课网的服务,被打包并运行在一个标准化的环境里(服务器),你通过一个标准化的接口(HTTP)去访问它。
Docker 就是把你电脑上的软件,也进行这种“标准化打包”的工具。
镜像 (Image) :Docker 的“ 安装包 ”或者“ 模板 ”。它是一个只读的文件,里面包含了运行一个软件所 需的一切:操作系统文件、软件本身、依赖库、配置文件。比如,PostgreSQL 官方就制作好了一 个 postgres 镜像(就像 QQ 安装包一样)。
容器 (Container) :镜像的“ 运行实例 ”。你可以把镜像想象成一个“房子的设计图”,而容器,就是根 据这张图盖出来的一栋栋 可以住人、互相隔离 的“房子”。我们可以用同一个 postgres 镜像,启动多 个独立的PostgreSQL 数据库容器(就像安装了 QQ 这个“镜像”可以登录多个独立的 QQ 账号一 样)。
使用Docker的核心好处:
环境一致性 :彻底解决“在我电脑上可以,在你电脑上不行”的问题,而且 Docker 目前提供了几乎全 系统的支持,Windows、Linux、MacOS 下都可以运行。
隔离性 :每个容器都有自己独立的文件系统和网络空间,互不干扰,非常安全。
便携性 :你可以把你打包好的镜像,轻松地在任何安装了 Docker 的机器上运行。
快速部署 :告别繁琐的安装和配置步骤,一条命令就能启动一个完整的服务。
02. 快速上手:安装与核心命令
首先需要根据你的操作系统,从 Docker 官网下载并安装 Docker Desktop。这是最简单的方式,它会自 动处理好所有配置(开发环境推荐)。
安装完成后,启动 Docker Desktop。在你的终端(命令行)里,输入以下命令,如果能看到版本信息, 就代表安装成功了,如下:
docker --version
# 输出内容
Docker version 28.3.0, build 38b7060我们先学习最核心的三个命令,足以应对 80% 的场景。
docker pull <image_name>[:<version>] : 从Docker Hub(官方的镜像仓库) 拉取 一个镜像到 你的本地。
# 拉取最新版的PostgreSQL 16 镜像
docker pull postgres:16
# 拉取最新版的Redis镜像
docker pull redisdocker images : 查看 你本地已经下载了哪些镜像。
docker ps : 查看 当前正在运行的容器。
docker ps -a:查看所有容器,包括已经停止的。
Docker Hub 地址:https://hub.docker.com/,完成这一步相当于我们已经下载好 QQ 安装包 了,接下来 可以根据不同的账号密码(配置信息)尝试启动 QQ( 容器 ) 。
03. 启动 Postgres 与 Redis 容器
现在让我们用一条 docker run 命令,来启动我们的数据库服务。docker run 是 Docker 最核心、参数也 最多的命令。在终端里,复制并执行以下命令:
docker run -d \
--name manus-postgres \
-p5432:5432 \
-ePOSTGRES_USER=postgres \
-ePOSTGRES_PASSWORD=postgres \
-ePOSTGRES_DB=manus \
-v manus_postgres_data:/var/lib/postgresql/data \
postgres:latest这段命令看起来很复杂,其实拆分成几个部分,非常好理解:
docker run : 告诉Docker我们要创建一个并运行一个新的容器。
-d (--detach) : 后台运行 模式。执行后,终端会立刻返回,容器会在后台默默运行。
--name manus-postgres : 给我们的容器起一个好记的名字,方便管理。
-p 5432:5432 : 端口映射 。这是一个非常重要的概念!它的格式是主机端口:容器端口。这条命令的 意思是,把我们自己电脑(主机)的5432端口,映射到容器内部的5432端口(PostgreSQL默认监 听的端口)。这样,我们的FastAPI应用(运行在主机上)就能通过访问localhost:5432来连接到容 器里的数据库了!
-e ... (--env) : 设置环境变量 。这是我们向容器内部传递配置的方式。这里我们设置了数据库的默 认用户名、密码和要创建的数据库名称,与我们 config.py 中的配置保持一致。
-v manus_postgres_data:/var/lib/postgresql/data : 数据卷挂载 。这是 保证数据持久化 的关 键!
容器本身是“无状态”的,如果你删除了容器,容器里所有的数据都会丢失。
-v 参数的作用,就是把容器内部的一个目录(/var/lib/postgresql/data,这是 PostgreSQL 存 放数据的地方),“挂载”到 Docker 管理的一个 数据卷 (Volume) manus_postgres_data 上。 这样,所有的数据库文件,实际上都保存在了这个数据卷里。即使我们删除了 manuspostgres 这个容器,数据卷依然存在。下次我们再用同一个数据卷启动一个新的容器,之前的 数据就都回来了!
postgres:latest : 告诉 Docker,我们是基于哪个镜像来创建这个容器的。
检查一下 :执行docker ps,你应该能看到名为 manus-postgres 的容器正在运行!
启动 Redis 就简单多了:
docker run -d \
--name manus-redis \
-p6379:6379 \
-v manus_redis_data:/data \
redis逻辑是完全一样的:后台运行,命名,端口映射,数据卷挂载,Redis 镜像默认的数据存储目录是 /data 。对于镜像有哪些参数如果不熟悉,可以在 Docker Hub 上搜索该镜像,一般都可以找到非常详 细的文档说明。
04. 容器的生命周期管理
现在我们已经有了两个正在运行的容器(QQ),你还需要学会如何管理它们。
docker stop <container_name>: 停止 一个正在运行的容器。docker start <container_name>: 启动 一个已经停止的容器。docker logs -f <container_name>: 查看 容器的实时日志,f代表follow,在排查问题时非常 有用!docker rm <container_name>: 删除 一个容器。 注意:删除前必须先停止它。docker volume ls:查看所有的数据卷。docker volume rm <volume_name>:删除一个数据卷,这将永久删除你的数据!
简单吧,并且除了命令之外,Docker Desktop 也提供的可视化的操作界面,无论是下载/删除镜像、启 动/停止/删除容器、删除挂载卷,操作都非常简单,鼠标点点就可以完成。
恭喜你!学习到这里你已经掌握了使用 Docker 管理开发环境的最核心技能。现在,我们电脑上已经有了 一个专业、可靠、隔离的数据库开发环境,再也不用担心因为换电脑或者系统更新导致数据库出问题了 (回到主线)。
评论