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

时间:2017-06-14 11:43:46

标签: mysql docker docker-compose

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

将本地MySQL数据库与应用程序连接起来

我的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

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

8 个答案:

答案 0 :(得分:23)

只需使用host.docker.internal而不是localhost

答案 1 :(得分:21)

在docker网络中找到主机ip。如果您使用docker-compose.yml exit_group,则可能是IP:version: "3"但确认搜索" Gateway&#34 ;你的容器(你的主人):

172.18.0.1

因此在你的docker应用程序中指向MySQL:docker inspect <container-id-or-name> | grep Gateway "Gateway": "", "IPv6Gateway": "", "Gateway": "172.18.0.1", "IPv6Gateway": "", (可能在配置文件中)。考虑到只要docker网络仍然相同(通过docker-compose创建网络,并且除非你172.18.0.1:3306除去它),IP就是固定的。

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

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

0.0.0.0

然后,将version: '3' services: web-app: build: context: . dockerfile: web-app/Dockerfile ports: - 8080:8080 network_mode: "host" 指向mysql,如下所示:hibernate.properties

答案 2 :(得分:0)

sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2003,“无法连接到'127.0.0.1'上的MySQL服务器([Errno 111]连接被拒绝)”) 我试图解决上述问题,同时尝试从Dockerized flask应用程序连接localhost mysql服务器。该线程中的解决方案非常有用

答案 3 :(得分:0)

问题:

在同一场景中,我们想为服务设置开发本地计算机设置,开发人员只需制作docker-compose up -d并在其本地计算机上使用所有最新开发版本即可。

但是,在将docker-compose中的docker-compose.yml中配置为服务的基于tomcat的Web服务连接到**mysql-8.0**服务时,我们开始遇到问题。因此,作为替代方法和快速修复,我们认为应将本地笔记本电脑上配置的本地mysql与Ubuntu和docker-compose结合使用。

我们的tomcat应用程序正在使用一个带有jdbc config变量的application-dev.yml文件来连接到mysql,就像这样

    url: jdbc:mysql://db:3306/abcDB?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: abcderf

Docker-compose.yml

version: '3'
services:
      db:
        image: mysql:8.0
        container_name: db
        restart: unless-stopped
        ports:
          - "3306:3306"
        environment:
          - MYSQL_ROOT_PASSWORD=abcd
          - MYSQL_PASSWORD=abcd
          - MYSQL_DATABASE=abcdDB
        volumes: 
          - ./sql-dump:/docker-entrypoint-initdb.d
        command: '--default-authentication-plugin=mysql_native_password'
      
      frontend:
        container_name: frontend
        image: abc/abc:frontend-1.1.36
        depends_on:
          - backend

      nginx:
        container_name: nginx
        image: nginx:1.19-alpine
        links:
          - "frontend"
          - "backend"
        volumes:
          - ./proxyConf:/etc/nginx/conf.d 
        ports:
          - "80:80"
          - "443:443"
      backend:
        container_name: backend
        image: abc/abc:server-3.1.161
        restart: unless-stopped
        env_file: .env
        environment:
          - SPRING_PROFILES_ACTIVE=devtest
          - DB_HOST=db:3306
          - DB_NAME=abcDB
        depends_on:
          - db

解决方案对我们有用:
当我们想从本地mysql连接docker-compose tomcat服务时,我们尝试了以下路由。

docker inspect <container-id-or-name> | grep Gateway返回的IP网关ip值为`

"Gateway": "",
        "IPv6Gateway": "",
        "Gateway": "172.18.0.1",
        "IPv6Gateway": ""

如下所示在application-dev.yml中使用了上述Ip(${DB_HOST}的URL发布解析如下所示,但是IP更改为下一个更高的docker-compose down后,例如:172.19.0.1 )

    url: jdbc:mysql://172.18.0.1:3306/abcDB?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: abcderf

修改后的 docker-compose.yml

version: '3'
services:
      frontend:
        container_name: frontend
        image: abc/abc:frontend-1.1.36
        depends_on:
          - backend

      nginx:
        container_name: nginx
        image: nginx:1.19-alpine
        links:
          - "frontend"
          - "backend"
        volumes:
          - ./proxyConf:/etc/nginx/conf.d 
        ports:
          - "80:80"
          - "443:443"
      backend:
        container_name: backend
        image: abc/abc:server-3.1.161
        restart: unless-stopped
        env_file: .env
        environment:
          - SPRING_PROFILES_ACTIVE=devtest
          - DB_HOST=172.18.0.1:3306
          - DB_NAME=abcDB
        depends_on:
          - db

并且还更新了bind-address = 0.0.0.0中的/etc/mysql/mysql.conf.d/mysqld.cnf,并从mysql命令行允许root用户从任何IP连接。

以下是可用于 mysql-8.0 的唯一命令,其他命令均因错误syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'abcd'' at line 1

而失败
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
UPDATE mysql.user SET host='%' WHERE user='root';

重新启动mysql客户端

sudo service mysql restart

答案 4 :(得分:0)

本地我让 MySQL 在端口 3306 上运行,而 MySQL 容器在同一端口 3306 上运行

在连接到它之前,您必须确保 MySQL 或您在容器中使用的任何数据库服务已在本地环境中停止

就我而言,我通过 Homebrew 运行 MySQL

brew services stop mysql

答案 5 :(得分:0)

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

MONGO_SERVER = {
'host': 'host.docker.internal',
'port': 27017,
'username': 'admin',
'password': '123456'}

答案 6 :(得分:-1)

允许使用mysqld.cnf的权限

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address            = 0.0.0.0

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

sudo systemctl restart mysql.service

登录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;

找到您的IP

ip addr show

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

答案 7 :(得分:-2)

在docker中使用172.17.0.1。它的主机静态IP地址