如何连接本地托管的 MySQL 数据库与 Docker 容器

通过 docker-compose.yml我能够运行应用程序。现在我们希望将应用程序移动到生产环境中,但是我们不想使用容器数据库。那么,有没有什么方法可以让我使用 docker-compose将本地 MySQL 数据库与应用程序连接起来呢?

我的码头作品。 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部分。

110007 次浏览

在 Docker 网络中查找主机 ip。如果你使用码头-组成。Yml version: "3"它可能是 IP 是: 172.18.0.1但要确认一下搜索您的容器(您的主机)的“网关”:

docker inspect <container-id-or-name> | grep Gateway
"Gateway": "",
"IPv6Gateway": "",
"Gateway": "172.18.0.1",
"IPv6Gateway": "",

所以在 docker 应用程序内部指向 MySQL 的代码如下: 172.18.0.1:3306(可能在配置文件中)。考虑到只要 docker 网络仍然相同,IP 就是固定的(网络是由 docker-compose 创建的,除非您使用 docker-compose down,否则它不会被删除)

另外,检查 MySQL 是否正在监听它的所有接口。在您的 my.cnf搜索 bind-address,应该是 0.0.0.0(考虑安全问题,如果您的服务器有公共 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

并且在你的码头容器192.168.x. x 中使用它

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

要让它在 Linux 上工作,只需要启动 Docker 容器并传递参数 --add-host host.docker.internal:host-gateway

问题:

我们有一个相同的场景,我们希望为服务设置一个 Development 本地机器设置,在这个场景中,开发人员只需制作 docker-compose up -d并使用本地机器中的所有最新开发版本。

但是当我们将基于 tomcat 的 Web 服务配置为 docker-compose.yml中的服务并连接到 docker-compose 中的 **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

码头-作曲

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 服务,所以我们尝试了以下路由。

返回 ip 网关 ip 值为’的

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

application-dev.yml中使用了上面的 IP,如下所示(${DB_HOST}的 URL 帖子解析看起来如下所示,但是在 docker-compose down ex: 172.19.0.1中 IP 改为下一个高点)

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

改良 码头作曲

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而失败

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

重新启动 mysql 客户端

sudo service mysql restart

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

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

在我的例子中,我在 Homebrew 中运行 MySQL

brew services stop mysql

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

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

它通过在 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"

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