Docker - 使用Portainer管理Docker
注意
Failed loading environmentThe environment named local is unreachable.
问题:进入 Portainer 时显示连接状态为"UP",但点击操作时提示连接失败(Down)
原因:源于 Docker 29.0.0 版本对 API 最低版本规则的重大变更,导致其与 Portainer 最新版存在兼容性冲突
解决方案:Docker降级到29.0.0版本以前或者Portainer降级到2.20.2
鸣谢:Jspb_LIu 最新版本Docker和Portainer连接问题:Failed loading environmentThe environment named local is unreachable.
安装
- 拉取镜像
docker pull portainer/portainer-ce:2.33.0 - 创建数据卷
docker volume create portainer_data - 创建容器
docker run -d \ --name portainer \ --restart=always \ -p 9000:9000 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ --user "0:$(getent group docker | cut -d: -f3)" \ portainer/portainer-ce:2.33.0- -v /var/run/docker.sock:/var/run/docker.sock:如果需要管理运行Portainer的本机Docker,这个必须映射。
- -v portainer_data:/data:这是映射数据卷,存储位置一般在/var/lib/docker/volumes路径下。
- --user "0:$(getent group docker | cut -d: -f3)":指定容器内进程的用户和组 ID,以便让容器内的进程能读写 /var/run/docker.sock
使用
本地连接
需要管理的Docker与安装的Portainer在同一主机上,且已经映射了本机docker.sock文件
- 使用浏览器访问 http://127.0.0.1:9000 进入控制台。
- 如果是初次登陆,需要设置admin的密码。
- 在选择页面中选择“Get Started”,这样就可以直接看到名为“local”的本机Docker,点击“Live connect”,即可进入管理页面。
远程连接
被管理的Docker与Portainer不在同一主机,创建portainer的时候无需映射docker.sock文件
- 被管理的Docker主机,需要编辑配置文件
nano /etc/docker/daemon.json # 添加以下内容 { "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] } - 重启Docker
sudo systemctl daemon-reload sudo systemctl restart docker - 如果重启Docker的时候提示:“Job for docker.service failed”,说明启动失败,存在配置问题,请按照以下步骤检查:
- 打印Docker日志:
sudo journalctl -u docker.service --no-pager -n 50 - 检查其中错误信息是否包含:“unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [fd://], from file: [unix:///var/run/docker.sock tcp://0.0.0.0:2375])”
- 如果包含,说明Docker 服务通过 systemd 启动时,默认使用 -H fd:// 参数,又在 daemon.json 中又定义了 "hosts" 字段,重复定义导致启动失败。
- 创建 systemd override 配置:
sudo mkdir -p /etc/systemd/system/docker.service.d sudo nano /etc/systemd/system/docker.service.d/override.conf # 写入以下内容 [Service] ExecStart= ExecStart=/usr/bin/dockerd - 重载 systemd 并重启 Docker
sudo systemctl daemon-reload sudo systemctl restart docker
- 打印Docker日志:
- 验证 Docker 是否监听 2375
ss -tuln | grep 2375 - 开放Docker宿主机端口
sudo firewall-cmd --permanent --add-port=2375/tcp sudo firewall-cmd --reload - 从Portainer主机检测是否能访问
# 此处IP需要替换为被管理Docker的宿主机IP地址 curl http://<IP>:2375/version - 使用安装Portainer的主机浏览器访问 http://127.0.0.1:9000 进入控制台。
- 如果是初次登陆,需要设置admin的密码。
- 因为没有配置docker.sock文件映射,只会显示“Add Environments”,点击这个,然后在“Select your environment(s)”页面选择“Docker Standalone”。
- 配置远程:
- Connect to your Docker Standalone environment:选择API
- Name:随便填
- Docker API URL:填写被管理Docker的宿主机IP:2375,例如:192.168.0.100:2375
- 点击“Connect”即可连接远程主机的Docker。
问题
- 创建容器的时候如果提示“iptables: No chain/target/match by that name.”
- 原因:iptable_nat 内核模块未加载,导致 iptables -t nat 操作失败。
- 处理:
- 加载必要的内核模块
sudo modprobe ip_tables sudo modprobe iptable_nat sudo modprobe nf_nat sudo modprobe nf_conntrack- ip_tables:基础 iptables 支持
- iptable_nat:NAT 表(端口映射必需)
- nf_nat / nf_conntrack:连接跟踪(现代内核所需)
- 验证是否加载成功
lsmod | grep -E 'iptable_nat|nf_nat' # 打印出类似以下内容 iptable_nat 16384 0 ip_tables 32768 1 iptable_nat nf_nat 69632 2 xt_nat,iptable_nat nf_conntrack 217088 3 nf_nat,xt_nat,nf_conntrack_netlink - 重启 Docker 服务(重建网络规则)
sudo systemctl restart docker - 永久生效(避免重启后失效)每次开机都会自动加载这些模块
sudo nano /etc/modules-load.d/docker.conf # 写入以下内容 ip_tables iptable_nat nf_nat nf_conntrack
- 加载必要的内核模块

浙公网安备 33010602011771号