我是n = int(input())
num = []
for i in range(0,n):
ele = int(input())
num.append(ele)
和docker
的初学者,我使用下面的命令来运行mysql
容器
mysql
现在它可以成功运行,并且为了获取生成的密码,我在命令下面运行
docker container run --publish 3306:3306 --name mysqlDB -d --env MYSQL_RANDOM_ROOT_PASSWORD=yes mysql
在日志中可以找到我的docker container logs [containerID]
,但是在尝试阅读日志时,我注意到了以下日志
[系统] [MY-011323] [服务器] X插件已准备好进行连接。套接字:'/var/run/mysqld/mysqlx.sock'绑定地址:'::'端口:33060
我可以知道这是什么意思吗?我打开端口33060是否有可能?以及如何验证呢?
答案 0 :(得分:1)
这似乎是一个MySQL插件,向MySQL添加了面向文档的API。在这里您可以找到更多信息:https://www.percona.com/blog/2019/01/07/understanding-mysql-x-all-flavors/
该端口号似乎与您的绑定无关,这只是该插件的默认端口号。
此外,该端口号没有暴露,因此,没有什么可担心的,攻击面仍然相同。
如果要禁用该功能,请按以下说明操作:https://dev.mysql.com/doc/refman/8.0/en/x-plugin-disabling.html(命令行选项可能是最好的选择-考虑到docker环境)。
要确保未暴露端口,您可以运行容器并执行docker ps
,您会看到类似以下的内容:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43dd96119ded lb_geo-api "/bin/sh -c 'exec sh…" 6 months ago Up 7 days 80/tcp, 0.0.0.0:4203->8080/tcp lb_geo-api_1_a86ebad528fc
最后一栏-“ PORTS”-是主机上的端口及其绑定的列表:
80/tcp
-端口80可以从容器内部暴露,但是未映射到主机端口,因此,没有人可以在此处连接0.0.0.0:4203->8080/tcp
-端口8080暴露并且映射到所有网络适配器上的端口4203,并且可以从外部连接因此,如果您的输出中没有端口33060,或者它存在但未映射,则很安全。在任何情况下,只有在启动容器时才可以映射它,因此,如果不这样做,则不会被映射。
答案 1 :(得分:1)
与我的@Isaac等效的MySQL日志条目使我感到惊讶,尽管我不使用Docker,但它使我想到了您的问题。这是我认为我已经学到的东西以及我所做的事情。
MySQL的“ X插件”扩展了MySQL,使其能够用作文档存储。参见MySQL manual section on server plugins,manual section on document store features和April 2018 document store availability announcement。
默认情况下,对于X插件功能,MySQL侦听绑定到所有IP地址的端口33060。请参见manual section on X plugin options and system variables(指示“ mysqlx_port”和“ mysqlx_bind_address”的默认值)和X plugin option and variable reference。对于传统功能,MySQL默认仍使用port 3306。
我相信默认的X插件端口和网络地址就是您发布的日志条目中反映的内容。特别是,我相信摘录X Plugin ... bind-address: '::'
表示MySQL对X插件连接的默认通配符IP地址绑定。
如果您想使用X插件功能,但不监听它们的所有IP地址,则可以使用mysqlx_bind_address option指定它侦听TCP / IP连接的地址。命令行格式为
--mysqlx-bind-address=addr
另外,您可以在MySQL选项文件中设置该系统变量,例如:
[mysqld]
<... other mysqld option group settings>
mysqlx_bind_address = 127.0.0.1
MySQL手册提供有关指定选项on the command line或option file中的有用的常规信息。这是有关setting MySQL options in a Docker container的一些信息,尽管我从未尝试过。
似乎MySQL的启用X插件的功能和MySQL的传统功能可以监听的网络地址都有不同的设置。您可以使用bind_address option设置传统功能的网络地址。因此,如果您希望将这两组功能都限制为侦听来自本地主机的TCP / IP连接,则可以将其放在您的MySQL选项文件中,这是我在我的尝试中所做的:
[mysqld]
bind_address = 127.0.0.1
mysqlx_bind_address = 127.0.0.1
相反,似乎可以设置一个系统变量skip_networking来仅允许本地非TCP / IP连接(例如Unix套接字或Windows命名管道或共享内存)用于传统功能和X插件功能。
如果您根本不想使用X插件功能,可以按照@alx的建议disable them。
要验证MySQL正在侦听哪些网络地址和端口,您有一个variety of options。在非docker Linux环境中,我发现
netstat -l | grep tcp
和
sudo lsof -i | grep mysql
有帮助。
答案 2 :(得分:0)
您已经发布了端口。该--publish 3306:3306
实际上将您的容器端口发布为主机端口,现在您的主机端口3306被mysql占用。如果您不希望这样做,则只需删除--published 3306:3306
,并且容器端口将不会绑定到主机端口。