本文记录了 Windows 系统上 WSL2 部署 Docker 应用后,出现本地浏览器无法访问问题的详细解决过程。
前言
浏览 GitHub 找到了一个有用的项目,该项目可以 Docker 部署,想着先部署到本地尝试一下。
WSL2 中部署 Docker 完成后,在 Windows 浏览器中输入地址却无法正常访问,尝试诸多办法后终于解决。
WSL2 系统 : Ubuntu-22.04
Windows 版本 : Windows 11 专业工作站版,23H2
文中使用的 Linux 命令均为 root
用户执行。
解决方式
- 在 WSL2 的 Ubuntu 系统中使用
vi
命令创建并编辑/etc/docker/daemon.json
文件vi /etc/docker/daemon.json
- 在
/etc/docker/daemon.json
文件中添加以下内容,保存后退出{ "iptables": false }
- 执行以下命令重启 Docker 服务
systemctl restart docker
- Docker 服务重启后,再次运行 Docker 容器即可正常访问
问题排查
本部分记录了 Docker 无法访问的原因排查过程,或许下次出现类似情况能用得上。
本次操作所运行的 Docker 容器命令为:
docker run -d --name it-tools --restart unless-stopped -p 8080:80 ghcr.io/corentinth/it-tools:latest
防火墙
首先对 Ubuntu 防火墙状态进行查看,确认是否为防火墙问题。
- 查看 Ubuntu 系统中的防火墙状态
systemctl status ufw
- 若防火墙为 active 状态,执行以下命令关闭防火墙
systemctl stop ufw
- 关闭防火墙后重新在 Windows 浏览器访问容器应用
http://localhost:8080/
访问地址
然后对 Windows 浏览器访问的请求协议、 WSL2 的 IP 地址、 WSL2 的端口号进行确认。
- 确认 Windows 浏览器访问的地址是
http
协议而不是https
协议http://localhost:8080/ http://127.0.0.1:8080/
- 确认 Windows 浏览器访问的地址是 WSL2 的 IP 地址
http://192.168.1.100:8080/
容器镜像
不排除为 Docker 镜像的问题,可创建新的 Docker 镜像容器确认。
- 执行以下命令创建并运行 Nginx 的镜像容器
docker run --rm -d -p 8081:80 public.ecr.aws/nginx/nginx:1.27.1-alpine3.20-perl
- 确认容器为正在运行状态,执行以下命令查看正在运行容器的信息
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
- 以下为命令执行结果:
- 尝试 Windows 浏览器访问新的 Docker 容器地址,确认是否为镜像问题
创建 Docker 容器时,需要注意端口映射的问题,别映射错端口了。
网络连通
同时也应该考虑到 Windows 和 WSL2 、 WSL2 和 Docker 之间的网络通信是否正常。
- 在 WSL2 中对 Windows 系统的 IP 地址使用 PING 命令
ping 192.168.1.75
- 在 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 ......
- Docker 的 IP 地址可使用
若无法 PING 通主机,则考虑是否为 Windows 或 Ubuntu 防火墙问题。
IP 转发
若网络通信没问题,则继续排查是否为 Linux 的 IP 转发功能问题。
- 执行以下命令开启 Linux 的 IP 转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
- 在
/etc/docker/daemon.json
文件中添加以下内容来关闭 Docker 自带的 IP 转发功能{ "iptables": false }
- 重新运行 Docker 容器,然后在 Windows 浏览器中尝试访问 Docker 应用
内核冲突
通过重新安装 Docker 来排除 Docker 与 Linux 内核冲突的可能性。
以下内容来自于 清华大学开源软件镜像站
- 如果你过去安装过 docker,先删掉
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove $pkg; done
如果是 Ubuntu 系统,还需要检查一下是否存在 snap 方式安装的 Docker 软件包
- 首先安装依赖
apt-get update apt-get install ca-certificates curl gnupg
- 信任 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
- 最后安装
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 没被卸载。