多个docker容器间共享单个mariadb(Docker数据库服务)

image-20240329105545616

有什么用

多个docker容器间共享单个mariadb(Docker数据库服务)
多个Docker Compose组之间共享单个Docker数据库服务,避免一个应用就要开启一个mysql或mariadb的容器,避免浪费硬件系统的内存和硬盘资源

多个docker容器间共享网络

怎么用

修改新增的docker-compose.yml来让app的数据库部分连接到共享的mariadb docker容器中,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'
services:
app: #这只是一个举例,关键是看添加的两个章节:depends_on 和 networks
build: .
...
depends_on:
- yourls_mysql
networks:
- shared_network

#以下这个章节内容是固定的,告知当前的docker-compose要引用到外部的共享网络
networks:
shared_network:
external: true
name: shared_network

相关内容

实现方法

建立shared_network

需要新建一个共享network的docker容器,docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
version: '3'
services:
network:
image: alpine
command: tail -f /dev/null
networks:
- shared_network

networks:
shared_network:
driver: bridge

实践证实这个步骤不是必须的,仅需要把network和配置数据库参数部分按下面的设置即可:

SuiteCRM使用共享数据库

以SuiteCRM为例,让它使用共享的yourls_mysql数据库服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
version: '3.5'
services:
# mariadb: #因为要使用共享的数据库,所以注释掉这个章节
# image: docker.io/bitnami/mariadb:11.2
# environment:
# # ALLOW_EMPTY_PASSWORD is recommended only for development.
# - ALLOW_EMPTY_PASSWORD=yes
# - MARIADB_USER=bn_suitecrm
# - MARIADB_DATABASE=bitnami_suitecrm
# - MARIADB_PASSWORD=bitnami123
# volumes:
# - 'mariadb_data:/bitnami/mariadb'
suitecrm:
image: docker.io/bitnami/suitecrm:8
ports:
- '8100:8080'
- '8101:8443'
environment:
- SUITECRM_DATABASE_HOST=yourls_mysql
- SUITECRM_DATABASE_PORT_NUMBER=3306
- SUITECRM_DATABASE_USER=root
- SUITECRM_DATABASE_NAME=yourls
- SUITECRM_DATABASE_PASSWORD=my-secret-pw
# ALLOW_EMPTY_PASSWORD is recommended only for development.
#- ALLOW_EMPTY_PASSWORD=yes
volumes:
- './suitecrm_data:/bitnami/suitecrm'
#depends_on: #这个depends_on仅限于使用在都处于单个docker-compose.yml文件中的情况
# - yourls_mysql
networks:
- template_default
networks:
template_default:
external: true
name: template_default

启动这个docker-compose错误:

service “suitecrm” depends on undefined service yourls_mysql: invalid compose project

把depends_on 修改为 links 依然报同样错误。

修改了

1
network shared_network declared as external, but could not be found                                      

最终:

修改直接使用“template_default”这个network的话,可以直接使用到共享的数据库

下一步

打算用起来phpMyAdmin或者本机的DataGrip,来管理和备份数据库等操作…

注意事项

合并/共享数据库时,务必备份原先数据库中的内容;这样即便操作不当,还能追溯回原先版本。