一个关于 ipv6 和 ipv4 的问题
我在 WSL2-debian11 环境内,使用 docker20.10.17 和 MySQL8.0 ,并使用 dockerfile 以 MySQL 为基础构建并运行新镜像。
mysql 的 my.cnf 文件配置如下
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
# By default we only accept connections from localhost
bind-address = 0.0.0.0
# Disabling symbolic-links is recommended to prevent assorted security risks
default-time_zone = '+8:00'
symbolic-links=0
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
dockerfile 如下
FROM mysql:latest
MAINTAINER cf
EXPOSE 3306
LABEL version="0.1" description="MySQL 服务器" by="cf"
ENV MYSQL_ROOT_PASSWORD cf1111
ENV MYSQL_USER="cf"
ENV MYSQL_PASSWORD="cfcfcf"
RUN mkdir -p /var/log/mysql
RUN mkdir -p /etc/mysql
RUN mkdir -p /var/lib/mysql
COPY log /var/log/mysql
COPY conf/my.cnf /etc/mysql/my.cnf
COPY data /var/lib/mysql
COPY data-files /var/lib/mysql-files
使用如下命令构建、运行镜像
docker build -t gettorrentmysql:0.1 mysql80
docker run gettorrentmysql:0.1
运行后通过 netstat -tunl 命令发现,容器监听了ipv6下的:::3306 端口,而非ipv4。
而使用 windows 端的 MySQL workbench 新建连接,发现 hostname 填写::和 0:0:0:0:0:0:0:0 都不能连接 反而是 127.0.0.1 才能连接。
问题: workbench 使用的 ip 地址和 wsl 内容器暴露的 ip 地址为什么不一致?哪个才是真的?或者 workbench 有一些优化? 百思不得其解,希望各位能帮忙解惑,感谢!
1
westoy 2022-06-24 00:23:50 +08:00 3
0.0.0.0 不是一个 IP , 是可以匹配所有 IP , 服务端绑定这个 IP 就等于绑定设备上所有地址了, 拿来连当然是不行的
|
2
foursevenlove 2022-06-24 09:03:42 +08:00
同意楼上
|
3
KimGuo 2022-06-24 12:19:26 +08:00
windows 的 docker 已经可以直接使用 wls2 进行运行了,支持命令的同时提供一个 gui ,比装在 wsl2 的系统下更方便使用
另外容器监听了:::3306 意味着可以接收任意 ip 对 3306 发来的请求,如果有配置 ip/掩码意味着只接收指定范围 ip 对此端口的请求 127.0.0.1 就是本地回环(localhost),应该是跟 ipv6 的 0:0:0:0:0:0:0:1 等价,win 会处理好把这块转发到 wsl 系统上,具体可能不对,因为不太熟 |
4
WaterWestBolus OP @westoy 谢谢~
|
5
WaterWestBolus OP @KimGuo 谢谢。但我目前还是想在 debian 下进行开发。
我目前看到的结果是这样: 通过 windows 的 docker desktop 客户端可以看到我的容器运行在 127.0.0.1:3306 上,但还是不能确定这个 ip:port 是怎么来的。可能是 docker desktop 客户端本身给 wsl2 做了一层优化吧。。 |
6
blless 2022-06-24 13:41:21 +08:00
@WaterWestBolus docker 容器跟宿主机之间你可以认为多加了一层网关转发,容器绑定的 0.0.0.0:3306 只是绑定容器虚拟 IP 的 port ,dockerfile 上 expose 的只是容器端口。但是宿主的绑定 IP 一般是 docker run 的时候动态绑定的,可以用-p 参数指定,具体参考这个文档 https://docs.docker.com/engine/reference/run/#expose-incoming-ports
|
7
WaterWestBolus OP @blless 谢谢!我也想的是多了一层转发。这层转发应该能通过抓包的方式得到结果吧?
还是得多看文档。原来-p 可以绑定 ip+port 啊! |