docker 下 MySQL 容器的一些问题

2022-06-23 23:56:09 +08:00
 WaterWestBolus

一个关于 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 有一些优化? 百思不得其解,希望各位能帮忙解惑,感谢!

3418 次点击
所在节点    云计算
7 条回复
westoy
2022-06-24 00:23:50 +08:00
0.0.0.0 不是一个 IP , 是可以匹配所有 IP , 服务端绑定这个 IP 就等于绑定设备上所有地址了, 拿来连当然是不行的
foursevenlove
2022-06-24 09:03:42 +08:00
同意楼上
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 系统上,具体可能不对,因为不太熟
WaterWestBolus
2022-06-24 12:22:23 +08:00
@westoy 谢谢~
WaterWestBolus
2022-06-24 12:39:22 +08:00
@KimGuo 谢谢。但我目前还是想在 debian 下进行开发。
我目前看到的结果是这样:
通过 windows 的 docker desktop 客户端可以看到我的容器运行在 127.0.0.1:3306 上,但还是不能确定这个 ip:port 是怎么来的。可能是 docker desktop 客户端本身给 wsl2 做了一层优化吧。。
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
WaterWestBolus
2022-06-24 16:46:45 +08:00
@blless 谢谢!我也想的是多了一层转发。这层转发应该能通过抓包的方式得到结果吧?
还是得多看文档。原来-p 可以绑定 ip+port 啊!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/861783

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX