它是什么:可视化容器管理面板
Portainer 可以理解成“给 Docker 装了一块仪表盘”。它是网页端容器管理面板,登录后把镜像、容器、网络、卷、日志和状态放在一个页面:镜像像安装包,容器像运行中的程序,卷像硬盘,日志像运行记录。底层仍是 Docker 在干活,它不是替代 Docker,而是把启动、停止、看日志、删容器等常用操作变成按钮。小白先看清“谁在跑、数据在哪、哪里报错”,再慢慢学命令,这正是管理docker项目从未如此简单的起点。
在 GCP VM 的 Linux 里,Portainer 通常自己也跑成一个容器,通过挂载 /var/run/docker.sock 连接本机 Docker 守护进程。所谓受控,是只把入口交给它,再用防火墙、登录密码和端口限制收紧。下面按 GCP 常见 Debian/Ubuntu 写,可直接复制;其他系统先换安装方式。
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable --now docker
sudo docker rm -f portainer-demo 2>/dev/null || echo "第一次运行,没有旧演示容器,继续"
sudo docker volume create portainer_demo_data >/dev/null
sudo docker run -d -p 9443:9443 --name portainer-demo --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_demo_data:/data portainer/portainer-ce:latest
sudo docker ps --filter "name=portainer-demo" --format "table {{.Names}} {{.Status}} {{.Ports}}"
这里 portainer_demo_data 保存账号和设置,删容器也别删卷;--restart=always 让 VM 重启后自动拉起;-p 9443:9443 映射网页端口;挂载 docker.sock 才能管理本机 Docker。统一用 sudo docker,可避开“加了 docker 组却没重新登录”的权限坑。看到 Up 后,浏览器打开 https://你的VM外部IP:9443,首次设置管理员密码,环境选 Local。
- 访问不到:多半是 GCP 防火墙没放行 TCP 9443;到“VPC 网络 → 防火墙”加规则,来源只填自己的公网 IP/32,别长期开放全网。
- 证书警告:9443 默认是自签 HTTPS,练习可继续;正式用要配域名、证书和强密码。
- 权限坑:
docker.sock权限接近服务器 Docker 控制权,别把面板裸奔公网,也别交给来路不明的镜像。 - 重跑坑:命令会先删同名
portainer-demo演示容器,数据卷保留;已有生产同名容器请先改名。
解决什么问题:把零散操作变成清单
刚接触 Docker 时,最累的不是容器,而是操作太散:今天翻启动参数,明天找日志,后天又有人问端口改到哪了。gcpok.com 先把这些动作收成一张项目清单。打开项目详情页,不用死记大量命令,看状态后点“启动”“停止”“重启”“查看日志”就行。按钮会带着当前项目执行,少复制错项目名、少打参数,这也是「管理docker项目从未如此简单」真正落地的地方。
清单里先核对四行:项目目录、环境变量、端口映射、卷挂载。以前它们可能藏在脚本、.env、聊天记录或同事的终端历史里;现在集中在一页,改前能对照,改后能回看。为什么这么做?多数“服务突然起不来”不是 Docker 坏了,而是端口写反、变量大小写改了,或卷挂到另一个空目录,数据看起来像丢了。
- 端口左边是宿主机端口,右边是容器端口;左边被占用,重启也没用。
- 变量和卷别凭记忆补,少个空格会连不上库;改挂载路径前先确认数据在哪,别为“清干净”勾删除数据卷。
- 重启不是修配置,配置错了只会反复失败。
要核对页面,先按清单里的项目目录让终端停在那个文件夹;不会切就找管理员,别猜路径。再复制下面几行,从上往下看输出,不需要改字。它们只做查看:确认目录、看文件、看全局容器、看合并配置、看状态和最近 100 行日志。每行里重复的那部分,只是前半句没成功时自动再试一次,常见原因是权限不够,不用背。
pwd
ls -la
docker ps || sudo docker ps
docker compose config || sudo docker compose config
docker compose ps || sudo docker compose ps
docker compose logs --tail=100 || sudo docker compose logs --tail=100
坑也直说:如果第一行目录和清单不一致,立刻停,别继续,你可能进了另一个项目;合并配置输出可能含密码、Token,别整段贴群。多人协作时,大家看同一入口和状态视图,排障先看全局:哪个项目异常、是否刚改配置、日志最后报什么,再决定要不要 SSH 登录。这样 SSH 从第一反应变成最后一步,少一个人乱敲命令,就少一次把小问题放大成故障。
怎么上手:在 GCP VM 跑通第一步
先别急着啃复杂配置,咱们在 GCP 开一台最便宜的 e2-micro 练手就行。系统选 Ubuntu,复制下面这行就能建好:
gcloud compute instances create portainer-demo --zone=asia-east1-b --machine-type=e2-micro --image-family=ubuntu-2204-lts --image-project=ubuntu-os-cloud
端口准备别踩坑:创建时千万别图省事勾选「允许所有 HTTP 流量」,更别把 9000 面板端口对 0.0.0.0/0 敞开,公网扫描器几分钟就会摸上来。稳妥做法有两种:在控制台防火墙加一条 tcp:9000、来源只填你自己的宽带 IP;或者干脆先不开端口,等下走 SSH 隧道(本文用这种,最省心)。
连上 VM 后,用官方脚本一键装好 Docker 和 Compose 插件,省去手动配源的麻烦:
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
为什么要加用户组? 不然以后每次敲命令都得带 sudo,新手十有八九会忘,还容易把权限搞乱。newgrp 是让改动立刻生效,不用退出重登。
接着按官方方式拉起 Portainer。注意那个 -v:它把配置存进了独立数据卷,以后就算手滑删了容器,账号和项目也还在,这是小白最容易哭着重来的地方:
docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
现在在你自己电脑另开一个终端,搭条隧道把远端 9000「搬」到本地,这样面板根本没暴露在公网:
gcloud compute ssh portainer-demo --zone=asia-east1-b -- -L 9000:localhost:9000 -N
浏览器访问 http://localhost:9000 首次登录,设好管理员密码就算完成访问控制了。再提醒一个坑:初始化页面有超时限制,设完复杂密码赶紧点创建,别挂着去倒水,回来就得重启容器重来。
进去后点「Get Started」连本地环境,到 Stacks → Add stack 导入一个练手项目,名字填 demo,把下面这段直接复制进编辑器:
version: '3'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
environment:
- DEMO_ENV=hello_gcp
部署完点进容器列表,挨个摸一遍:看 Status 是不是绿了、点 Logs 读启动日志、切 Env 核对刚写的变量,最后按一下 Restart 观察状态跳变。这一圈走下来,日常管项目最核心的动作全在点鼠标里完成了,是不是比记黑框框命令轻松多了?
与替代方案对比:按规模选工具
选工具别先问「谁更厉害」,先看规模:一台机器、几个容器、几个人维护。纯命令行最轻量,不用额外装服务,也最容易写进脚本;但参数多、学习曲线高,小白容易把「查看」「停止」「删除」混在一起。面板更像仪表盘,适合入门和日常巡检:状态、日志、端口、资源占用一眼能看明白。
docker ps
docker stats --no-stream
为什么先跑这两条?第一条只列正在运行的容器,第二条只取一次资源占用,不会一直刷屏。坑:看到异常先别急着执行删除或清理类操作,先核对容器名;这类操作可能连带处理数据卷或镜像。
Docker Compose 和面板也不是二选一。Compose 擅长用文件描述项目,把镜像、端口、环境变量、依赖写清楚,换机器还能照着起一套;面板擅长可视化查看,哪个服务挂了、最近报什么错,点几下就找到。推荐做法是:文件保存配置,面板做日常观察。
docker compose up -d
docker compose ps
docker compose logs --tail=50
这三条请在放有 compose.yaml 或 docker-compose.yml 的项目目录,也就是存放配置文件的文件夹里逐条复制:第一条后台启动,第二条看项目内服务状态,第三条只看最近 50 行日志,避免刷屏。坑:没有这两个文件就先别执行;只在面板里临时改配置、不回写文件,重启或换机器后可能又恢复原样。
规模再大再上重型方案。Kubernetes 或 GKE 适合大规模编排:多副本、扩缩容、滚动发布和故障自愈;Cloud Run 适合无服务器容器,比如 Web 接口、短任务,连服务器都不用管。但小项目上它们往往过重,要额外理解集群、网络、权限、冷启动和运行时限制。坑:数据库别随便放进可随时替换的实例,优先用托管数据库或明确持久化。
最后看团队。如果团队已有自动化流水线,命令行更稳,因为每一步可写进脚本、可记录、可复查;如果人手少、还要值班,面板更省心,新人也能按图索骥做巡检。无论哪种,都把权限收小:面板别裸奔到公网,脚本别写明文密钥,也别把密钥提交仓库。这样,「管理docker项目从未如此简单」不是选最复杂的工具,而是让规模、人员和工具刚好匹配。
最佳实践:安全、备份和可回滚
先把「门」看好。/var/run/docker.sock 差不多等于服务器 root:谁拿到它,谁就能在你机器上随便起容器。所以 Portainer 只给需要的人用,管理端口千万别写成 0.0.0.0:9000 暴露到公网,只绑本机 127.0.0.1,再走隧道访问;首次打开面板立刻设长密码并开 HTTPS。
# 1. 看一眼套接字权限,正常应是 root:docker
ls -l /var/run/docker.sock
# 2. 生成自签证书(浏览器提示「不安全」是正常的,别因此改回 HTTP)
mkdir -p /opt/portainer/certs && cd /opt/portainer/certs
openssl req -x509 -newkey rsa:2048 -nodes -days 365
-keyout portainer.key -out portainer.crt -subj "/CN=你的域名"
chmod 600 portainer.key
# 3. 只映射 9443,9000 不映射出去;版本写死,方便以后回滚
docker run -d --name portainer --restart=unless-stopped
-p 127.0.0.1:9443:9443
-v /var/run/docker.sock:/var/run/docker.sock
-v portainer_data:/data
-v /opt/portainer/certs:/certs:ro
portainer/portainer-ce:2.21.4
--ssl --sslcert /certs/portainer.crt --sslkey /certs/portainer.key
# 4. 生成强密码,存进密码管理器,别贴在聊天群
openssl rand -base64 18
# 5. 确认防火墙没有放行 9000/9443 给所有人
gcloud compute firewall-rules list 2>/dev/null || true
# 这一行在【你自己的电脑】上执行,别粘到服务器里
ssh -L 9443:127.0.0.1:9443 user@你的服务器IP
两个高频坑:一是抄了网上的 :ro 挂载,结果面板能看不能点——Portainer 本来就要写套接字才能管容器;二是觉得「反正是内网」就在 GCP 防火墙放行 0.0.0.0/0,扫描器几分钟就上门。浏览器随后打开 https://localhost:9443 设密码即可。
再留退路。升级前必须同时备份三样:配置文件、数据卷、镜像清单。只存 docker-compose.yml 最危险,数据库在卷里,配置再全也救不回数据。
APP_DIR=/opt/myapp # 改成你放 docker-compose.yml 的目录
VOL=myapp_data # 用 docker volume ls 查真实卷名
D=$(date +%F-%H%M); mkdir -p /opt/backup/$D
cd "$APP_DIR"
{
docker compose version
docker images --format '{{.Repository}}:{{.Tag}} {{.ID}}'
} > /opt/backup/$D/versions.txt
cp docker-compose.yml /opt/backup/$D/ 2>/dev/null || true
cp .env /opt/backup/$D/ 2>/dev/null || true
docker run --rm -v "$VOL":/data -v /opt/backup/$D:/backup alpine
tar czf /backup/volume.tgz -C /data .
echo "备份完成:/opt/backup/$D,升级前先看 versions.txt"
回滚时按 versions.txt 把镜像 tag 改回旧值、解包 volume.tgz 再启动。千万別给 docker compose down 加 -v,那会直接删卷;镜像也别只用 latest,否则根本不知道该退回哪版。
# 每天 3 点自动备份卷;crontab 里的 % 必须写成 %
mkdir -p /opt/backup
(crontab -l 2>/dev/null; echo '0 3 * * * docker run --rm -v myapp_data:/data -v /opt/backup:/backup alpine tar czf /backup/volume-$(date +%F).tgz -C /data .') | crontab -
crontab -l
然后盯住机器。GCP 控制台进「Monitoring → 告警」建策略:CPU > 80%、内存、磁盘 > 85%,通知填邮箱;容器重启次数用下面这条记日志,重启突然变多,八成是新版本有问题。
docker stats --no-stream
df -h /
docker inspect --format '{{.Name}} 重启{{.RestartCount}}次 {{.State.Status}}' $(docker ps -aq) | tee -a /var/log/container-restarts.log
最后把生产变更写成固定清单,面板只是入口,不替代流程:
- 记下当前版本和备份目录,确认能回滚。
- 改动先写进 compose / .env 文件,在测试容器里跑一遍。
- 挑低峰期发布,一次只改一处。
- 发布后看 10 分钟 CPU、磁盘和重启次数。
- 不对就按备份回退,别在面板里反复试。
最容易忽略的是「配置漂移」:在 Portainer 里顺手改个环境变量,并不会写回 docker-compose.yml,下次点「Recreate」就被覆盖,还查不出原因。记住:文件是唯一真相,面板只负责按文件执行。
常见问题(FAQ)
Portainer 会不会让 Docker 变慢?
影响通常很小,主要是面板自身占用;小项目可忽略,重点是别开放过高权限。
GCP 上一定要用 VM 吗?
不一定要。单机学习用 VM 最直观,托管服务更适合免运维或弹性场景。
小白能直接管理生产项目吗?
不建议。先在测试环境熟悉日志、备份和回滚,再按清单逐步接管低风险服务。
只学面板还需要懂命令吗?
需要。面板降低入门门槛,但排障、自动化和迁移仍离不开基础命令。
管理端口可以公网开放吗?
尽量不要。用 SSH 隧道、来源 IP 白名单或反向代理,并启用 HTTPS。
不想自己折腾 GCP?我们提供云平台代维护、上云迁移与账单代付服务,一对一技术支持。
