docker工人 – 本地多个数据库

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

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

我想要

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

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

  • 数据库数据是持久的

  • 能够使用localhost上的IDE查看数据库中的数据

所以我的每个应用程序都有自己的dockerfiledockerfile docker-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个不同的数据库实例,实际上,我想我只想要一个,并且它被所有我的应用程序使用?

docker工作人员如何工作:

假设你的应用程序在一个名为myapp的目录中,并且是你的docker-compose.yml

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

  1. 一个名为myapp_default的networking被创build。
  2. 一个容器是使用Web的configuration创build的。 它以web名称joinnetworkingmyapp_default。
  3. 容器是使用db的configuration创build的。 它在名称db下joinnetworkingmyapp_default。

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

当前configuration创build两个卷,两个数据库容器和两个应用程序。 如果你可以使它们在同一个networking中运行,并运行数据库作为单个容器,它将工作。

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

方法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组合文件运行,创build三个与networking组成文件。

docker-compose.yml用于networking数据库

 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

删除数据库容器,并将下面的行添加到您的撰写文件

 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 

通过replacedocker-compose文件来为另一个docker工人做同样的事情。

还有很多其他的选项来创builddocker-compose文件。 configuration默认networking并使用预先存在的networking

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

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

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

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

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