主题
14.3.1 应用商店与 Docker 基础
本节目标:理解 Docker 的核心概念,学会用 1Panel 应用商店一键安装和管理各种服务。
小明打开 1Panel 的应用商店,看到数据库、Web 服务器、监控工具整整齐齐地排列着——"这不就是手机应用商店吗?点一下就装好了。"
Docker 到底是什么?
老师傅说:"你手机上的 App 都是从应用商店下载的安装包,点一下就装好了。Docker 也是这个思路,只不过是给服务器用的。"
- 镜像(Image):就像应用商店里的安装包。"PostgreSQL 18 镜像"就是一个打包好的数据库安装包,里面包含了所有需要的文件和配置。
- 容器(Container):就像你手机上运行的 App。不同的是,在这里同一个安装包可以装多次,每个都是独立运行的,互不影响。
- 仓库(Registry):就像应用商店。Docker Hub 是最大的"服务器应用商店",里面有几十万个现成的应用安装包。
为什么用 Docker?
不用 Docker 的话,你要在服务器上手动安装 PostgreSQL、配置 Redis、调 OpenResty……每个软件的安装方式都不一样,版本冲突、依赖缺失是家常便饭。有了 Docker,每个应用都在自己的"集装箱"里运行,互不干扰,装错了直接删掉重来,不会弄脏你的服务器系统。
1Panel 应用商店
1Panel 把 Docker 的操作封装成了图形界面。打开面板的「应用商店」,你会看到各种常用软件,点一下就能安装。

常用应用一览:
| 应用 | 用途 | 安装建议 |
|---|---|---|
| PostgreSQL | 关系型数据库 | 项目必装,设置好密码 |
| Redis | 缓存数据库 | 需要缓存或会话管理时安装 |
| OpenResty | Web 服务器/反向代理 | 绑定域名时必装 |
| Node.js | 运行 Node.js 项目 | 部署 Next.js 等项目时需要 |
OpenResty 是什么?
OpenResty 是一个高性能的 Web 服务器,基于 Nginx 构建。它的作用是:
- 处理 HTTP 请求:接收用户的访问请求
- 提供静态文件:返回 HTML、CSS、JS、图片等
- 反向代理:把 API 请求转发给后端服务
- 绑定域名:让你的网站通过域名访问
简单来说,OpenResty 就是你网站的"门面"——用户访问你的域名时,第一个接待他们的就是 OpenResty。如果你要绑定域名(如 yourdomain.com),就必须安装 OpenResty。
小明在应用商店里搜索 PostgreSQL,点击「安装」进入应用详情页。弹出的配置页面让他填端口号、管理员用户名和密码。在「高级设置」中还可以选择是否暴露外部端口、设置资源限制等。他按照提示填好,点确认——弹出安装日志界面,进度条跑了十几秒,状态变成了"运行中"。整个过程比他想象的简单得多。安装完成后,可以在「应用商店 - 已安装」页面看到这个应用。

安装过程中,1Panel 会让你填写一些配置(端口、密码等)。老师傅提醒:"安装时设置的密码一定要记下来,后面配置环境变量要用。"
镜像拉取失败?配置镜像加速
如果安装应用时镜像拉取超时,可以在「容器 > 配置」页面检查镜像加速地址是否已配置。安装 Docker 时如果选择了自动配置加速,这里通常已经填好了。
应用安装示例:以 Halo 博客系统为例
Halo 是一个开源的博客系统,在 1Panel 应用商店中可以一键安装。以下展示完整的安装和初始化流程,帮助你理解应用商店的工作方式。
数据库选择:安装时需要选择数据库类型(PostgreSQL 或 MySQL) 
初始化配置:首次访问时进入初始化向导 
用户设置:创建管理员账号 
管理后台:安装完成后的管理界面 
前台效果:博客的访客视图 
插件生态:支持通过插件扩展功能 
这个流程展示了应用商店安装的典型步骤:选择配置 → 等待安装 → 初始化设置 → 开始使用。其他应用(如 Umami、n8n)的安装流程类似。
DBMS vs Database:装完数据库后的第一步
小明装完 PostgreSQL 后,老师傅让他去面板左侧菜单的「数据库 - PostgreSQL」页面新建一个具体的数据库(如 my_app_db)。
"等等,我不是刚装了数据库吗?怎么还要再建一个?"
老师傅解释:"你装的是数据库软件(DBMS),就像安装了 Excel 软件。但你还没有创建 .xlsx 文件。安装一次 PostgreSQL,可以创建无数个独立的数据库供不同项目使用。"
小明在「数据库 - PostgreSQL」页面点击「创建数据库」,填了数据库名、用户名、密码,选择了访问权限,几秒钟就创建好了。点击列表上方的「连接信息」按钮,他看到了地址、端口、管理员用户名和密码——这些就是后面配 .env 时要用的。
DBMS vs Database
- DBMS(数据库管理系统):如 PostgreSQL、MySQL,是管理数据的软件
- Database(数据库):DBMS 里创建的具体数据库,如
myapp_db
比喻:DBMS 是一栋楼,Database 是楼里的房间。你在 1Panel 应用商店安装的是"楼"(DBMS),然后在里面创建"房间"(Database)给你的应用用。
详细的数据库设计和操作,详见第 6 章《数据持久化与数据库》。

容器化数据库的连接地址
1Panel 通过 Docker 安装的数据库采用容器化方式运行,连接信息页面会提示不同场景对应不同的连接地址。从容器内连接用容器名,从主机连接用 127.0.0.1——后面「容器网络基础」会详细解释。
容器管理
安装完应用后,有两个地方可以管理容器:
- 「应用商店 - 已安装」:管理通过应用商店安装的应用,支持重建、重启、启动、停止、卸载、查看参数等操作。点击「参数」按钮可以查看和修改应用的配置参数。
- 「容器」:管理所有 Docker 容器(包括应用商店安装的和手动创建的)。每个容器一行,行内有「终端」「日志」按钮,以及「更多」菜单(编辑、升级、监控、制作镜像、删除、重命名)。
小明点进「容器」页面,看到 PostgreSQL、OpenResty 都在跑,每个容器旁边有绿色的"运行中"标识。

常用操作:
| 操作 | 在哪里操作 | 说明 | 对应命令 |
|---|---|---|---|
| 启动/停止/重启 | 「已安装」或「容器」 | 控制容器运行状态 | docker start/stop/restart 容器名 |
| 查看日志 | 「容器」→ 容器行 → 日志 | 支持按时间段筛选、实时追踪、下载 | docker logs 容器名 |
| 进入终端 | 「容器」→ 容器行 → 终端 | 选择命令(如 /bin/bash)和用户后连接 | docker exec -it 容器名 bash |
| 查看监控 | 「容器」→ 容器行 → 更多 → 监控 | CPU、内存、磁盘 IO、网络使用情况 | docker stats 容器名 |
| 重建 | 「已安装」→ 重建 | 删除容器并基于当前配置重新创建,持久化数据保留 | — |
小明在「已安装」页面看到了刚装的 PostgreSQL,状态是绿色的"运行中"。他试着点了"停止",状态变成红色;再点"启动",几秒钟就恢复了。这种掌控感让他觉得 Docker 确实好用——应用就像手机上的 App,随时开关。
日志是你最好的朋友
应用出问题时,第一反应不是去搜索引擎,而是先看日志。在「容器」页面点击目标容器,选择「日志」,就能看到实时输出——支持按最近一天、4 小时、1 小时、10 分钟筛选,还能开启「追踪」实时刷新。日志就是应用的实时自言自语——它会告诉你"我在找数据库但找不到""我缺了一个环境变量",比你自己猜的准得多。90% 的问题,日志里都有答案。

数据持久化:Volume 挂载
小明好奇:"容器删了,我的数据会不会丢?"
答案是:如果配置了 Volume 挂载,数据不会丢。
老师傅解释:"容器就像一个临时工位,你走了工位就清空了。但 Volume 是你的专属文件柜,不管你换多少次工位,文件柜里的东西一直在。"
1Panel 安装的应用默认都会配置 Volume,数据存储在服务器的 /opt/1panel/ 目录下。你可以在「容器 - 存储卷」页面查看和管理所有 Volume。所以你可以放心地删除、重建容器,数据不会丢失。
小明试了一下:停掉 PostgreSQL 容器,再重新启动,数据库里的数据还在。"就像换了个工位,但文件柜没动。"
bash
# 查看所有 Volume
docker volume ls
# 查看某个 Volume 的详细信息
docker volume inspect 1panel-postgresql-data备份 Volume 才是真保险
虽然 Volume 不会因为删容器而丢失,但如果服务器硬盘坏了,数据照样没了。定期备份 Volume 数据到本地或云存储,才是真正的保险。1Panel 提供了计划任务功能,可以设置自动备份。
容器网络基础
这是新手最容易踩坑的地方。小明配 DATABASE_URL 时填了 localhost,连接失败——报错 Connection refused,看起来像是数据库没启动,但数据库明明在跑。
核心规则:localhost 在容器里指的是容器自己,不是服务器主机。
你在家喊"妈",你妈会应。你在朋友家喊"妈",应的是朋友的妈。容器里的 localhost 也一样——每个容器的 localhost 都是它自己,不是服务器主机。
| 场景 | 连接地址 | 原因 |
|---|---|---|
| 容器 A 连接容器 B | 用容器名(如 1Panel-postgresql-ukow) | 同一 Docker 网络内,容器名就是主机名 |
| 服务器主机连接容器 | 用 127.0.0.1 或 localhost | 容器端口映射到了主机 |
| 外部浏览器访问 | 用服务器公网 IP + 映射端口 | 通过端口映射转发 |
1Panel 容器命名规则
1Panel 创建的数据库容器名遵循 1Panel-{数据库类型}-{随机4位字母} 的格式:
1Panel-postgresql-ukow1Panel-redis-w94p1Panel-mysql-abcd
你可以在「容器」页面查看实际的容器名。
小明把 .env 里的 localhost 改成 1Panel-postgresql-ukow(PostgreSQL 容器的实际名字),重启应用——连接成功了。"原来就差一个词。"他感叹,这个坑虽然小,但不知道的话能卡你半天。
举个例子:你的 Node.js 应用跑在容器里,PostgreSQL 也跑在容器里。在 .env 中配置 DATABASE_URL 时:
bash
# 正确:用 1Panel 创建的实际容器名
DATABASE_URL="postgresql://用户名:密码@1Panel-postgresql-ukow:5432/数据库名"
# 错误:用 localhost(容器里的 localhost 是它自己,找不到数据库)
DATABASE_URL="postgresql://用户名:密码@localhost:5432/数据库名"Redis 连接示例:
bash
# 有密码的情况(注意 : 后面是密码)
REDIS_URL="redis://:你的密码@1Panel-redis-w94p:6379"
# 无密码的情况
REDIS_URL="redis://1Panel-redis-w94p:6379"如何获取数据库用户名和密码?
在 1Panel 的「数据库」页面,点击对应数据库的「详情」或「连接信息」,可以看到:
- 用户名(可能是
postgres、root或你自定义的用户名) - 密码(安装时设置的密码)
- 容器名(在「容器」页面也能看到)
这个坑会浪费你几个小时
填错连接地址是新手部署失败的头号原因。报错信息通常是 Connection refused 或 ECONNREFUSED,看起来像是数据库没启动,但其实只是地址填错了。记住:容器找邻居用名字,主机找容器用 localhost。
下一步
Docker 基础搞定了。接下来实战部署——14.3.2 部署 Next.js 应用,把你的项目真正跑在服务器上。
