我正在使用以下命令在Ubuntu上运行SQL服务器容器
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyPassword' \
-p 1433:1433 --name db \
-d microsoft/mssql-server-linux:2017-latest`
我在运行WebAPI Core应用程序的同一台机器上有另一个容器,如果我在连接字符串中指定了服务器ip,但是如果我用“localhost”或“。”替换它,那么一切正常。它无法连接。
任何人都面临同样的问题?每次在新机器上运行应用程序时,我都不想修改连接字符串。
编辑1: 我需要在构建过程中启动并运行我的数据库,以便首先应用EntityFramework代码进行迁移,因此我不能只将SQL Server作为依赖项添加到docker-compose.yml中
编辑2 这是我的docker-compose.yml
version: '3'
services:
webapi:
image: webapi
build:
context: ./
dockerfile: ./WebAPI/Dockerfile
args:
- connString=Server=db;Database...;
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://+:80
- conneString="Server=db;Database..."
ports:
- 50695:80
depends_on:
- db
db:
image: "microsoft/mssql-server-linux:2017-latest"
container_name: db
networks:
default:
external:
name: nat
我的泊坞文件
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
ARG connString
ENV connString "$connString"
WORKDIR /src
COPY *.sln ./
COPY WebAPI/WebAPI.csproj WebAPI/
RUN dotnet restore
COPY . .
WORKDIR /src/Repository
RUN dotnet restore
RUN dotnet ef database update
WORKDIR /src/WebAPI
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebAPI.dll"]
答案 0 :(得分:0)
首先,您通常希望使连接字符串易于配置(可能是环境变量),因为在不同计算机上运行的应用程序也可能连接到不同的数据库服务器。
至于你的码头问题,你可能想要研究使用docker compose而不仅仅是原始的docker。 Compose为群集中的所有容器设置主机名别名,因此您只能使用db
之类的主机名。
答案 1 :(得分:0)
是的,您可以使用localhost连接数据库,这比IP地址更好。
您需要将容器链接到数据库容器。
如果您使用的是docker-compose,请按照示例
container1:
build: image_name
links:
- mysql:mysql
container2:
build: image_name
links:
- mysql:mysql
mysql:
build: mysql
在上面的示例中,您将看到,我将mysql容器链接到每个其他容器,因此您不需要指定IP地址。
如果您没有使用docker-compose,请在您的docker run命令中使用
--link sql_container_name:sql_container_name
希望这会对你有所帮助,如果有任何问题,请告诉我?