记 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 单独创建 shared-mysql 网络,方便其他服务加入该网络并访问数据库
  • 端口映射使用 127.0.0.1:3306,避免外部访问
  • 数据持久化到 ./data/mysql

执行 docker compose up -d 启动 MySQL服务。


2. 为其他应用创建独立的数据库与用户

为了安全与隔离,每个应用都应有独立的数据库与用户。以 Shlink 为例,步骤如下:

  1. 进入 MySQL 容器

    docker exec -it mysql bash
    mysql -uroot -p
    #(输入 root 密码)
    
  2. 创建数据库与用户

    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

从中看到,有几个关键点:

  1. 对于需要数据库的后端服务,要加入networks: - shared-mysql ,让后端和数据库服务在同一个网络下
  2. 数据库服务的HOST直接写容器的服务名称,也就是DB_HOST=mysql
  3. 最后的networks 也需要写明external: true
  4. 其他数据库配置(库名、用户、密码)与前一步创建的保持一致即可

这样就 Shlink 就能成功连接公共 MySQL 数据库。


参考文献

[1] Docker 安装 Shlink 自建短网址. https://u.sb/docker-shlink/

posted @ 2025-12-09 02:00  思言行知  阅读(2)  评论(0)    收藏  举报