[英]Docker container connect to MySQL database locally -> redirect to another container
[英]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.cnf
的bind-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.