【AI 总结】Use containerized databases

Use containerized databases | AI 总结

运行本地容器化数据库

主流数据库(如 MySQL、PostgreSQL、MongoDB)均有 Docker 官方镜像,可在 Docker Hub 搜索获取,镜像页面包含详细配置说明(以 MySQL 镜像为例)。支持通过 CLI 或 Docker Desktop GUI 两种方式运行容器:

  1. CLI 方式:执行命令
    1
    docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest
    各参数含义如下:
    • --name my-mysql:为容器命名,便于后续引用;
    • -e MYSQL_ROOT_PASSWORD=my-secret-pw:设置 MySQL 根密码,需替换为安全密码;
    • -e MYSQL_DATABASE=mydb:(可选)创建指定名称的数据库,可自定义数据库名;
    • -d:以分离模式运行容器,即后台运行;
    • mysql:latest:指定使用最新版本的 MySQL 镜像。
  2. GUI 方式:在 Docker Desktop 仪表盘全局搜索 “mysql”,选中镜像后点击 “Run”,在 “Run a new container” 弹窗中展开 “Optional settings”,配置容器名(my-mysql)、环境变量(MYSQL_ROOT_PASSWORD、MYSQL_DATABASE),最后点击 “Run”。
  3. 验证容器运行状态:执行 docker ps(CLI)或在 Docker Desktop “Container” 视图(GUI)查看。

访问容器化数据库的 Shell

需先确保数据库容器已运行,可通过 CLI 或 GUI 访问 Shell,用于管理数据库、执行命令等:

  1. CLI 方式:执行 docker exec -it my-mysql bash-it 保证终端可交互,my-mysql 为容器名,bash 表示在容器内打开 bash shell,执行 exit 可返回本地终端。
  2. GUI 方式:在 Docker Desktop “Containers” 视图,找到目标容器,在 “Actions” 列选择 “Show container actions”,再点击 “Open in terminal”。
  3. 示例操作:进入 Shell 后,可执行 mysql -u root -p,输入密码后通过 SHOW DATABASES; 查看数据库列表。

从主机连接容器化数据库

需将容器内端口映射到主机端口,以 MySQL 默认端口 3306 为例,步骤如下:

  1. 清理旧容器:先停止并删除之前运行的容器,CLI 执行 docker rm --force my-mysql,或在 GUI “Containers” 视图点击 “Delete” 图标。
  2. 运行带端口映射的容器
    • CLI 方式:执行
      1
      docker run -p 3307:3306 --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest
      -p 3307:3306 表示将主机 3307 端口映射到容器 3306 端口;
    • GUI 方式:运行容器时在 “Optional settings” 中设置 “Host port”(3307,对应容器 3306/tcp 端口),其他配置同前。
  3. 验证与连接:CLI 执行 docker ps 或在 GUI“Port (s)” 列查看端口映射,主机上的应用可通过 localhost:3307 访问容器内 MySQL 服务。

从另一个容器连接容器化数据库

通过 Docker 网络实现容器间通信,无需将数据库暴露到主机网络,步骤如下:

  1. 清理旧容器:同 “从主机连接” 步骤 1。
  2. 创建并使用 Docker 网络
    • 执行 docker network create my-network 创建名为 “my-network” 的网络;
    • 运行数据库容器并指定网络:
      1
      docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb --network my-network -d mysql:latest
    • 运行其他容器(以 phpMyAdmin 为例)并指定同一网络:
      1
      docker run --name my-phpmyadmin -d --network my-network -p 8080:80 -e PMA_HOST=my-mysql phpmyadmin
      -p 8080:80 用于主机访问该容器,PMA_HOST=my-mysql 指定数据库容器名。
  3. 验证通信:访问 http://localhost:8080,用 “root” 和 “my-secret-pw” 登录 phpMyAdmin,查看是否能连接到 MySQL 并显示数据库。同一网络(my-network)内的应用可通过 my-mysql:3306 访问数据库服务。

在卷中持久化数据库数据

通过 Docker 卷存储数据库文件,确保数据在容器重启、删除后不丢失,步骤如下:

  1. 清理旧容器:同前。
  2. 运行带卷挂载的容器并验证数据持久化
    • CLI 方式
      1. 运行容器:
        1
        docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -v my-db-volume:/var/lib/mysql -d mysql:latest
        -v my-db-volume:/var/lib/mysql 表示将 “my-db-volume” 卷挂载到容器 /var/lib/mysql 目录(MySQL 数据存储路径),卷不存在时 Docker 会自动创建;
      2. 创建测试数据:
        1
        docker exec my-mysql mysql -u root -pmy-secret-pw -e "CREATE TABLE IF NOT EXISTS mydb.mytable (column_name VARCHAR(255)); INSERT INTO mydb.mytable (column_name) VALUES ('value');"
      3. 删除旧容器:
        1
        docker rm --force my-mysql
      4. 启动新容器并挂载同一卷:
        1
        docker run --name my-mysql -v my-db-volume:/var/lib/mysql -d mysql:latest
        (无需重复设置环境变量,配置已保存在卷中);
      5. 验证数据:
        1
        docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"
        应能看到之前插入的数据。
    • GUI 方式:运行容器时在 “Optional settings” 中添加 “Volumes”(my-db-volume 映射到 /var/lib/mysql),后续创建数据、删除容器、重新运行容器并验证数据的操作,通过 GUI 终端和 “Containers” 视图完成,逻辑与 CLI 一致。

构建自定义数据库镜像

可自定义镜像以包含额外配置、脚本或工具,示例为构建含表初始化脚本的 MySQL 镜像:

  1. 清理旧容器:同前。
  2. 构建与运行自定义镜像
    • 创建 Dockerfile:在项目目录新建 Dockerfile,内容为
      1
      2
      3
      4
      # syntax=docker/dockerfile:1
      FROM mysql:latest
      ENV MYSQL_DATABASE mydb
      COPY ./scripts/ /docker-entrypoint-initdb.d/
      其中 COPY 指令将主机./scripts/ 目录下的文件(.sh.sql.sql.gz 格式)复制到容器 /docker-entrypoint-initdb.d/ 目录,容器首次启动时会执行这些脚本;
    • 创建初始化脚本:在 Dockerfile 所在目录新建 scripts 子目录,创建 create_table.sql,内容为
      1
      2
      3
      4
      CREATE TABLE IF NOT EXISTS mydb.myothertable (
      column_name VARCHAR(255)
      );
      INSERT INTO mydb.myothertable (column_name) VALUES ('other_value');
      最终目录结构为 your-project-directory/ 下含 scripts/(内有 create_table.sql)和 Dockerfile
    • 构建镜像:在终端进入 Dockerfile 所在目录,执行
      1
      docker build -t my-custom-mysql .
      -t my-custom-mysql 为镜像命名,. 指定构建上下文为当前目录;
    • 运行自定义镜像:
      1
      docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d my-custom-mysql
      (无需重复设置 MYSQL_DATABASE,已在 Dockerfile 中定义);
    • 验证:执行 docker ps 确认容器运行,再通过
      1
      docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.myothertable;"
      查看初始化脚本是否生效。

使用 Docker Compose 运行数据库

Docker Compose 可一键配置、管理多容器应用,示例为同时运行 MySQL 和 phpMyAdmin 容器:

  1. 创建 Compose 文件:在项目目录新建 compose.yaml,内容为
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    services:
    db:
    image: mysql:latest
    environment:
    MYSQL_ROOT_PASSWORD: my-secret-pw
    MYSQL_DATABASE: mydb
    ports:
    - 3307:3306
    volumes:
    - my-db-volume:/var/lib/mysql
    phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    environment:
    PMA_HOST: db
    PMA_PORT: 3306
    MYSQL_ROOT_PASSWORD: my-secret-pw
    ports:
    - 8080:80
    depends_on:
    - db
    volumes:
    my-db-volume:
    其中 db 服务为 MySQL 数据库,配置镜像、环境变量、端口映射(主机 3307: 容器 3306)和卷挂载;phpmyadmin 服务依赖 db 服务,通过 PMA_HOST: db(服务名)连接数据库,depends_on 确保 db 服务先启动;volumes 定义 my-db-volume 卷。
  2. 运行与管理 Compose 应用
    • 进入 compose.yaml 所在目录,执行 docker compose up 启动服务;
    • 访问 http://localhost:8080,用 “root” 和 “my-secret-pw” 登录 phpMyAdmin 操作数据库;
    • ctrl + c 停止容器。

【AI 总结】Use containerized databases
https://blog.lllllan.cn/docker/image/database/
作者
lllllan
发布于
2026年1月12日
许可协议