来自Official Mariadb website:
从容器外部连接到 MariaDB
如果我们尝试连接到本地主机上的 MariaDB 服务器,客户端将绕过网络并尝试使用本地文件系统中的套接字文件连接到服务器。但是,当 MariaDB 在容器内运行时,这不起作用,因为服务器的文件系统与主机隔离。客户端无法访问容器内的socket文件,所以连接失败。
因此,必须使用 TCP 建立与 MariaDB 服务器的连接,即使客户端与服务器容器在同一台计算机上运行。
大多数 MariaDB 镜像(包括官方镜像)都使用 #my.cnf# 文件中的 bind-address 选项禁用了外部 TCP 连接。本指南中使用的 docker 镜像基于 Ubuntu,因此文件位于 /etc/mysql/my.cnf。
要使用 MariaDB,我们需要编辑配置文件以更改适当的选项,然后重新启动容器。
在容器内,编辑文件 my.cnf 并检查以 bind-address 开头的行。在行首添加一个哈希以将其注释掉:
#bind-address = 127.0.0.1
保存文件。
当仍在容器内时,将关闭命令发送到 MariaDB。这将关闭服务器并退出到主机:
mysqladmin -u root -p shutdown
再次启动容器。这次 MariaDB 服务器将启用网络:
docker start mariadbtest
查找已分配给容器的 IP 地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadbtest
您现在可以使用与该 IP 地址的 TCP 连接来连接到 MariaDB 服务器。
强制 TCP 连接
如上所述在 MariaDB 中启用网络连接后,我们将能够从容器外部连接到服务器。
在主机上,运行客户端并将服务器地址(“-h”)设置为您在上一步中找到的容器 IP 地址:
mysql -h 172.17.0.2 -u root -p
这种简单的连接形式应该适用于大多数情况。根据您的配置,可能还需要为服务器指定端口或强制 TCP 模式:
mysql -h 172.17.0.2 -P 3306 --protocol=TCP -u root -p
集群容器和复制的端口配置
在不同的 Docker 容器中运行的多个 MariaDB 服务器可以使用 TCP 相互连接。这对于形成 Galera 集群或复制很有用。
当通过 Docker 运行集群或复制设置时,我们希望容器使用不同的端口。实现这一点的最快方法是将容器端口映射到我们系统上的不同端口。我们可以在创建容器(docker run 命令)时执行此操作,必要时使用 -p 选项多次。例如,对于 Galera 节点,我们将使用类似于以下的映射:
-p 4306:3306 -p 5567:5567 -p 5444:5444 -p 5568:5568