【问题标题】:Docker container won't access MySQL on host machineDocker 容器不会访问主机上的 MySQL
【发布时间】:2017-10-22 11:58:11
【问题描述】:

我在 VirtualBox 的虚拟机中安装了一个 docker,我正在尝试运行一个带有 dot Net Core 应用程序的容器,该应用程序连接到主机上的 MySQL 数据库。所以我已经在 Virtual Box 上为 mysql 和我的应用程序配置了转发端口。我可以通过主机中的“http://localhost:3131/api/users/login”访问我的服务,但它会抛出一个错误,提示无法连接 MySQL 数据库。当我不使用 docker 时,我还可以在主机中运行该应用程序。我查看了互联网上的其他线程,但除了下面显示的最后一个命令外,没有什么能启发我,但我无法运行,因为 MySQL 身份验证的配置是在应用程序中硬编码的,而不是使用配置文件。大体配置如下:

程序.cs

var host = new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>()
    .UseApplicationInsights()
    .UseUrls("http://*:80")
    .Build();

Dockerfile

FROM microsoft/aspnetcore

WORKDIR /app

COPY bin/Release/PublishOutput/ .

EXPOSE 80

ENTRYPOINT ["dotnet", "UsersApi.dll"]

Docker 运行命令

docker run -d -p 3000:80 user_api
// and also tried
docker run -d -p 3000:80 user_api --net=host
// and also tried
docker run -d -p 3000:80 user_api --add-host localhost:127.0.0.1

VirtualBox 转发端口:

NAT 3131 -> 3000    tcp
NAT 3306 -> 3306    tcp
NAT 2415 -> 22      

localhost(我以为它会出现端口 3131,但它还是调用了服务。)

Starting Nmap 7.40 ( https://nmap.org ) at 2017-05-22 11:23 E. South America Standard Time

Nmap scan report for localhost (127.0.0.1)

Host is up (0.0013s latency).

Other addresses for localhost (not scanned): ::1

rDNS record for 127.0.0.1: rinaldipc.com

Not shown: 994 closed ports

PORT     STATE SERVICE

22/tcp   open  ssh

135/tcp  open  msrpc

445/tcp  open  microsoft-ds

2179/tcp open  vmrdp

3306/tcp open  mysql

5357/tcp open  wsdapi

我认为需要添加的 Dockfile 中的 RUN 命令,但我不确定程序。

RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf

https://stackoverflow.com/questions/33827342/how-to-connect-mysql-workbench-to-running-mysql-inside-docker/33827463#33827463

【问题讨论】:

    标签: mysql docker asp.net-core virtualbox host


    【解决方案1】:

    由于您在 VirtualBox 中运行,因此在 VirtualBox 主机和 docker 之间还有另一层。您有一台托管 VirtualBox (1) -> Linux in VirtualBox (2) -> docker (3) 的机器。

    docker (3) 的“localhost”表示 (2),因此它希望 mysql 处于 (2) 上。在您的情况下,您在 (1) 上有 mysql。

    从 (3) 访问 (1) 的唯一方法是显式使用 (1) 的 IP,而不是“localhost”别名。

    【讨论】:

    • 那么我如何能够从 (1) 输入 localhost:3131 访问 (3) 不是双向连接?那不就可以从(3)访问(1)中的mysql了吗? (感谢维克多的耐心等待)
    猜你喜欢
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2019-08-08
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多