Docker Portainer Setup

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 V2(推荐)
docker compose up -d

# 或使用旧版
docker-compose up -d

4. 访问 Portainer

启动成功后,访问:

🐳 Docker Swarm 部署(推荐生产环境)

1. 初始化 Swarm(如果尚未初始化)

1
docker swarm init

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
# 更新 Portainer
docker service update --image portainer/portainer-ce:latest portainer

# 更新 Portainer Agent
docker service update --image portainer/agent:latest portainer_agent

查看日志

1
2
3
4
5
6
# Docker Compose
docker compose logs -f portainer

# Docker Swarm
docker service logs -f portainer
docker service logs -f portainer_agent

备份数据

1
2
# 备份 Portainer 数据目录
tar -czf portainer_backup_$(date +%Y%m%d).tar.gz /mnt/data/portainer_data

恢复数据

1
2
3
4
5
6
7
8
# 停止 Portainer
docker compose stop portainer

# 恢复备份
tar -xzf portainer_backup_20250127.tar.gz -C /

# 启动 Portainer
docker compose start portainer

🔐 安全配置建议

1. 启用 HTTPS

使用反向代理(如 Nginx 或 Traefik)配置 HTTPS:

1
2
3
4
5
6
# Traefik 配置示例
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
# 仅允许特定 IP 访问
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

📚 参考资源

0%