docker - 本地

时间:2017-10-20 13:46:51

标签: docker docker-compose

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

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

我想

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

  • 两个应用程序都可以访问localhost上的数据库

  • 数据库数据保持不变

  • 能够使用localhost上的IDE

  • 查看数据库中的数据

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

在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文件

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:

这是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个不同的数据库实例,实际上我想我只想要一个,它被我的所有应用程序使用?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您将同一端口(1433)暴露两次到主机。 (这就是"端口:......"确实如此)。这是不可能的,因为它会阻止主机上的相同端口(这就是消息所说的内容)。

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

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

答案 2 :(得分:1)

docker-compose up 如何运作:

假设您的应用位于名为myapp的目录和docker-compose.yml

当您运行docker-compose时,会发生以下情况:

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

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

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

    我认为您不期望两个数据库容器两个卷。

    方法1:

    docker-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运行,用网络创建三个撰写文件。

    docker-compose.yml for network with network

    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:
    
    1. apper
    2. 的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文件。 Configure the default network and Use a pre-existing network