记 Docker 运行公共 MySQL 数据库供其他服务使用的配置过程
在 VPS 上部署服务时,使用 Docker 或 Docker Compose 是最方便的方式之一。例如博客系统Typecho和短链接服务Shlink都要求外部数据库,如果在每个服务的 Docker Compose 中都各自启动一个 MySQL,既浪费空间,维护也更复杂。
更理想的情况是:单独运行一个公共 MySQL 容器,让所有需要数据库的服务连接到它。这样不仅节省资源,备份时也只需备份一个数据库容器即可,大大降低维护成本。
笔者以MySQL服务为例,先运行一个公共的数据库服务,并让其他容器共享使用。
1. 启动公共 MySQL 服务
以下是 MySQL 服务的 docker-compose.yml 示例
version: '3.8'
services:
mysql:
container_name: mysql
image: mysql:8.0
restart: always
ports:
- 127.0.0.1:3306:3306
environment:
MYSQL_ROOT_PASSWORD: 1234567890
volumes:
- ./data/mysql:/var/lib/mysql
networks:
- shared-mysql
networks:
shared-mysql:
name: shared-mysql
其中关键点是:
- 为 MySQL 单独创建 s
hared-mysql网络,方便其他服务加入该网络并访问数据库 - 端口映射使用
127.0.0.1:3306,避免外部访问 - 数据持久化到
./data/mysql
执行 docker compose up -d 启动 MySQL服务。
2. 为其他应用创建独立的数据库与用户
为了安全与隔离,每个应用都应有独立的数据库与用户。以 Shlink 为例,步骤如下:
-
进入 MySQL 容器
docker exec -it mysql bash mysql -uroot -p #(输入 root 密码) -
创建数据库与用户
CREATE DATABASE shlink; CREATE USER 'shlink_user'@'%' IDENTIFIED BY 'shlink'; GRANT ALL PRIVILEGES ON shlink.* TO 'shlink_user'@'%'; FLUSH PRIVILEGES;- 创建数据库
shlink - 创建用户
shlink_user,密码为shlink - 为用户
shlink_user在数据库shlink上授权 - 最后退出
exit
- 创建数据库
这样就在数据库中建立起 shlink 表及用户供后续服务使用。
3. 在服务的Docker Compose中配置数据库环境变量
以笔者的 Shlink 短链接服务为例,需要在 Compose 文件中写入如下内容:
version: '3.8'
services:
shlink:
image: shlinkio/shlink:stable
container_name: shlink
ports:
- '127.0.0.1:8080:8080'
environment:
- DEFAULT_DOMAIN=shlink.test.com
- IS_HTTPS_ENABLED=true
- GEOLITE_LICENSE_KEY=123321123321
- INITIAL_API_KEY=123321
- REDIRECT_STATUS_CODE=301
- DB_DRIVER=mysql
- DB_HOST=mysql
- DB_PORT=3306
- DB_USER=shlink_user
- DB_PASSWORD=shlink
- DB_NAME=shlink
restart: always
networks:
- shared-mysql
shlink-web-client:
image: shlinkio/shlink-web-client:stable
container_name: shlink-web-client
ports:
- '127.0.0.1:8081:8080'
restart: always
networks:
shared-mysql:
external: true
从中看到,有几个关键点:
- 对于需要数据库的后端服务,要加入
networks: - shared-mysql,让后端和数据库服务在同一个网络下 - 数据库服务的HOST直接写容器的服务名称,也就是
DB_HOST=mysql - 最后的
networks也需要写明external: true - 其他数据库配置(库名、用户、密码)与前一步创建的保持一致即可
这样就 Shlink 就能成功连接公共 MySQL 数据库。
参考文献
[1] Docker 安装 Shlink 自建短网址. https://u.sb/docker-shlink/

浙公网安备 33010602011771号