docker-本地服务器上的多个数据库
我有两个独立的代码库应用程序,它们在同一个db服务器实例上都有自己的数据库 我试图在docker中复制这个,在我的笔记本电脑上本地复制。我希望能够让两个应用程序使用相同的数据库实例 我想要docker-本地服务器上的多个数据库,docker,docker-compose,Docker,Docker Compose,我有两个独立的代码库应用程序,它们在同一个db服务器实例上都有自己的数据库 我试图在docker中复制这个,在我的笔记本电脑上本地复制。我希望能够让两个应用程序使用相同的数据库实例 我想要 两个应用程序同时在docker中启动 这两个应用程序都必须能够访问本地主机上的数据库 数据库数据被持久化 能够在本地主机上使用IDE查看数据库中的数据 因此,我的每个应用程序都有自己的dockerfile和dockercompose文件 在app1上,我启动绑定到数据库的应用程序的docker实例。一切都
- 两个应用程序同时在docker中启动
- 这两个应用程序都必须能够访问本地主机上的数据库
- 数据库数据被持久化
- 能够在本地主机上使用IDE查看数据库中的数据
dockerfile
和dockercompose
文件
在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文件
附录1:
以下是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个不同的db实例,而实际上我想我只需要一个,并且它可以被我的所有应用程序使用?docker compose文件中的
端口部分将容器端口绑定到主机端口,这在您的情况下会导致端口冲突
您需要从至少一个compose文件中删除端口
部分。这样,docker compose就可以同时满足这两种需求。您可以同时访问这两个应用程序。但请记住,这两个应用程序将被放置在单独的网桥中 docker compose文件中的端口
部分将容器端口绑定到主机的端口,这在您的情况下会导致端口冲突
您需要从至少一个compose文件中删除端口
部分。这样,docker compose就可以同时满足这两种需求。您可以同时访问这两个应用程序。但请记住,这两个应用程序将被放置在单独的网桥中 将同一端口(1433)公开给主机两次。(这就是“端口:…”的作用)。这是不可能的,因为它会阻止主机上的同一端口(消息是这么说的)
我认为在这些情况下,最常见的方法是将数据库链接到应用程序。(见附件)。通过这样做,您的应用程序仍然可以访问其公共端口(1433)上的数据库,但无法再从主机访问数据库(仅从链接到主机的容器访问)
我在docker compose文件中看到的另一个错误是,两个应用程序都由相同的端口公开。出于同样的原因,这也是不可能的。我建议您将其中一个更改为“3000:3001”,以便您可以在端口3001上访问此应用程序。您将同一端口(1433)向主机公开两次。(这就是“端口:…”的作用)。这是不可能的,因为它会阻止主机上的同一端口(消息是这么说的)
我认为在这些情况下,最常见的方法是将数据库链接到应用程序。(见附件)。通过这样做,您的应用程序仍然可以访问其公共端口(1433)上的数据库,但无法再从主机访问数据库(仅从链接到主机的容器访问)
我在docker compose文件中看到的另一个错误是,两个应用程序都由相同的端口公开。出于同样的原因,这也是不可能的。我建议您将其中一个更改为“3000:3001”,以便您可以在端口3001上访问此应用程序。docker compose up的工作原理:
假设您的应用程序位于名为myapp的目录中,并且您的docker-compose.yml
运行docker compose up时,会发生以下情况:
创建了一个名为myapp_default的网络
容器是使用web的配置创建的。它以web的名称加入网络myapp_默认值
容器是使用db的配置创建的。它以db的名义加入网络myapp_default
如果在不同的文件夹myapp2中运行第二个docker-compose.yml,则该网络将是myapp2\u默认值
当前配置创建两个卷、两个数据库容器和两个应用程序。如果您可以使它们在同一网络中运行,并将数据库作为单个容器运行,那么它将起作用
我认为您不需要两个数据库容器两个卷
方法1:
docker compose.yml作为单个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:
方法2:
要进一步隔离它,仍然要将它们作为单独的composefiles运行,请使用网络创建三个composefiles
用于网络数据库的docker-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:
app1的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文件还有许多其他选项 docker compose up的工作原理:
假设您的应用程序位于名为myapp的目录中,并且您的docker-compose.yml
运行docker compose up时,会发生以下情况:
创建了一个名为myapp_default的网络
容器是使用web的配置创建的。它以web的名称加入网络myapp_默认值
容器是使用db的配置创建的。它以db的名义加入网络myapp_default
如果在不同的文件夹myapp2中运行第二个docker-compose.yml,则该网络将是myapp2\u默认值
当前配置创建两个卷、两个数据库容器和两个应用程序。如果您可以使它们在同一网络中运行,并将数据库作为单个容器运行,那么它将起作用
我认为您不需要两个数据库容器两个卷
方法1:
docker compose.yml作为单个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: