如何将本地托管的MySQL数据库与docker容器连接起来

Ben*_*ean 11 mysql docker docker-compose

通过docker-compose.yml我能够运行该应用程序.现在我们要将应用程序移动到生产环境,但我们不想使用容器数据库.那么有什么方法可以将我的本地MySQL数据库与应用程序连接使用docker-compose

我的docker-compose.yml看起来像:

version: '3'
services:
  web-app:
    build:
      context: .
      dockerfile: web-app/Dockerfile
    ports:
      - 8080:8080
    links:
      - app-db

  app-db:
    build:
      context: .
      dockerfile: app-db/Dockerfile

    environment:
    - MYSQL_ROOT_PASSWORD=password
    - MYSQL_DATABASE=Optimize
    ports:
      - 3306:3306
Run Code Online (Sandbox Code Playgroud)

而不是app-db部分我只想连接到我的本地托管mysql数据库.

Júl*_*lbo 65

只需使用host.docker.internal代替localhost.

  • 你刚刚救了我的命!我爱你。这应该是接受的答案,或者添加到接受的答案中以供所有人知道! (3认同)
  • @Júlio Falbo:我到底什么时候可以使用“host.docker.internal”而不是“localhost”?你能详细说明一下吗?谢谢你!! (2认同)
  • 为什么这对我不起作用?如果我从容器内部执行 ping 操作,我会看到“找不到主机” (2认同)

Rob*_*ert 28

在docker网络中找到主机ip.如果您使用docker-compose.yml,version: "3"则可能是IP为:172.18.0.1,但确认它正在搜索容器(您的主机)的"网关":

docker inspect <container-id-or-name> | grep Gateway
"Gateway": "",
            "IPv6Gateway": "",
            "Gateway": "172.18.0.1",
            "IPv6Gateway": "",
Run Code Online (Sandbox Code Playgroud)

所以在你的docker应用程序中指向MySQL :( 172.18.0.1:3306可能在配置文件中).考虑到只要docker网络仍然相同(通过docker-compose创建网络,并且除非你这样做,它不被删除docker-compose down),IP是固定的

另外,检查您的MySQL是否正在侦听其所有接口.在您的my.cnf搜索bind-address中应该是0.0.0.0(如果您的服务器具有公共IP,请考虑安全问题).


作为替代方案,您可以为容器带来与主机相同的网络,以便共享localhost,因此容器将在那里找到mysql.使用网络模式作为"主机":

version: '3'
services:
  web-app:
    build:
      context: .
      dockerfile: web-app/Dockerfile
    ports:
       - 8080:8080
    network_mode: "host"
Run Code Online (Sandbox Code Playgroud)

然后,指向你hibernate.properties的mysql,如下所示:localhost:3306

  • 我无法意识到发生了什么。您还有另一种选择,即在 docker-compose.yml 服务中使用“network_mode: host”。因此容器获得与主机相同的本地主机,因此您可以将 mysql 指向“localhost:3306” (2认同)

小智 9

如果有人使用mac os,请使用而docker.for.mac.host.internal不是作为host.docker.internal环境变量。


小智 8

使用 mysqld.cnf 允许权限

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address            = 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

保存您的文件并重新启动 mysql 服务器

sudo systemctl restart mysql.service
Run Code Online (Sandbox Code Playgroud)

登录Mysql

mysql -h localhost -u root -p
GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;
FLUSH PRIVILEGES; 
EXIT;
Run Code Online (Sandbox Code Playgroud)

查找您的 IP

ip addr show
Run Code Online (Sandbox Code Playgroud)

并在您的 docker 容器 192.168.xx 中使用它


小智 6

最简单的方法是host.docker.internal使用localhost

MONGO_SERVER = {
'host': 'host.docker.internal',
'port': 27017,
'username': 'admin',
'password': '123456'}
Run Code Online (Sandbox Code Playgroud)