---
title: "14.3.1 应用商店与 Docker 基础"
---

# 14.3.1 应用商店与 Docker 基础

> **本节目标**：理解 Docker 的核心概念，学会用 1Panel 应用商店一键安装和管理各种服务。

小明打开 1Panel 的应用商店，看到数据库、Web 服务器、监控工具整整齐齐地排列着——"这不就是手机应用商店吗？点一下就装好了。"

## Docker 到底是什么？

老师傅说："你手机上的 App 都是从应用商店下载的安装包，点一下就装好了。Docker 也是这个思路，只不过是给服务器用的。"

- **镜像（Image）**：就像应用商店里的安装包。"PostgreSQL 18 镜像"就是一个打包好的数据库安装包，里面包含了所有需要的文件和配置。
- **容器（Container）**：就像你手机上运行的 App。不同的是，在这里同一个安装包可以装多次，每个都是独立运行的，互不影响。
- **仓库（Registry）**：就像应用商店。Docker Hub 是最大的"服务器应用商店"，里面有几十万个现成的应用安装包。


::: tip 为什么用 Docker？
不用 Docker 的话，你要在服务器上手动安装 PostgreSQL、配置 Redis、调 OpenResty……每个软件的安装方式都不一样，版本冲突、依赖缺失是家常便饭。有了 Docker，每个应用都在自己的"集装箱"里运行，互不干扰，装错了直接删掉重来，不会弄脏你的服务器系统。
:::

## 1Panel 应用商店

1Panel 把 Docker 的操作封装成了图形界面。打开面板的「应用商店」，你会看到各种常用软件，点一下就能安装。


![1Panel 应用商店页面](/images/Advanced/14-vps-ops-deploy/14-3-1-appstore-01.png)

常用应用一览：

| 应用 | 用途 | 安装建议 |
|------|------|---------|
| PostgreSQL | 关系型数据库 | 项目必装，设置好密码 |
| Redis | 缓存数据库 | 需要缓存或会话管理时安装 |
| OpenResty | Web 服务器/反向代理 | 绑定域名时必装 |
| Node.js | 运行 Node.js 项目 | 部署 Next.js 等项目时需要 |

::: tip OpenResty 是什么？
**OpenResty** 是一个高性能的 Web 服务器，基于 Nginx 构建。它的作用是：
1. **处理 HTTP 请求**：接收用户的访问请求
2. **提供静态文件**：返回 HTML、CSS、JS、图片等
3. **反向代理**：把 API 请求转发给后端服务
4. **绑定域名**：让你的网站通过域名访问

简单来说，OpenResty 就是你网站的"门面"——用户访问你的域名时，第一个接待他们的就是 OpenResty。如果你要绑定域名（如 `yourdomain.com`），就必须安装 OpenResty。
:::

小明在应用商店里搜索 PostgreSQL，点击「安装」进入应用详情页。弹出的配置页面让他填端口号、管理员用户名和密码。在「高级设置」中还可以选择是否暴露外部端口、设置资源限制等。他按照提示填好，点确认——弹出安装日志界面，进度条跑了十几秒，状态变成了"运行中"。整个过程比他想象的简单得多。安装完成后，可以在「应用商店 - 已安装」页面看到这个应用。

![1Panel 安装 PostgreSQL 配置页面](/images/Advanced/14-3-1-app-install-02.png)

安装过程中，1Panel 会让你填写一些配置（端口、密码等）。老师傅提醒："**安装时设置的密码一定要记下来**，后面配置环境变量要用。"

::: tip 镜像拉取失败？配置镜像加速
如果安装应用时镜像拉取超时，可以在「容器 > 配置」页面检查镜像加速地址是否已配置。安装 Docker 时如果选择了自动配置加速，这里通常已经填好了。
:::




::: details 应用安装示例：以 Halo 博客系统为例
Halo 是一个开源的博客系统，在 1Panel 应用商店中可以一键安装。以下展示完整的安装和初始化流程，帮助你理解应用商店的工作方式。

**数据库选择**：安装时需要选择数据库类型（PostgreSQL 或 MySQL）
![Halo 数据库选择](/images/Advanced/14-vps-ops-deploy/14-3-1-halo-db-04.png)

**初始化配置**：首次访问时进入初始化向导
![Halo 初始化界面](/images/Advanced/14-vps-ops-deploy/14-3-1-halo-init-05.png)

**用户设置**：创建管理员账号
![Halo 用户初始化](/images/Advanced/14-vps-ops-deploy/14-3-1-halo-user-06.png)

**管理后台**：安装完成后的管理界面
![Halo 管理后台](/images/Advanced/14-vps-ops-deploy/14-3-1-halo-admin-07.png)

**前台效果**：博客的访客视图
![Halo 前台页面](/images/Advanced/14-vps-ops-deploy/14-3-1-halo-frontend-08.png)

**插件生态**：支持通过插件扩展功能
![Halo 插件管理](/images/Advanced/14-vps-ops-deploy/14-3-1-halo-plugin-09.png)

这个流程展示了应用商店安装的典型步骤：选择配置 → 等待安装 → 初始化设置 → 开始使用。其他应用（如 Umami、n8n）的安装流程类似。
:::

### DBMS vs Database：装完数据库后的第一步

小明装完 PostgreSQL 后，老师傅让他去面板左侧菜单的「数据库 - PostgreSQL」页面新建一个具体的数据库（如 `my_app_db`）。

"等等，我不是刚装了数据库吗？怎么还要再建一个？"

老师傅解释："你装的是**数据库软件（DBMS）**，就像安装了 Excel 软件。但你还没有创建 `.xlsx` 文件。安装一次 PostgreSQL，可以创建无数个独立的数据库供不同项目使用。"

小明在「数据库 - PostgreSQL」页面点击「创建数据库」，填了数据库名、用户名、密码，选择了访问权限，几秒钟就创建好了。点击列表上方的「连接信息」按钮，他看到了地址、端口、管理员用户名和密码——这些就是后面配 `.env` 时要用的。

::: tip DBMS vs Database
- **DBMS**（数据库管理系统）：如 PostgreSQL、MySQL，是管理数据的软件
- **Database**（数据库）：DBMS 里创建的具体数据库，如 `myapp_db`

比喻：DBMS 是一栋楼，Database 是楼里的房间。你在 1Panel 应用商店安装的是"楼"（DBMS），然后在里面创建"房间"（Database）给你的应用用。

**详细的数据库设计和操作，详见第 6 章《数据持久化与数据库》。**
:::

<!-- 数据库连接信息 -->
![1Panel 数据库连接信息](/images/Advanced/14-vps-ops-deploy/14-3-1-db-conn-03.png)

::: warning 容器化数据库的连接地址
1Panel 通过 Docker 安装的数据库采用容器化方式运行，连接信息页面会提示不同场景对应不同的连接地址。从容器内连接用容器名，从主机连接用 `127.0.0.1`——后面「容器网络基础」会详细解释。
:::

## 容器管理

安装完应用后，有两个地方可以管理容器：

- **「应用商店 - 已安装」**：管理通过应用商店安装的应用，支持重建、重启、启动、停止、卸载、查看参数等操作。点击「参数」按钮可以查看和修改应用的配置参数。
- **「容器」**：管理所有 Docker 容器（包括应用商店安装的和手动创建的）。每个容器一行，行内有「终端」「日志」按钮，以及「更多」菜单（编辑、升级、监控、制作镜像、删除、重命名）。

小明点进「容器」页面，看到 PostgreSQL、OpenResty 都在跑，每个容器旁边有绿色的"运行中"标识。

![1Panel 容器列表页面](/images/Advanced/14-vps-ops-deploy/14-3-1-container-list-20.png)

常用操作：

| 操作 | 在哪里操作 | 说明 | 对应命令 |
|------|-----------|------|---------|
| 启动/停止/重启 | 「已安装」或「容器」 | 控制容器运行状态 | `docker start/stop/restart 容器名` |
| 查看日志 | 「容器」→ 容器行 → 日志 | 支持按时间段筛选、实时追踪、下载 | `docker logs 容器名` |
| 进入终端 | 「容器」→ 容器行 → 终端 | 选择命令（如 /bin/bash）和用户后连接 | `docker exec -it 容器名 bash` |
| 查看监控 | 「容器」→ 容器行 → 更多 → 监控 | CPU、内存、磁盘 IO、网络使用情况 | `docker stats 容器名` |
| 重建 | 「已安装」→ 重建 | 删除容器并基于当前配置重新创建，持久化数据保留 | — |

小明在「已安装」页面看到了刚装的 PostgreSQL，状态是绿色的"运行中"。他试着点了"停止"，状态变成红色；再点"启动"，几秒钟就恢复了。这种掌控感让他觉得 Docker 确实好用——应用就像手机上的 App，随时开关。

::: tip 日志是你最好的朋友
应用出问题时,第一反应不是去搜索引擎，而是**先看日志**。在「容器」页面点击目标容器，选择「日志」，就能看到实时输出——支持按最近一天、4 小时、1 小时、10 分钟筛选，还能开启「追踪」实时刷新。日志就是应用的实时自言自语——它会告诉你"我在找数据库但找不到""我缺了一个环境变量"，比你自己猜的准得多。90% 的问题，日志里都有答案。

![容器日志查看](/images/Advanced/14-vps-ops-deploy/14-3-1-container-log-11.png)


:::

## 数据持久化：Volume 挂载

小明好奇："容器删了，我的数据会不会丢？"

答案是：**如果配置了 Volume 挂载，数据不会丢**。

老师傅解释："容器就像一个临时工位，你走了工位就清空了。但 Volume 是你的**专属文件柜**，不管你换多少次工位，文件柜里的东西一直在。"

1Panel 安装的应用默认都会配置 Volume，数据存储在服务器的 `/opt/1panel/` 目录下。你可以在「容器 - 存储卷」页面查看和管理所有 Volume。所以你可以放心地删除、重建容器，数据不会丢失。

小明试了一下：停掉 PostgreSQL 容器，再重新启动，数据库里的数据还在。"就像换了个工位，但文件柜没动。"

```bash
# 查看所有 Volume
docker volume ls

# 查看某个 Volume 的详细信息
docker volume inspect 1panel-postgresql-data
```

::: warning 备份 Volume 才是真保险
虽然 Volume 不会因为删容器而丢失，但如果服务器硬盘坏了，数据照样没了。定期备份 Volume 数据到本地或云存储，才是真正的保险。1Panel 提供了计划任务功能，可以设置自动备份。
:::

## 容器网络基础

这是新手最容易踩坑的地方。小明配 `DATABASE_URL` 时填了 `localhost`，连接失败——报错 `Connection refused`，看起来像是数据库没启动，但数据库明明在跑。

核心规则：**`localhost` 在容器里指的是容器自己，不是服务器主机**。

你在家喊"妈"，你妈会应。你在朋友家喊"妈"，应的是朋友的妈。容器里的 `localhost` 也一样——每个容器的 `localhost` 都是它自己，不是服务器主机。

<ContainerNetwork />

| 场景 | 连接地址 | 原因 |
|------|---------|------|
| 容器 A 连接容器 B | 用**容器名**（如 `1Panel-postgresql-ukow`） | 同一 Docker 网络内，容器名就是主机名 |
| 服务器主机连接容器 | 用 `127.0.0.1` 或 `localhost` | 容器端口映射到了主机 |
| 外部浏览器访问 | 用**服务器公网 IP** + 映射端口 | 通过端口映射转发 |

::: tip 1Panel 容器命名规则
1Panel 创建的数据库容器名遵循 `1Panel-{数据库类型}-{随机4位字母}` 的格式：
- `1Panel-postgresql-ukow`
- `1Panel-redis-w94p`
- `1Panel-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"
```

::: tip 如何获取数据库用户名和密码？
在 1Panel 的「数据库」页面，点击对应数据库的「详情」或「连接信息」，可以看到：
- 用户名（可能是 `postgres`、`root` 或你自定义的用户名）
- 密码（安装时设置的密码）
- 容器名（在「容器」页面也能看到）
:::

::: warning 这个坑会浪费你几个小时
填错连接地址是新手部署失败的头号原因。报错信息通常是 `Connection refused` 或 `ECONNREFUSED`，看起来像是数据库没启动，但其实只是地址填错了。记住：**容器找邻居用名字，主机找容器用 localhost**。
:::

---

::: info 下一步
Docker 基础搞定了。接下来实战部署——[14.3.2 部署 Next.js 应用](./03-2-deploy-nextjs.md)，把你的项目真正跑在服务器上。
:::
