user3437721
user3437721

Reputation: 2289

docker - multiple databases on local

I have 2 applications that are separate codebases, and they each have their own database on the same db server instance.

I am trying to replicate this in docker, locally on my laptop. I want to be able to have both apps use the same database instance.

I would like

So each of my apps has its own dockerfile and docker-compose file.

On app1, I start the docker instance of the app which is tied to the database. It all starts fine.

When I try to start app2, I get the following error:

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

How can i have them both running at the same time? BOTH apps need to be able to access each others database tables!

Here is the docker-compose.yml files

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:

and here is 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:

Should I be using the same volume in each docker-compose file? I guess the problem is in each app i am spinning up 2 different db instances, when in reality I guess i just want one, and it be used by all my apps?

Upvotes: 1

Views: 7339

Answers (3)

Jinna Baalu
Jinna Baalu

Reputation: 7809

How docker-compose up works:

Suppose your app is in a directory called myapp, and your docker-compose.yml

When you run docker-compose up, the following happens:

  1. A network called myapp_default is created.
  2. A container is created using web’s configuration. It joins the network myapp_default under the name web.
  3. A container is created using db’s configuration. It joins the network myapp_default under the name db.

If you run the second docker-compose.yml in different folder myapp2, then the nework will be myapp2_default.

Current configuration creates two volumes, two datebase containers and two apps. If you can make them run in the same network and run database as the single container it will work.

I don't think you are expecting two database container two two volumes.

Approach 1:

docker-compose.yml as a single 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:

Approach 2:

To Isolate it further, still want to run them as the sepeare composefiles, create three compose file with network.

docker-compose.yml for database 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. docker-ompose.yml for app1

remove the database container and add below lines to your compose file

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

Do the same for another docker-compose by replacing the docker-compose file.

There are many other option to create docker-compose files. Configure the default network and Use a pre-existing network

Upvotes: 1

tvvk
tvvk

Reputation: 99

You're exposing the same port (1433) two times to the host machine. (This is what "ports:..." does). This is not possible as it would block the same port on your host (That's what the message says).

I think the most common way in these cases is that you link your db's to your apps. (See https://docs.docker.com/compose/compose-file/#links). By doing this your applications can still access the databases on their common ports (1433), but the databases are not accessible from the host anymore (only from the container that is linked to it).

Another error I see in your docker compose file is that both applications are exposed by the same ports. This is also not possible for the same reason. I would suggest that you change one of them to "3000:3001", so you can access this application on port 3001.

Upvotes: 1

robert
robert

Reputation: 427

The ports part in docker-compose file will bound the container port to host's port which causes port conflict in your case.

You need to remove the ports part from at least one of the compose file. This way, docker-compose can be up for both. And you can have access to both app at same time. But remember both apps will be placed in separate network bridges.

Upvotes: 2

Related Questions