Post

Docker初识

01. 软件的集装箱:Docker 在理解Docker是什么之前,先想象一个问题: 你为什么能在任何一台电脑的浏览器里,都访问到百度,而且看到的页面都是一样的? 因为慕课网的服务,被打包并运行在一个标准化的环境里(服务器),你通过一个标准化的接口(HTTP)去访问它。

先搞技术 阅读 9 点赞 0 评论 0

01. 软件的集装箱:Docker

在理解Docker是什么之前,先想象一个问题: 你为什么能在任何一台电脑的浏览器里,都访问到百度,而且看到的页面都是一样的? 因为慕课网的服务,被打包并运行在一个标准化的环境里(服务器),你通过一个标准化的接口(HTTP)去访问它。

Docker 就是把你电脑上的软件,也进行这种“标准化打包”的工具。

  • 镜像 (Image) :Docker 的“ 安装包 ”或者“ 模板 ”。它是一个只读的文件,里面包含了运行一个软件所 需的一切:操作系统文件、软件本身、依赖库、配置文件。比如,PostgreSQL 官方就制作好了一 个 postgres 镜像(就像 QQ 安装包一样)。

  • 容器 (Container) :镜像的“ 运行实例 ”。你可以把镜像想象成一个“房子的设计图”,而容器,就是根 据这张图盖出来的一栋栋 可以住人、互相隔离 的“房子”。我们可以用同一个 postgres 镜像,启动多 个独立的PostgreSQL 数据库容器(就像安装了 QQ 这个“镜像”可以登录多个独立的 QQ 账号一 样)。

使用Docker的核心好处:

  1. 环境一致性 :彻底解决“在我电脑上可以,在你电脑上不行”的问题,而且 Docker 目前提供了几乎全 系统的支持,Windows、Linux、MacOS 下都可以运行。

  2. 隔离性 :每个容器都有自己独立的文件系统和网络空间,互不干扰,非常安全。

  3. 便携性 :你可以把你打包好的镜像,轻松地在任何安装了 Docker 的机器上运行。

  4. 快速部署 :告别繁琐的安装和配置步骤,一条命令就能启动一个完整的服务。

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 redis

docker 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),你还需要学会如何管理它们。

  1. docker stop <container_name>停止 一个正在运行的容器。

  2. docker start <container_name>启动 一个已经停止的容器。

  3. docker logs -f <container_name>查看 容器的实时日志, f 代表follow,在排查问题时非常 有用!

  4. docker rm <container_name>删除 一个容器。 注意:删除前必须先停止它。

  5. docker volume ls :查看所有的数据卷。

  6. docker volume rm <volume_name> :删除一个数据卷,这将永久删除你的数据!

简单吧,并且除了命令之外,Docker Desktop 也提供的可视化的操作界面,无论是下载/删除镜像、启 动/停止/删除容器、删除挂载卷,操作都非常简单,鼠标点点就可以完成。

恭喜你!学习到这里你已经掌握了使用 Docker 管理开发环境的最核心技能。现在,我们电脑上已经有了 一个专业、可靠、隔离的数据库开发环境,再也不用担心因为换电脑或者系统更新导致数据库出问题了 (回到主线)。

评论