Docker容器不会在主机上访问MySQL

时间:2017-05-22 18:09:50

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

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

Program.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 Run Command

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 fowarding ports:

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

1 个答案:

答案 0 :(得分:1)

由于您在VirtualBox内部运行,因此VirtualBox主机和docker之间还有另一层。你有一台托管VirtualBox的机器(1) - &gt; VirtualBox中的Linux(2) - &gt;码头工人(3)。

&#34;本地主机&#34; for docker(3)表示(2)所以它期望mysql在(2)上。在你的情况下,你有(1)上的mysql。

从(3)访问(1)的唯一方法是明确使用(1)的IP而不是&#34; localhost&#34;别名。