为什么你需要一个 Docker GUI?
如果你用过 Docker,一定经历过这样的时刻:
- 想查看某个容器的日志,却要敲
docker logs -f container-name - 想重启容器,得先找到容器 ID
- 想删除旧镜像释放空间,
docker image prune参数记不住 - 想监控资源占用,只能靠
docker stats手动刷新
对于个人开发者或小团队来说,Portainer 就是那个让你告别命令行焦虑的终极方案。它是一个开源的 Docker 图形化管理工具,只需一条命令即可部署,支持容器、镜像、网络、卷、Stack(Compose)的全生命周期管理。
Portainer 核心功能一览
| 功能 | 说明 |
|---|---|
| 容器管理 | 启动/停止/重启/删除容器,查看实时日志 |
| 镜像管理 | 拉取/删除/导入镜像,构建自定义镜像 |
| 网络管理 | 可视化创建和管理 Docker 网络 |
| 卷管理 | 管理数据卷,备份/恢复容器数据 |
| Stack 部署 | 通过 Docker Compose YAML 一键部署多容器应用 |
| 资源监控 | 实时查看 CPU、内存、网络使用情况 |
| 终端访问 | 直接在浏览器中进入容器 Shell |
| 多环境管理 | 统一管理本地 Docker 和远程 Swarm/K8s 集群 |
第一步:安装 Portainer
方法一:Docker 容器部署(推荐)
# 1. 创建 Portainer 数据卷
docker volume create portainer_data
# 2. 启动 Portainer CE(社区版)
docker run -d \
--name portainer \
--restart=always \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
提示:如果你希望使用 HTTP(仅限内网),可以额外映射 8000 端口并添加
--listen-port 8000参数。
方法二:使用 Docker Compose
version: '3.8'
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "9443:9443"
- "8000:8000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
docker compose up -d
初始管理员密码设置
首次访问 https://你的IP:9443 时,系统会要求你设置管理员密码。请记住这个密码,Portainer 不提供密码找回功能。建议设置为 16 位以上强密码。
第二步:熟悉 Portainer 界面
仪表盘(Dashboard)
登录后你首先看到的是仪表盘,它展示了:
- 服务器概览:CPU、内存、磁盘使用率
- 容器统计:运行中/已停止/总计数量
- 镜像统计:本地镜像数量和总大小
- 快速操作:创建容器、部署 Stack、创建数据卷
左侧导航栏
| 菜单项 | 用途 |
|---|---|
| Containers | 管理所有容器 |
| Images | 管理镜像 |
| Volumes | 管理数据卷 |
| Networks | 管理网络 |
| Stacks | 管理 Compose Stack |
| Registry | 镜像仓库 |
| Templates | 一键应用模板 |
第三步:实战 — 用 Portainer 部署常用服务
3.1 使用 Stack 部署 Nextcloud
点击左侧 Stacks → Add stack,选择 Web Editor,粘贴以下内容:
version: '3.8'
services:
app:
image: nextcloud:latest
container_name: nextcloud
restart: always
ports:
- "8080:80"
volumes:
- nextcloud_data:/var/www/html
- nextcloud_config:/var/www/html/config
- nextcloud_apps:/var/www/html/apps
environment:
- MYSQL_HOST=db
- MYSQL_PASSWORD=nextcloud_pass
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- TZ=Asia/Shanghai
db:
image: mariadb:10.6
container_name: nextcloud_db
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=rootpass
- MYSQL_PASSWORD=nextcloud_pass
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- TZ=Asia/Shanghai
volumes:
nextcloud_data:
nextcloud_config:
nextcloud_apps:
db_data:
点击 Deploy the stack,几分钟后 Nextcloud 就可通过 http://你的IP:8080 访问了。
3.2 使用 Stack 部署 Home Assistant
version: '3'
services:
homeassistant:
container_name: homeassistant
restart: unless-stopped
image: ghcr.io/home-assistant/home-assistant:stable
volumes:
- ha_config:/config
- /etc/localtime:/etc/localtime:ro
environment:
- TZ=Asia/Shanghai
privileged: true
networks:
- ha_network
ports:
- "8123:8123"
volumes:
ha_config:
networks:
ha_network:
driver: bridge
3.3 批量管理已有容器
在 Containers 页面,你可以:
- 批量启动/停止:勾选多个容器 → 点击顶部操作按钮
- 一键重启:遇到内存泄漏时,选中容器 → Restart
- 查看日志:点击容器名称 → Logs 标签页
- 接入终端:点击容器名称 → Console 标签页 → Connect,直接进入容器 Shell
- 编辑配置:点击容器名称 → Config 标签页,修改端口映射、环境变量等
第四步:高级技巧
4.1 使用 Traefik 为 Portainer 添加域名和 HTTPS
version: '3.8'
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
labels:
- "traefik.enable=true"
- "traefik.http.routers.portainer.rule=Host(`portainer.yourdomain.com`)"
- "traefik.http.routers.portainer.entrypoints=websecure"
- "traefik.http.routers.portainer.tls.certresolver=letsencrypt"
- "traefik.http.services.portainer.loadbalancer.server.port=9443"
traefik:
image: traefik:v3.0
container_name: traefik
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- acme_data:/acero
labels:
- "traefik.enable=true"
volumes:
portainer_data:
acme_data:
4.2 自动备份 Portainer 数据
Portainer 的配置和数据存储在 Docker 卷中,定期备份至关重要:
#!/bin/bash
# backup-portainer.sh
BACKUP_DIR="/opt/backups/portainer"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# 备份 Portainer 数据卷
docker run --rm \
-v portainer_data:/data:ro \
-v "$BACKUP_DIR":/backup \
alpine tar czf /backup/portainer_backup_$TIMESTAMP.tar.gz -C /data .
# 保留最近 7 天的备份
find "$BACKUP_DIR" -name "portainer_backup_*.tar.gz" -mtime +7 -delete
echo "Backup completed: portainer_backup_$TIMESTAMP.tar.gz"
4.3 设置资源限制防止 Portainer 占用过多
services:
portainer:
image: portainer/portainer-ce:latest
restart: always
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.25'
memory: 128M
第五步:安全加固
5.1 启用双因素认证(T2FA)
Portainer Business Edition 支持 TOTP 双因素认证。社区版用户可以通过 Nginx/Caddy 反向代理实现 IP 白名单访问。
5.2 限制访问来源
# Nginx 反向代理配置示例
server {
listen 443 ssl http2;
server_name portainer.yourdomain.com;
# 仅允许特定 IP 段访问
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
location / {
proxy_pass https://localhost:9443;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_ssl_server_name on;
}
}
5.3 最佳安全实践
- 永远不要将 Portainer 暴露在公网,除非你有足够的防护措施
- 使用强密码作为管理员账户
- 定期更新 Portainer 镜像到最新版本
- 启用防火墙规则,只允许信任的 IP 访问 9443 端口
- 配合 Tailscale 使用,实现安全的远程访问
常见问题
Q1: Portainer CE 和 BE 有什么区别?
| 特性 | Community Edition (CE) | Business Edition (BE) |
|---|---|---|
| 价格 | 免费 | 付费 |
| 多环境管理 | ✅ | ✅ |
| 双因素认证 | ❌ | ✅ |
| 审计日志 | ❌ | ✅ |
| 角色权限管理 | 基础 | 高级 |
| 技术支持 | 社区 | 官方支持 |
对个人用户和小团队来说,CE 版本完全够用。
Q2: Portainer 会影响 Docker 性能吗?
不会。Portainer 只是一个管理界面,它通过 Docker API 与守护进程通信,本身不消耗额外资源。唯一需要注意的是它的 Web UI 和数据库(内置 SQLite)会占用少量内存,通常在 100-200MB 之间。
Q3: 如何从命令行迁移到 Portainer?
不需要迁移!Portainer 管理的是同一个 Docker 环境,你在命令行创建的容器、镜像、网络,在 Portainer 中都能直接看到和操作。反过来也一样。
Q4: Portainer 支持 Kubernetes 吗?
是的。Portainer 支持管理 Docker Swarm 和 Kubernetes 集群。在 K8s 场景下,它提供了更友好的图形化界面来管理 Deployment、Service、ConfigMap 等资源。
总结
Portainer 是 Docker 生态中最受欢迎的图形化管理工具之一。它的核心价值在于:
- 降低门槛:让不熟悉命令行的用户也能管理容器
- 提高效率:可视化操作比敲命令快得多
- 集中管理:一个界面管理所有 Docker 资源
- 减少错误:图形化确认避免了误删容器的风险
无论你是刚接触 Docker 的新手,还是经验丰富的运维工程师,Portainer 都值得在你的 VPS 上部署。一条命令安装,几分钟上手,从此告别命令行焦虑。
立即行动:在你的 VPS 上执行那三行安装命令,打开浏览器看看你的 Docker 世界吧!
