WSL2 解决 Docker 部署后无法本地访问的问题

本文记录了 Windows 系统上 WSL2 部署 Docker 应用后,出现本地浏览器无法访问问题的详细解决过程。

前言

浏览 GitHub 找到了一个有用的项目,该项目可以 Docker 部署,想着先部署到本地尝试一下。

WSL2 中部署 Docker 完成后,在 Windows 浏览器中输入地址却无法正常访问,尝试诸多办法后终于解决。

WSL2 系统 : Ubuntu-22.04

Windows 版本 : Windows 11 专业工作站版,23H2

文中使用的 Linux 命令均为 root 用户执行。

解决方式

  1. 在 WSL2 的 Ubuntu 系统中使用 vi 命令创建并编辑 /etc/docker/daemon.json 文件
    vi /etc/docker/daemon.json
    
  2. /etc/docker/daemon.json 文件中添加以下内容,保存后退出
    {
      "iptables": false
    }
    
  3. 执行以下命令重启 Docker 服务
    systemctl restart docker
    
  4. Docker 服务重启后,再次运行 Docker 容器即可正常访问

问题排查

本部分记录了 Docker 无法访问的原因排查过程,或许下次出现类似情况能用得上。

本次操作所运行的 Docker 容器命令为:

docker run -d --name it-tools --restart unless-stopped -p 8080:80 ghcr.io/corentinth/it-tools:latest

防火墙

首先对 Ubuntu 防火墙状态进行查看,确认是否为防火墙问题。

  1. 查看 Ubuntu 系统中的防火墙状态
    systemctl status ufw
    
  2. 若防火墙为 active 状态,执行以下命令关闭防火墙
    systemctl stop ufw
    
  3. 关闭防火墙后重新在 Windows 浏览器访问容器应用
    http://localhost:8080/
    

访问地址

然后对 Windows 浏览器访问的请求协议、 WSL2 的 IP 地址、 WSL2 的端口号进行确认。

  1. 确认 Windows 浏览器访问的地址是 http 协议而不是 https 协议
    http://localhost:8080/
    
    http://127.0.0.1:8080/
    
  2. 确认 Windows 浏览器访问的地址是 WSL2 的 IP 地址
    http://192.168.1.100:8080/
    

容器镜像

不排除为 Docker 镜像的问题,可创建新的 Docker 镜像容器确认。

  1. 执行以下命令创建并运行 Nginx 的镜像容器
    docker run --rm -d -p 8081:80 public.ecr.aws/nginx/nginx:1.27.1-alpine3.20-perl
    
  2. 确认容器为正在运行状态,执行以下命令查看正在运行容器的信息
    docker ps
    
    • 以下为命令执行结果:
      CONTAINER ID   IMAGE                                               COMMAND                  CREATED          STATUS          PORTS                                   NAMES
      a5b1c41804e9   public.ecr.aws/nginx/nginx:1.27.1-alpine3.20-perl   "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:8081->80/tcp, :::8081->80/tcp   suspicious_hugle
      1ac9a3d84ca3   ghcr.io/corentinth/it-tools:latest                  "/docker-entrypoint.…"   28 minutes ago   Up 28 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   it-tools
      
  3. 尝试 Windows 浏览器访问新的 Docker 容器地址,确认是否为镜像问题

创建 Docker 容器时,需要注意端口映射的问题,别映射错端口了。

网络连通

同时也应该考虑到 Windows 和 WSL2 、 WSL2 和 Docker 之间的网络通信是否正常。

  1. 在 WSL2 中对 Windows 系统的 IP 地址使用 PING 命令
    ping 192.168.1.75
    
  2. 在 WSL2 中对 Docker 的 IP 地址使用 PING 命令
    ping 172.17.0.1
    
    • Docker 的 IP 地址可使用 ip a 命令获取,其中的 docker0 网卡即为 Docker 的 IP 地址
      ......
      8: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
          link/ether 02:42:87:ae:75:35 brd ff:ff:ff:ff:ff:ff
          inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
             valid_lft forever preferred_lft forever
      ......
      

若无法 PING 通主机,则考虑是否为 Windows 或 Ubuntu 防火墙问题。

IP 转发

若网络通信没问题,则继续排查是否为 Linux 的 IP 转发功能问题。

  1. 执行以下命令开启 Linux 的 IP 转发功能
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  2. /etc/docker/daemon.json 文件中添加以下内容来关闭 Docker 自带的 IP 转发功能
    {
      "iptables": false
    }
    
  3. 重新运行 Docker 容器,然后在 Windows 浏览器中尝试访问 Docker 应用

内核冲突

通过重新安装 Docker 来排除 Docker 与 Linux 内核冲突的可能性。

以下内容来自于 清华大学开源软件镜像站

  1. 如果你过去安装过 docker,先删掉
    for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove $pkg; done
    

    如果是 Ubuntu 系统,还需要检查一下是否存在 snap 方式安装的 Docker 软件包

  2. 首先安装依赖
    apt-get update
    apt-get install ca-certificates curl gnupg
    
  3. 信任 Docker 的 GPG 公钥并添加仓库
    install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    sudo chmod a+r /etc/apt/keyrings/docker.gpg
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
      "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
      tee /etc/apt/sources.list.d/docker.list > /dev/null
    
  4. 最后安装
    apt-get update
    apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    

若可以访问 Docker 官网,建议同时参考官方的安装文档:Install Docker Engine on Ubuntu

总结

本文主要从几个常见的方面尝试解决 Docker 无法访问的问题,其他情况就无能为力了。

针对 WSL2 中的 Docker 无法访问的问题,我怀疑和我的 .wslconfig 配置文件有关,当然仅供猜测。

在腾讯云的 CentOS 7 服务器上部署的 Docker 没有这些问题,部署过程就挺顺利的。

吐槽一下 Ubuntu 的 snap 包管理,我说怎么卸载 Docker 后还能执行 Docker 命令,原来还有 snap 安装的 Docker 没被卸载。

参考链接

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇