2017-10-20 140 views
0

我有两个应用程序是不同的代码库,并且它们在同一个数据库服务器实例上都有自己的数据库。docker - 本地多个数据库

我想在我的笔记本电脑本地复制泊坞窗。我希望能够让这两个应用程序使用相同的数据库实例。

我想

  • 两个应用程序在同一时间在码头工人开始

  • 两个应用程序能够访问本地主机数据库

  • 数据库中的数据持久化

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

因此,我的每个应用程序都有自己的dockerfiledocker-compose文件。

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

当我尝试启动APP 2,我得到以下错误:

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 

我怎样才能让他们都在同一时间运行?这两个应用程序都需要能够访问其他数据库表格!

这里是泊坞窗,compose.yml文件

APP1:

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: 
      - app1_db:/var/lib/mssql/data 
volumes: 
    app1_db: 

这里是APP 2:

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: 

我应该使用每个泊坞窗,撰写相同体积文件? 我想问题是在每个应用程序中我旋转了2个不同的数据库实例,实际上我想我只想要一个,并且它会被我的所有应用程序使用?

+0

请检查这一点 - https://stackoverflow.com/a/39204865/3896066 – saurav

回答

1

如何码头工人,组成了作品:

假设你的应用程序是在一个目录所谓的myapp,你的搬运工,compose.yml

当您运行码头工人,组成了,会发生以下情况:

  1. 创建一个名为myapp_default网络。
  2. 使用网络配置创建容器。它以名称web加入网络myapp_default。
  3. 容器是使用db的配置创建的。它在名称db下加入网络myapp_default。

如果在不同的文件夹myapp2中运行第二个docker-compose.yml,那么nework将是myapp2_default。

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

我不认为你期待两个数据库容器两个卷。

方法1:

搬运工-compose.yml作为一个单一的撰写。

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:

将其隔离进一步,还是要运行它们的sepeare composefiles,创建网络3个撰写文件。

搬运工-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: 
  • 搬运工-ompose.yml为APP1
  • 删除数据库容器,并添加以下行到您的撰写文件

    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文件。 Configure the default network and Use a pre-existing network

    +0

    这看起来很有希望,我理解方法1并会尝试。你可以扩展方法2吗?也许格式化yml?谢谢! – user3437721

    +0

    哪个更适合使用容器来部署应用程序? – user3437721

    +0

    我想测试一下,一个网络名为test_network,另一个网络名为my-pre-existing-network,这是否正确,我们是否应该一致? – user3437721

    1

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

    您需要从至少一个撰写文件中删除ports部分。这样,docker-compose可以兼得。你可以同时访问这两个应用程序。但请记住,这两个应用程序将被放置在不同的网络桥梁中

    +0

    我删除的端口从墨绿色文件中的一个,但我得到了同样的错误 – user3437721

    1

    您将同一个端口(1433)暴露两次到主机。 (这是什么“端口:...”)。这是不可能的,因为它会阻塞主机上的相同端口(这就是消息所说的)。

    我认为在这些情况下最常见的方式是将数据库链接到应用程序。 (见https://docs.docker.com/compose/compose-file/#links)。通过这样做,您的应用程序仍可以访问其公共端口上的数据库(1433),但不能从主机访问数据库(仅限于链接到它的容器)。

    我在泊坞窗撰写文件中看到的另一个错误是这两个应用程序都由相同的端口公开。由于相同的原因,这也是不可能的。我建议你改变他们,以“3000:3001”一个,这样你就可以在端口访问这个应用程序3001

    +0

    你能在我应如何改变撰写的文件扩展?我是码头工人新手,ansd的文档不清楚。所以在app2中,我应该添加一个链接到app1 mssql? – user3437721

    +0

    好吧,所以我在app2中添加了一个链接到mssql。我能够运行创建数据库的docker命令,但正如您所说的,它在容器外部不可用,并且我无法在数据库查看器中浏览它。此外 - app2无法访问或查看app1数据库 - 是否有任何实现我正在做的事情? – user3437721

    +0

    它们两个的音量相同吗? – user3437721