【问题标题】:Docker-compose MySQL container access from another containerDocker-compose 从另一个容器访问 MySQL 容器
【发布时间】:2021-03-04 16:36:13
【问题描述】:

我对 docker 比较陌生,我正在尝试使用 MySQL 服务器和数据库为我的 C# 项目创建一个开发环境。

我已经有我的 C# 控制台项目 Dockerfile 和一个 docker-compose 文件,它为我的项目提供服务和为 MySQL 服务器提供服务。问题是,在我的 C# 控制台项目中,我无法使用服务名称或 container_name(如果已设置)从该容器访问 MySQL 服务器。

有我的docker-compose.yml 文件:

version: '3.5'

services:
  databasetester:
    image: ${DOCKER_REGISTRY-}databasetester
    build:
      context: .
      dockerfile: src/DatabaseTester/Dockerfile
    depends_on:
      - db

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: testdb
      MYSQL_USER: testusr
      MYSQL_PASSWORD: testpwd
      MYSQL_ROOT_PASSWORD: testroot
    ports:
      - "3307:3306"
    expose:
      - 3307
    volumes:
      - ./bin/_database:/var/lib/mysql

另外,在我的项目中,我使用 EntityFrameworkCore 来访问数据库:

public class DatabaseContext : DbContext
{
    public DbSet<CharacterEntity> Characters { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseMySql("Server=db;Uid=testusr;Pwd=testpwd;Database=testdb;Port=3307");

        base.OnConfiguring(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

public class CharacterEntity
{
    public int Id { get; set; }

    public string Name { get; set; }
}

当我启动项目时,它在尝试连接到 mysql 服务器时抛出错误:

引发了一个异常,可能是由于暂时性故障。考虑通过将“EnableRetryOnFailure()”添加到“UseMySql”调用来启用瞬时错误恢复能力。 无法连接到任何指定的 MySQL 主机。

我尝试遵循许多教程和指南,他们都使用服务名称在 mysql 连接字符串中有一个“服务器”,但在我的情况下它似乎不起作用。

您有什么想法可以解决这个问题吗?

【问题讨论】:

  • 尝试将您的连接更改为optionsBuilder.UseMySql("Server=db;Uid=testusr;Pwd=testpwd;Database=testdb;Port=3306")

标签: c# mysql docker docker-compose entity-framework-core


【解决方案1】:

根据码头工人documentation

默认情况下,Compose 会为您的应用设置一个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且它们可以通过与容器名称相同的主机名发现。

您应该将连接字符串的端口更改为3306,因为当您定义"3307:3306" 时,端口3307 可从网络外使用,而您无法从网络内部访问3307

 optionsBuilder.UseMySql("Server=db;Uid=testusr;Pwd=testpwd;Database=testdb;Port=3306");

【讨论】:

  • 感谢您解决了错误。我错过了暴露的端口只能从网络外使用的部分。我今天学到了一些有用的东西!谢谢。 :-)
  • @Eastrall 很高兴我帮助了你 ;)
猜你喜欢
  • 2021-12-08
  • 2017-07-12
  • 2019-06-13
  • 2017-10-12
  • 1970-01-01
  • 2023-02-24
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多