4.3 容器、镜像与 Compose:看懂 Docker 的运行方式

一句话回答

容器是运行中的程序,镜像是装程序的压缩包模板,Compose 是一次管理多个容器的清单。1Panel 把这三样都做成了图形界面,但只有理解了它们的关系,排错时才知道该看哪一层。

三个概念与一个类比

把 Docker 想象成厨房:

Docker 概念 类比 说明
镜像(Image) 菜谱 + 半成品食材 只读模板,镜像商店(镜像仓库)里拉取
容器(Container) 锅里正在炒的那道菜 镜像运行起来的实例,能停、能删、能重启
存储卷(Volume) 你自己的储物柜 数据存在容器外面,容器删了储物柜还在
Compose 一份完整套餐的工序单 用一个 YAML 文件定义一组容器怎么跑

一个镜像可以创建无数个容器;容器删了,没有存到存储卷里的数据就跟着没了。这是理解一切后续操作的基础。

1Panel 里的一切应用都是容器:MySQL 是容器、Redis 是容器、通过运行环境建的 PHP 网站也是容器。所以「容器」菜单本质上是整个服务器的「引擎舱」。

容器概览:引擎舱仪表盘

入口:容器 → 概览。页面汇总了当前节点的 Docker 状态和资源数量:

  • 容器、编排、编排模板、镜像、镜像仓库、网络、存储卷的数量汇总,点数字直接跳转对应列表;
  • 磁盘占用:镜像、容器、存储卷、构建缓存各占多少空间、可回收多少;
  • Docker 配置:Docker Socket 路径和镜像加速地址。

磁盘清理

磁盘占用区域有【清理】按钮,会删除 Docker 判定为「未使用」的资源。

官方警告:清理前应确认停止的容器、未挂载的存储卷、旧镜像和构建缓存确实不再需要。存储卷可能包含业务数据——「未使用」不等于「可以删」。

什么时候该清理:应用升级多次之后,旧版本镜像会越堆越多,磁盘占用蹭蹭涨。这时候清理一下,通常能回收好几个 G。但别养成天天清理的习惯,存储卷一旦被清,数据是不可恢复的(见 4.4 节备份)。

Docker 状态异常

页面顶部会提示 Docker 的连接状态。Docker 未安装、未启动或连接失败时,容器相关功能都用不了,先按页面提示处理(一般是 systemctl start docker),再回来操作。

容器:日常操作

创建容器

路径:容器 → 创建容器。在 1Panel 里创建容器时,镜像必须先在「镜像」菜单里拉取好——这一点和命令行 docker run 直接给镜像名不同,面板做了一次拆分。

创建时主要配置:

配置 说明
名称 容器名,随便取,但建议有含义
镜像 从已拉取的镜像列表里选
网络 默认加入 1panel-network,可自选
端口映射 主机端口 → 容器端口
存储卷挂载 把存储卷或主机目录挂进容器
环境变量 传配置给容器
重启策略 always / on-failure / no

重启策略建议选 always——服务器重启后容器自动起来,不用半夜爬上去手动启。

查看容器信息

点容器名,右侧抽屉里能看到容器的完整信息。容器日志支持看最近一天/4 小时/1 小时/10 分钟,还能实时追踪、下载。控制台可以直接进容器里敲命令(选好命令和用户点【连接】;Alpine 系的容器选 /bin/ash,选 /bin/bash 会连不上)。

统计信息页面可以看到内存、CPU 使用率、磁盘 IO、网络 IO,刷新间隔可调。「我的服务器怎么越来越卡」这个问题的第一站就是这里——先看哪个容器在吃资源,再决定处理谁。

一个排错的通用思路

容器出问题(网站 502、应用打不开),按层次排查:

容器在跑吗?→ 概览/列表看状态
├─ 没在跑 → 启动它;启动报错 → 看容器日志
├─ 在跑但连不上 → 端口映射对不对 → 防火墙放行了没
├─ 能连但报错 → 看容器日志 / 进控制台查配置
└─ 资源占用异常 → 统计信息定位元凶

记住一句话:排错 80% 的时间应该在看日志。1Panel 把日志做成了界面里的一个按钮,没有门槛。

镜像:压缩包模板的管理

容器 → 镜像 页面对应 docker pull / load / build / tag / push / save 这一整套操作:

操作 等价命令 场景
拉取镜像 docker pull 从镜像仓库拉取,耗时可去看拉取日志
导入镜像 docker load 离线环境、从别的机器拷 .tar 文件过来
构建镜像 docker build 用 Web 编辑器写 Dockerfile,或选已有 Dockerfile
Tag 镜像 docker tag 给镜像打标签
推送镜像 docker tag + docker push 推到镜像仓库
导出镜像 docker save 导出成 .tar 文件拷走

拉取/构建日志的位置:关掉弹窗后想回看日志,去 主机 → 文件 里找 [安装目录]/1panel/tmp/docker_logs/ 下的 image_pull_[时间戳].log 或 image_build_[时间戳].log。

镜像拉不下来是国内服务器的常见问题。解决办法是在容器概览页的 Docker 配置里设置镜像加速地址(各大云厂商一般都提供免费加速服务,具体地址以服务商为准)。

镜像仓库:凭证集中管理

容器 → 仓库 用于保存 Docker Registry 的连接信息,供拉取和推送使用。创建时填名称、协议、下载地址,启用认证就填用户名密码。

两个注意点:

  • HTTP 仓库会被要求加入 Docker 的不安全仓库配置并重启 Docker 服务——重启期间正在进行的镜像操作会受影响,挑个没业务的时间做;
  • 官方建议优先使用 HTTPS 仓库、账号给最小权限。在 1Panel 里编辑或删除仓库记录,不会删除仓库服务端已有的镜像。

Compose 编排:一份清单管一组容器

当一组容器需要配合工作(比如「数据库 + 应用 + 缓存」),一个个创建容器就太累了。Compose 用一个 docker-compose.yml 文件描述所有服务,一条命令全部拉起来。

三种创建方式

容器 → 编排 → 创建编排:

方式 说明
编辑 用 Web 编辑器现场写 docker-compose.yml
路径选择 选服务器上已经存在的 compose 文件
编排模板 从保存过的模板创建(模板在「编排模板」页面维护)

一个最小示例:

services:
  web:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - web_data:/usr/share/nginx/html
    restart: always

volumes:
  web_data:

编排的三种来源

来源 说明 能否在面板里编辑
Apps 应用商店部署产生的 否(去应用商店的「参数/编辑」)
1Panel 在面板里创建的 可以
Local 在服务器命令行里创建的 否

编辑编排只适用于 1Panel 创建的。应用商店的应用要改 compose,走应用商店 → 已安装 → 参数 → 编辑(见 4.2 节)。

点击编排名称进入详情,能看到这个 Compose 对应的容器列表;仅 1Panel 创建的编排支持在界面里启停。

一个常见困惑:我想改某个参数,但编排是 Apps 来源的——直接去应用商店该应用的【参数】里改,改完会重建容器,比在容器层面手动改更安全。

网络与存储卷

容器网络

容器 → 网络 管理容器间通信的网络。系统自带四个网络无法删除:none、host、bridge、1panel-network。

类型 特点 场景
bridge 默认驱动,容器与主机网络隔离 大多数应用间通信
host 容器直接用主机网络栈 对网络性能要求高、不想做端口映射
overlay 跨多台 Docker 主机连通 多节点/集群
macvlan 给容器分配独立 MAC 地址,像物理设备 遗留系统直连物理网络
ipvlan 完全控制 IPv4/IPv6 寻址 有 VLAN 需求的高级场景

日常使用结论:应用商店安装的应用默认都在 1panel-network 里,互相之间用容器名访问。只有在需要自定义隔离时才去建新网络。

存储卷

存储卷是数据的保险箱。Docker Volume 由 Docker 统一管理,挂载到容器里做持久化存储。

  • 创建:填名称、驱动和驱动参数,默认驱动是 local;用其他驱动前要先装好对应插件;
  • 删除:必须先确认没有容器在使用这个卷——删除存储卷会连同里面的数据一起删掉;
  • 清理:调用 Docker 清理未被引用的卷。

官方明确警告:即使某个卷当前没有容器引用,它里面也可能存着数据库、上传文件或历史数据。删除或清理前,应先确认数据属于哪个应用,并完成可恢复的备份。1Panel 无法从已删除的 Docker Volume 恢复业务数据。

养成一个习惯:看到「未使用的存储卷」先紧张一下,搞清楚是谁的再决定删不删。

常见问答

Q:应用商店装的应用,在容器菜单里能看到吗? A:能。应用商店本质上就是包装了一层的 Compose 编排(Apps 类型),底层容器都在「容器」列表里,日志、统计、控制台全都能用。

Q:容器删了数据还在吗? A:挂载了存储卷或主机目录的数据还在,没挂的数据跟着容器一起没了。重建应用前先确认挂载配置。

Q:容器一直在重启(Restarting)怎么办? A:看容器日志,里头一般有明确的启动失败原因(配置错、端口冲突、数据卷找不到)。内存不够(OOM)也会导致重启,看统计信息。

Q:镜像占的磁盘太大怎么办? A:容器概览 → 磁盘占用 → 清理。注意清理不区分「旧版镜像」和「还在用的镜像」,确认可回收空间没问题再执行。

Q:在面板里学和直接学 Docker 有什么不同? A:面板把常用操作做成了点击,底层还是同一套 Docker。理解了概念,面板是提效工具;完全不懂概念,面板只是个黑盒。想系统学习可看 Docker 官方文档。

本节要点

  • 镜像是模板、容器是实例、存储卷是数据;删除任何东西前先想清楚数据在不在存储卷里;
  • 容器概览是引擎舱仪表盘:状态、数量、磁盘占用、Docker 配置都在这;
  • 排错主线:先看状态,再看日志,再看端口/网络,最后看资源占用;
  • 编排(Compose)按来源分 Apps / 1Panel / Local,只有 1Panel 创建的能在面板里编辑;
  • 镜像拉不下来去配镜像加速地址,拉取/构建日志在 [安装目录]/1panel/tmp/docker_logs/ 下。

容器管理的完整功能列表,见《1Panel 官方文档:功能手册》中的「容器」一章,网络与存储卷的官方说明也在同一章。更深入的 Docker 网络与多节点编排,可参阅《1Panel 进阶实战》。

下一节:容器、数据库都就位了,给整个服务器上一份保险——备份、快照与跨机器迁移。