--- 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` 都是它自己,不是服务器主机。 | 场景 | 连接地址 | 原因 | |------|---------|------| | 容器 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),把你的项目真正跑在服务器上。 :::