从其他容器访问mysql容器

tvokkenx  于 2023-08-02  发布在  Mysql
关注(0)|答案(5)|浏览(115)

我用mysql安装了docker容器,暴露了3306。我已经指定了数据库用户,数据库密码,并创建了一个测试数据库,并给予新用户特权。
在另一个容器中,我想访问这个数据库。
所以我用一个简单的php脚本设置了一个新的容器,在这个数据库中创建新的表。
我知道mysql容器的ip是172.17.0.2,所以:

$mysqli = new mysqli("172.17.0.2", "mattia", "prova", "prova");

字符串
比使用mysqli我创建新的表和一切工作正常。
但是我认为使用他的IP地址连接到容器是不好的。
是否有其他方法来指定数据库主机?我尝试了mysql容器的主机名,但它不工作。

hxzsmxv2

hxzsmxv21#

--link标志被认为是传统功能,您应该使用用户定义的网络。
您可以在同一网络上运行两个容器:

docker run -d --name php_container --network my_network my_php_image

docker run -d --name mysql_container --network my_network my_mysql_image

字符串
该网络上的每个容器都能够使用容器名称作为主机名进行相互通信。

zmeyuzjn

zmeyuzjn2#

你需要在docker run命令中使用--link标志或使用docker-compose中的link功能将docker容器链接在一起。例如:

docker run -d -name app-container-name --link mysql-container-name app-image-name

字符串
这样,docker会将mysql容器的IP地址添加到应用程序容器的/etc/hosts文件中。有关完整文档,请参阅:MySQL Docker Containers: Understanding the basics

wh6knrhe

wh6knrhe3#

在你的docker-compose.yml文件中添加一个link属性到你的web服务器服务:https://docs.docker.com/compose/networking/#links
然后在查询字符串中,host参数的值是数据库服务名称:

$mysqli = new mysqli("database", "mattia", "prova", "prova");

字符串

hmae6n7t

hmae6n7t4#

如果你使用docker-compose,那么数据库将可以在服务名称下访问。

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

字符串
然后,可以使用以下命令访问数据库: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/

jogvjijk

jogvjijk5#

environment:
  - MYSQL_ROOT_PASSWORD=password
  - MYSQL_DATABASE=dbname
  - MYSQL_ROOT_HOST=%

字符串

MYSQL_ROOT_HOST=%


在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

相关问题