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.

安装

  1. 拉取镜像
    docker pull portainer/portainer-ce:2.33.0
    
  2. 创建数据卷
    docker volume create portainer_data
    
  3. 创建容器
    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文件

  1. 使用浏览器访问 http://127.0.0.1:9000 进入控制台。
  2. 如果是初次登陆,需要设置admin的密码。
  3. 在选择页面中选择“Get Started”,这样就可以直接看到名为“local”的本机Docker,点击“Live connect”,即可进入管理页面。

远程连接

被管理的Docker与Portainer不在同一主机,创建portainer的时候无需映射docker.sock文件

  1. 被管理的Docker主机,需要编辑配置文件
    nano /etc/docker/daemon.json
    # 添加以下内容
    {
      "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
    }
    
  2. 重启Docker
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  3. 如果重启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
      
  4. 验证 Docker 是否监听 2375
    ss -tuln | grep 2375
    
  5. 开放Docker宿主机端口
    sudo firewall-cmd --permanent --add-port=2375/tcp
    sudo firewall-cmd --reload
    
  6. 从Portainer主机检测是否能访问
    # 此处IP需要替换为被管理Docker的宿主机IP地址
    curl http://<IP>:2375/version
    
  7. 使用安装Portainer的主机浏览器访问 http://127.0.0.1:9000 进入控制台。
  8. 如果是初次登陆,需要设置admin的密码。
  9. 因为没有配置docker.sock文件映射,只会显示“Add Environments”,点击这个,然后在“Select your environment(s)”页面选择“Docker Standalone”。
  10. 配置远程:
    • Connect to your Docker Standalone environment:选择API
    • Name:随便填
    • Docker API URL:填写被管理Docker的宿主机IP:2375,例如:192.168.0.100:2375
  11. 点击“Connect”即可连接远程主机的Docker。

问题

  1. 创建容器的时候如果提示“iptables: No chain/target/match by that name.”
    • 原因:iptable_nat 内核模块未加载,导致 iptables -t nat 操作失败。
    • 处理:
      1. 加载必要的内核模块
        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:连接跟踪(现代内核所需)
      2. 验证是否加载成功
        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
        
      3. 重启 Docker 服务(重建网络规则)
        sudo systemctl restart docker
        
      4. 永久生效(避免重启后失效)每次开机都会自动加载这些模块
        sudo nano /etc/modules-load.d/docker.conf
        # 写入以下内容
        ip_tables
        iptable_nat
        nf_nat
        nf_conntrack
        
posted @ 2026-01-16 14:41  苍凉温暖  阅读(3)  评论(0)    收藏  举报