2017-10-20 28 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