簡體   English   中英

如何連接本地托管的 MySQL 數據庫與 docker 容器

[英]How to connect locally hosted MySQL database with the docker container

通過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

我只想連接到本地托管mysql數據庫,而不是app-db部分。

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

在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": "",

所以在你的172.18.0.1:3306應用程序中指向 MySQL 為: 172.18.0.1:3306 : 172.18.0.1:3306 (可能在配置文件中)。 考慮到該 IP 是固定的,只要 docker 網絡仍然相同(網絡是由 docker-compose 創建的,除非您執行docker-compose down否則不會刪除)

另外,檢查您的 MySQL 是否正在偵聽其所有接口。 my.cnf搜索應該是0.0.0.0 bind-address (如果您的服務器有公共 IP,請考慮安全問題)。


作為替代方案,您可以將與主機相同的網絡連接到容器中,以便共享本地主機,因此容器將在那里找到 mysql。 使用網絡模式作為“主機”:

version: '3'
services:
  web-app:
    build:
      context: .
      dockerfile: web-app/Dockerfile
    ports:
       - 8080:8080
    network_mode: "host"

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

使用 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.xx 中使用它

如果有人使用mac os ,請使用docker.for.mac.host.internal而不是host.docker.internal作為環境變量。

問題:

我們有一個相同的場景,我們想為服務設置開發本地機器設置,開發人員可以在其中進行docker-compose up -d並在他的本地機器上使用所有最新的開發版本。

但是,在將docker-compose.yml配置為服務的基於 tomcat 的 Web 服務連接到docker-compose.yml中的**mysql-8.0**服務時,我們開始面臨問題。 因此,作為替代和快速修復,我們認為使用本地筆記本電腦上配置的本地 mysql 與 Ubuntu 和 docker-compose。

我們的 tomcat 應用程序使用帶有 jdbc 配置變量的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 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 更改為下一個 highrt 后 docker docker-compose down ex: 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

並且還更新了/etc/mysql/mysql.conf.d/mysqld.cnfbind-address = 0.0.0.0並從 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錯誤而失敗syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'abcd'' at line 1 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

最簡單的方法是使用host.docker.internal而不是localhost

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

在本地,我在端口 3306 上運行 MySQL,在同一端口 3306 上運行 MySQL 容器

在連接到它之前,您必須確保 MySQL 或您在容器中使用的任何數據庫服務在本地環境中已停止

就我而言,我通過 Homebrew 運行 MySQL

brew services stop mysql

只需在docker中使用172.17.0.1。 它的主機靜態IP地址

它通過在docker-compose.yml中添加network_mode對我有用

version: '3'
services:
  aservice:
    image: image:latest
    ports:
      - "8080:8080"
      - "8787:8787"
    # Allow docker to connect to localhost
    network_mode: "host"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM