我用mysql安装了docker容器,暴露了3306。我已经指定了数据库用户,数据库密码,并创建了一个测试数据库,并给予新用户特权。
在另一个容器中,我想访问这个数据库。
所以我用一个简单的php脚本设置了一个新的容器,在这个数据库中创建新的表。
我知道mysql容器的ip是172.17.0.2,所以:
$mysqli = new mysqli("172.17.0.2", "mattia", "prova", "prova");
字符串
比使用mysqli我创建新的表和一切工作正常。
但是我认为使用他的IP地址连接到容器是不好的。
是否有其他方法来指定数据库主机?我尝试了mysql容器的主机名,但它不工作。
5条答案
按热度按时间hxzsmxv21#
--link
标志被认为是传统功能,您应该使用用户定义的网络。您可以在同一网络上运行两个容器:
字符串
该网络上的每个容器都能够使用容器名称作为主机名进行相互通信。
zmeyuzjn2#
你需要在docker run命令中使用--link标志或使用docker-compose中的link功能将docker容器链接在一起。例如:
字符串
这样,docker会将mysql容器的IP地址添加到应用程序容器的/etc/hosts文件中。有关完整文档,请参阅:MySQL Docker Containers: Understanding the basics
wh6knrhe3#
在你的docker-compose.yml文件中添加一个link属性到你的web服务器服务:https://docs.docker.com/compose/networking/#links
然后在查询字符串中,host参数的值是数据库服务名称:
字符串
hmae6n7t4#
如果你使用docker-compose,那么数据库将可以在服务名称下访问。
字符串
然后,可以使用以下命令访问数据库:
postgres://db:5432
。这里的服务名同时也是内部网络中的主机名。引用自Docker Docs:
当你运行docker-compose up时,会发生以下情况:
1.创建一个名为myapp_default的网络。
1.使用web的配置创建容器。它以web的名称加入网络myapp_default。
1.使用db的配置创建容器。它以db的名称加入网络myapp_default。
来源:https://docs.docker.com/compose/networking/
jogvjijk5#
字符串
型
在docker-compose.yml文件中将根主机设置为
%
可以解决此问题。MYSQL_ROOT_HOST:默认情况下,MySQL创建'root'@'localhost'帐户。此帐户只能从容器内部连接到,如从容器内部连接到MySQL服务器中所述。要允许来自其他主机的根连接,请设置此环境变量。例如,值172.17.0.1是默认的Docker网关IP,它允许从运行容器的主机进行连接。该选项只接受一个条目,但允许使用通配符(例如,MYSQL_ROOT_HOST=172.* 或MYSQL_ROOT_HOST=%)。
来源:https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html#docker_var_mysql-root-host