Docker Portainer 部署指南
本文介绍如何使用 Docker 和 Docker Swarm 部署 Portainer。Portainer 是一个轻量级的 Docker 管理 UI,提供直观的图形界面来管理 Docker 容器、镜像、网络和卷。
📋 前置要求
- Docker 20.10+ 已安装
- Docker Swarm 已初始化(用于 Swarm 模式部署)
- 如需使用 Docker Compose,需要 Docker Compose V2
🚀 快速部署(Docker Compose)
1. 克隆项目(如果使用项目模板)
1 2
| git clone https://github.com/noahzaozao/docker-portainer.git cd docker-portainer
|
2. 创建数据目录
1 2 3
| mkdir -p /mnt/data/portainer_data
mkdir -p ./portainer_data
|
3. 使用 Docker Compose 部署
1 2 3 4 5
| docker compose up -d
docker-compose up -d
|
4. 访问 Portainer
启动成功后,访问:
🐳 Docker Swarm 部署(推荐生产环境)
1. 初始化 Swarm(如果尚未初始化)
2. 创建数据目录
1
| mkdir -p /mnt/data/portainer_data
|
3. 创建网络
1
| docker network create -d overlay portainer_agent_network
|
4. 部署 Portainer Agent
1 2 3 4 5 6 7 8 9 10 11
| docker service create \ --name portainer_agent \ --network portainer_agent_network \ -e AGENT_CLUSTER_ADDR=tasks.portainer_agent \ --mode global \ --constraint 'node.platform.os == linux' \ --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \ --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes \ --mount type=bind,src=//etc/localtime,dst=/etc/localtime \ --publish published=9001,target=9001,protocol=tcp,mode=ingress \ portainer/agent:latest
|
5. 部署 Portainer
1 2 3 4 5 6 7 8 9 10 11
| docker service create \ --name portainer \ --network portainer_agent_network \ --publish published=9000,target=9000,protocol=tcp,mode=ingress \ --replicas=1 \ --constraint 'node.role == manager' \ --mount type=bind,source=/mnt/data/portainer_data,destination=/data \ --mount type=bind,src=//etc/localtime,dst=/etc/localtime \ portainer/portainer-ce:latest \ -H "tcp://tasks.portainer_agent:9001" \ --tlsskipverify
|
6. 查看服务状态
1 2 3
| docker service ls docker service logs portainer docker service logs portainer_agent
|
📝 Docker Compose 配置示例
单机部署配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| version: '3.8'
services: portainer: image: portainer/portainer-ce:latest container_name: portainer command: -H unix:///var/run/docker.sock ports: - "9000:9000" volumes: - /var/run/docker.sock:/var/run/docker.sock - portainer_data:/data restart: unless-stopped
volumes: portainer_data:
|
Docker Swarm 部署配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| version: '3.8'
services: portainer_agent: image: portainer/agent:latest networks: - portainer_agent_network environment: - AGENT_CLUSTER_ADDR=tasks.portainer_agent volumes: - /var/run/docker.sock:/var/run/docker.sock - /var/lib/docker/volumes:/var/lib/docker/volumes - /etc/localtime:/etc/localtime:ro deploy: mode: global constraints: - node.platform.os == linux update_config: parallelism: 1 delay: 5s restart_policy: condition: on-failure delay: 5s max_attempts: 3 ports: - "9001:9001"
portainer: image: portainer/portainer-ce:latest networks: - portainer_agent_network command: -H "tcp://tasks.portainer_agent:9001" --tlsskipverify volumes: - /mnt/data/portainer_data:/data - /etc/localtime:/etc/localtime:ro deploy: replicas: 1 placement: constraints: - node.role == manager update_config: parallelism: 1 delay: 5s restart_policy: condition: on-failure delay: 5s max_attempts: 3 ports: - "9000:9000"
networks: portainer_agent_network: driver: overlay attachable: true
|
使用环境变量配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| version: '3.8'
services: portainer: image: portainer/portainer-ce:latest container_name: portainer command: -H unix:///var/run/docker.sock ports: - "${PORTAINER_PORT:-9000}:9000" volumes: - /var/run/docker.sock:/var/run/docker.sock - portainer_data:/data environment: - PORTAINER_EDITION=ce restart: unless-stopped labels: - "traefik.enable=true" - "traefik.http.routers.portainer.rule=Host(`portainer.example.com`)" - "traefik.http.routers.portainer.entrypoints=websecure" - "traefik.http.routers.portainer.tls.certresolver=letsencrypt"
volumes: portainer_data:
|
🔧 常用操作
更新 Portainer
Docker Compose 方式
1 2
| docker compose pull portainer docker compose up -d portainer
|
Docker Swarm 方式
1 2 3 4 5
| docker service update --image portainer/portainer-ce:latest portainer
docker service update --image portainer/agent:latest portainer_agent
|
查看日志
1 2 3 4 5 6
| docker compose logs -f portainer
docker service logs -f portainer docker service logs -f portainer_agent
|
备份数据
1 2
| tar -czf portainer_backup_$(date +%Y%m%d).tar.gz /mnt/data/portainer_data
|
恢复数据
1 2 3 4 5 6 7 8
| docker compose stop portainer
tar -xzf portainer_backup_20250127.tar.gz -C /
docker compose start portainer
|
🔐 安全配置建议
1. 启用 HTTPS
使用反向代理(如 Nginx 或 Traefik)配置 HTTPS:
1 2 3 4 5 6
| labels: - "traefik.enable=true" - "traefik.http.routers.portainer.rule=Host(`portainer.example.com`)" - "traefik.http.routers.portainer.entrypoints=websecure" - "traefik.http.routers.portainer.tls.certresolver=letsencrypt"
|
2. 限制访问
使用防火墙限制访问:
1 2 3
| iptables -A INPUT -p tcp --dport 9000 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 9000 -j DROP
|
3. 使用强密码
首次登录时设置强密码,并定期更换。
4. 启用审计日志
在 Portainer 设置中启用审计日志功能。
📊 功能特性
Portainer CE(社区版)功能
- Docker 容器管理
- Docker 镜像管理
- Docker 网络管理
- Docker 卷管理
- Docker Compose 管理
- Docker Swarm 管理
- 用户和团队管理
- 环境模板
- 应用模板
Portainer Business(商业版)额外功能
- 高级访问控制
- RBAC(基于角色的访问控制)
- GitOps 集成
- 高级监控和告警
- 技术支持
🐛 常见问题
1. 无法连接到 Docker
- 检查 Docker socket 权限:
ls -l /var/run/docker.sock - 确认用户是否在 docker 组中:
groups $USER - 检查挂载路径是否正确
2. Agent 无法连接
- 检查网络配置:
docker network inspect portainer_agent_network - 确认 Agent 服务状态:
docker service ps portainer_agent - 查看 Agent 日志:
docker service logs portainer_agent
3. 数据丢失
- 检查数据卷挂载:
docker volume inspect portainer_data - 确认数据目录权限
- 定期备份数据目录
4. 更新后无法访问
- 清除浏览器缓存
- 检查容器状态:
docker compose ps - 查看日志:
docker compose logs portainer
📚 参考资源