Featured image of post Docker 图形化管理神器:Portainer 一键部署与全攻略

Docker 图形化管理神器:Portainer 一键部署与全攻略

从零开始使用 Portainer 管理 Docker 容器,可视化创建容器、管理镜像、监控资源、备份数据,告别命令行焦虑

为什么你需要一个 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 页面,你可以:

  1. 批量启动/停止:勾选多个容器 → 点击顶部操作按钮
  2. 一键重启:遇到内存泄漏时,选中容器 → Restart
  3. 查看日志:点击容器名称 → Logs 标签页
  4. 接入终端:点击容器名称 → Console 标签页 → Connect,直接进入容器 Shell
  5. 编辑配置:点击容器名称 → 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 最佳安全实践

  1. 永远不要将 Portainer 暴露在公网,除非你有足够的防护措施
  2. 使用强密码作为管理员账户
  3. 定期更新 Portainer 镜像到最新版本
  4. 启用防火墙规则,只允许信任的 IP 访问 9443 端口
  5. 配合 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 世界吧!

📺 看视频版教程 → DuckDB Lab YouTube

Subscribe for more DuckDB & AI automation tutorials