docker-本地服务器上的多个数据库

docker-本地服务器上的多个数据库,docker,docker-compose,Docker,Docker Compose,我有两个独立的代码库应用程序,它们在同一个db服务器实例上都有自己的数据库 我试图在docker中复制这个,在我的笔记本电脑上本地复制。我希望能够让两个应用程序使用相同的数据库实例 我想要 两个应用程序同时在docker中启动 这两个应用程序都必须能够访问本地主机上的数据库 数据库数据被持久化 能够在本地主机上使用IDE查看数据库中的数据 因此,我的每个应用程序都有自己的dockerfile和dockercompose文件 在app1上,我启动绑定到数据库的应用程序的docker实例。一切都

我有两个独立的代码库应用程序,它们在同一个db服务器实例上都有自己的数据库

我试图在docker中复制这个,在我的笔记本电脑上本地复制。我希望能够让两个应用程序使用相同的数据库实例

我想要

  • 两个应用程序同时在docker中启动

  • 这两个应用程序都必须能够访问本地主机上的数据库

  • 数据库数据被持久化

  • 能够在本地主机上使用IDE查看数据库中的数据

因此,我的每个应用程序都有自己的
dockerfile
dockercompose
文件

在app1上,我启动绑定到数据库的应用程序的docker实例。一切都开始得很好

当我尝试启动app2时,出现以下错误:

ERROR: for app2_mssql_1  Cannot start service mssql: driver failed programming external connectivity on endpoint app2_mssql_1 (12d550c8f032ccdbe67e02445a0b87bff2b2306d03da1d14ad5369472a200620): Bind for 0.0.0.0:1433 failed: port is already allocated
我怎么能让它们同时运行呢?两个应用程序都需要能够访问彼此的数据库表

这是docker-compose.yml文件

附录1:

以下是app2:

version: "3"
services:
  web:
    build:
      context: .
      args:
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - mssql
  mssql:
      image: 'microsoft/mssql-server-linux'
      ports:
          - '1433:1433'
      environment:
          - ACCEPT_EULA=Y
          - SA_PASSWORD=P455w0rd!
      volumes:
          - app2_db:/var/lib/mssql/data
volumes:
  app2_db:
我应该在每个docker compose文件中使用相同的卷吗?
我想问题是在每个应用程序中,我正在旋转2个不同的db实例,而实际上我想我只需要一个,并且它可以被我的所有应用程序使用?

docker compose文件中的
端口部分将容器端口绑定到主机端口,这在您的情况下会导致端口冲突


您需要从至少一个compose文件中删除
端口
部分。这样,docker compose就可以同时满足这两种需求。您可以同时访问这两个应用程序。但请记住,这两个应用程序将被放置在单独的网桥中

docker compose文件中的
端口
部分将容器端口绑定到主机的端口,这在您的情况下会导致端口冲突


您需要从至少一个compose文件中删除
端口
部分。这样,docker compose就可以同时满足这两种需求。您可以同时访问这两个应用程序。但请记住,这两个应用程序将被放置在单独的网桥中

将同一端口(1433)公开给主机两次。(这就是“端口:…”的作用)。这是不可能的,因为它会阻止主机上的同一端口(消息是这么说的)

我认为在这些情况下,最常见的方法是将数据库链接到应用程序。(见附件)。通过这样做,您的应用程序仍然可以访问其公共端口(1433)上的数据库,但无法再从主机访问数据库(仅从链接到主机的容器访问)


我在docker compose文件中看到的另一个错误是,两个应用程序都由相同的端口公开。出于同样的原因,这也是不可能的。我建议您将其中一个更改为“3000:3001”,以便您可以在端口3001上访问此应用程序。

您将同一端口(1433)向主机公开两次。(这就是“端口:…”的作用)。这是不可能的,因为它会阻止主机上的同一端口(消息是这么说的)

我认为在这些情况下,最常见的方法是将数据库链接到应用程序。(见附件)。通过这样做,您的应用程序仍然可以访问其公共端口(1433)上的数据库,但无法再从主机访问数据库(仅从链接到主机的容器访问)

我在docker compose文件中看到的另一个错误是,两个应用程序都由相同的端口公开。出于同样的原因,这也是不可能的。我建议您将其中一个更改为“3000:3001”,以便您可以在端口3001上访问此应用程序。

docker compose up的工作原理: 假设您的应用程序位于名为myapp的目录中,并且您的docker-compose.yml

运行docker compose up时,会发生以下情况:

  • 创建了一个名为myapp_default的网络
  • 容器是使用web的配置创建的。它以web的名称加入网络myapp_默认值
  • 容器是使用db的配置创建的。它以db的名义加入网络myapp_default
  • 如果在不同的文件夹myapp2中运行第二个docker-compose.yml,则该网络将是myapp2\u默认值

    当前配置创建两个卷、两个数据库容器和两个应用程序。如果您可以使它们在同一网络中运行,并将数据库作为单个容器运行,那么它将起作用

    我认为您不需要两个数据库容器两个卷

    方法1:

    docker compose.yml作为单个compose

    version: "3"
    services:
      app1:
        build:
          context: .
          args:
        volumes:
          - .:/app # give the path depending up on the docker file of app1.
        ports:
          - "3030:3000"
        depends_on:
          - mssql
      app2:
        build:
          context: .
          args:
        volumes:
          - .:/app # give the path depending up on the docker file of app2.
        ports:
          - "3032:3000"
        depends_on:
          - mssql
      mssql:
          image: 'microsoft/mssql-server-linux'
          ports:
              - '1433:1433'
          environment:
              - ACCEPT_EULA=Y
              - SA_PASSWORD=SqlServer1234!
          volumes:
              - app_docker_db:/var/lib/mssql/data
    volumes:
      app_docker_db:
    
    方法2:

    要进一步隔离它,仍然要将它们作为单独的composefiles运行,请使用网络创建三个composefiles

    用于网络数据库的docker-compose.yml

    version: "3"
        services:
          mssql:
              image: 'microsoft/mssql-server-linux'
              ports:
                  - '1433:1433'
              environment:
                  - ACCEPT_EULA=Y
                  - SA_PASSWORD=SqlServer1234!
              volumes:
                  - app_docker_db:/var/lib/mssql/data
              networks:
                    - test_network
    volumes:
        app_docker_db
        
    networks:
        test_network:
    
  • app1的docker-ompose.yml
  • 删除数据库容器并将以下行添加到撰写文件中

    version: "3"
    services:
      app1:
        build:
          context: .
          args:
        volumes:
          - .:/app # give the path depending up on the docker file of app1.
        ports:
          - "3030:3000"    
    networks:
        default:
            external:
              name: my-pre-existing-network
    
    通过替换docker compose文件,对另一个docker compose执行相同的操作

    创建docker compose文件还有许多其他选项

    docker compose up的工作原理: 假设您的应用程序位于名为myapp的目录中,并且您的docker-compose.yml

    运行docker compose up时,会发生以下情况:

  • 创建了一个名为myapp_default的网络
  • 容器是使用web的配置创建的。它以web的名称加入网络myapp_默认值
  • 容器是使用db的配置创建的。它以db的名义加入网络myapp_default
  • 如果在不同的文件夹myapp2中运行第二个docker-compose.yml,则该网络将是myapp2\u默认值

    当前配置创建两个卷、两个数据库容器和两个应用程序。如果您可以使它们在同一网络中运行,并将数据库作为单个容器运行,那么它将起作用

    我认为您不需要两个数据库容器两个卷

    方法1:

    docker compose.yml作为单个compose

    version: "3"
    services:
      app1:
        build:
          context: .
          args:
        volumes:
          - .:/app # give the path depending up on the docker file of app1.
        ports:
          - "3030:3000"
        depends_on:
          - mssql
      app2:
        build:
          context: .
          args:
        volumes:
          - .:/app # give the path depending up on the docker file of app2.
        ports:
          - "3032:3000"
        depends_on:
          - mssql
      mssql:
          image: 'microsoft/mssql-server-linux'
          ports:
              - '1433:1433'
          environment:
              - ACCEPT_EULA=Y
              - SA_PASSWORD=SqlServer1234!
          volumes:
              - app_docker_db:/var/lib/mssql/data
    volumes:
      app_docker_db: