
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
该镜像包含MariaDB 10.1(支持Galera)及其所有组件: * MariaDB客户端包 * Percona Xtrabackup * jq - 轻量级灵活的命令行JSON处理器 * report_status.sh - 每隔`TTL`时间向etcd报告Galera状态 * healthcheck.sh## 运行容器Docker镜像接受以下参数: * 必须定义`MYSQL_ROOT_PASSWORD` * 镜像会为XtraBackup SST方法创建`xtrabackup@localhost`用户。若需为该用户设置密码,可通过`XTRABACKUP_PASSWORD`指定 * 若使用发现服务(目前仅支持`etcd`),通过`DISCOVERY_SERVICE`设置地址(ip:port格式),可接受逗号分隔的多个地址。镜像会通过`CLUSTER_NAME`自动查找运行中的集群并加入(或启动新集群) * 若不使用发现服务,可使用`CLUSTER_JOIN`变量。空值将启动新集群;若需加入现有集群,将其设为集群节点IP地址列表 * 默认`TTL`为30秒。容器在正常运行(wsrep_cluster_state_comment=Synced)时,会通过`report_status.sh`每隔`TTL - 2`秒报告状态。若容器宕机,将停止向etcd更新,键(wsrep_cluster_state_comment)会在过期后被移除,表明该节点不再与集群同步,构建Galera通信地址时将被跳过 建议至少运行3个容器以实现高可用,也可通过标准`docker run`命令运行独立节点。### Docker Engine Swarm Mode#### 临时存储假设: * etcd集群运行在192.168.55.111:2379、192.168.55.112:2379、192.168.55.113:2379 * 已创建名为`galera-net`的覆盖网络 在Docker Swarm模式下运行三节点MariaDB Galera集群(临时存储):```bash $ docker service create \ --name mariadb-galera \ --replicas 3 \ -p 3306:3306 \ --network galera-net \ --env MYSQL_ROOT_PASSWORD=mypassword \ --env DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379 \ --env XTRABACKUP_PASSWORD=mypassword \ --env CLUSTER_NAME=my_wsrep_cluster \ severalnines/mariadb ```#### 持久存储假设: * etcd集群运行在192.168.55.111:2379、192.168.55.112:2379、192.168.55.113:2379 * 已创建名为`galera-net`的覆盖网络 在Docker Swarm模式下运行三节点MariaDB Galera集群(持久存储):```bash $ docker service create \ --name mariadb-galera \ --replicas 3 \ -p 3306:3306 \ --network galera-net \ --mount type=volume,source=galera-vol,destination=/var/lib/mysql \ --env MYSQL_ROOT_PASSWORD=mypassword \ --env DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379 \ --env XTRABACKUP_PASSWORD=mypassword \ --env CLUSTER_NAME=my_wsrep_cluster \ severalnines/mariadb ```#### 自定义my.cnf假设: * 所有Docker主机上存在`/mnt/docker/mysql-config`目录用于数据卷映射,自定义`my.cnf`需放置于此目录 * etcd集群运行在192.168.55.111:2379、192.168.55.112:2379、192.168.55.113:2379 * 已创建名为`galera-net`的覆盖网络 在Docker Swarm模式下运行三节点MariaDB Galera集群:```bash $ docker service create \ --name mariadb-galera \ --replicas 3 \ -p 3306:3306 \ --network galera-net \ --mount type=volume,source=galera-vol,destination=/var/lib/mysql \ --mount type=bind,src=/mnt/docker/mysql-config,dst=/etc/my.cnf.d \ --env MYSQL_ROOT_PASSWORD=mypassword \ --env DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379 \ --env XTRABACKUP_PASSWORD=mypassword \ --env CLUSTER_NAME=my_wsrep_cluster \ severalnines/mariadb
验证命令:```bash $ docker service ps mariadb-galera
外部应用/客户端可通过任何Docker主机IP或主机名的3306端口连接,请求会在Galera容器间负载均衡。连接通过Linux内核内置的IPVS负载均衡功能NAT到每个服务"任务"(即容器)的虚拟IP。若应用容器与Galera在同一覆盖网络(galera-net)中,可使用分配的虚拟IP,通过以下命令获取:```bash $ docker service inspect mariadb-galera -f "{{ .Endpoint.VirtualIPs }}"
或在同一网络的容器中ping服务名:bash $ ping mariadb-galera ### Kubernetes即将推出。### 无编排工具运行独立Galera节点命令:```bash
$ docker run -d
-p 3306
--name=galera
-e MYSQL_ROOT_PASSWORD=mypassword
-e DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379
-e CLUSTER_NAME=my_wsrep_cluster
-e XTRABACKUP_PASSWORD=mypassword
severalnines/mariadb
创建三节点Galera集群示例:```bash $ for i in 1 2 3; do \ docker run -d \ -p 3306 \ --name=galera${i} \ -e MYSQL_ROOT_PASSWORD=mypassword \ -e DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379 \ -e CLUSTER_NAME=my_wsrep_cluster \ -e XTRABACKUP_PASSWORD=mypassword \ docker.xuanyuan.run/severalnines/mariadb; done
验证命令:bash $ docker ps ## 构建镜像如需构建Docker镜像,下载https://github.com/severalnines/galera-docker-mariadb101%E4%B8%AD%E7%9A%84Docker%E7%9B%B8%E5%85%B3%E6%96%87%E4%BB%B6%EF%BC%9A%60%60%60bash
$ git clone https://github.com/severalnines/galera-docker-mariadb
$ cd galera-docker-mariadb
$ docker build -t --rm=true severalnines/mariadb .
验证命令:```bash $ docker images ```## 发现服务所有节点应定期向etcd报告状态,使用带过期时间的键。默认`TTL`为30秒,容器在正常运行(wsrep_cluster_state_comment=Synced)时,通过`report_status.sh`每隔`TTL - 2`秒报告状态。若容器宕机,停止更新etcd,键(wsrep_cluster_state_comment)过期后被移除,表明节点不再与集群同步,构建Galera通信地址时将被跳过。 通过etcd查看运行节点列表(假设CLUSTER_NAME="my_wsrep_cluster"):```javascript $ curl -s "http://192.168.55.111:2379/v2/keys/galera/my_wsrep_cluster?recursive=true" | python -m json.tool { "action": "get", "node": { "createdIndex": 10049, "dir": true, "key": "/galera/my_wsrep_cluster", "modifiedIndex": 10049, "nodes": [ { "createdIndex": 10067, "dir": true, "key": "/galera/my_wsrep_cluster/10.255.0.6", "modifiedIndex": 10067, "nodes": [ { "createdIndex": 10075, "expiration": "2016-11-29T10:55:35.37622336Z", "key": "/galera/my_wsrep_cluster/10.255.0.6/wsrep_last_committed", "modifiedIndex": 10075, "ttl": 10, "value": "0" }, { "createdIndex": 10073, "expiration": "2016-11-29T10:55:34.788170259Z", "key": "/galera/my_wsrep_cluster/10.255.0.6/wsrep_local_state_comment", "modifiedIndex": 10073, "ttl": 10, "value": "Synced" } ] }, { "createdIndex": 10049, "dir": true, "key": "/galera/my_wsrep_cluster/10.255.0.7", "modifiedIndex": 10049, "nodes": [ { "createdIndex": 10049, "key": "/galera/my_wsrep_cluster/10.255.0.7/ipaddress", "modifiedIndex": 10049, "value": "10.255.0.7" }, { "createdIndex": 10074, "expiration": "2016-11-29T10:55:35.218496083Z", "key": "/galera/my_wsrep_cluster/10.255.0.7/wsrep_last_committed", "modifiedIndex": 10074, "ttl": 10, "value": "0" }, { "createdIndex": 10072, "expiration": "2016-11-29T10:55:34.650574629Z", "key": "/galera/my_wsrep_cluster/10.255.0.7/wsrep_local_state_comment", "modifiedIndex": 10072, "ttl": 10, "value": "Synced" } ] }, { "createdIndex": 10070, "dir": true, "key": "/galera/my_wsrep_cluster/10.255.0.8", "modifiedIndex": 10070, "nodes": [ { "createdIndex": 10077, "expiration": "2016-11-29T10:55:39.681757381Z", "key": "/galera/my_wsrep_cluster/10.255.0.8/wsrep_last_committed", "modifiedIndex": 10077, "ttl": 15, "value": "0" }, { "createdIndex": 10076, "expiration": "2016-11-29T10:55:38.638268679Z", "key": "/galera/my_wsrep_cluster/10.255.0.8/wsrep_local_state_comment", "modifiedIndex": 10076, "ttl": 14, "value": "Synced" } ] } ] } } ```## 已知限制* 镜像在Docker 1.12.3版本(build 6b644ec)和CentOS 7.1环境下测试构建。 * 发生脑裂(所有节点处于Non-Primary状态)时无自动恢复机制。这是因为MySQL服务仍在运行但拒绝提供数据并向客户端返回错误,Docker仅关注前台MySQL进程是否终止,无法检测此状态。自动恢复存在风险(尤其当服务发现与Docker主机共置时)。若外部服务发现健康,需手动干预:选择最先进的节点引导,执行以下命令将其提升为Primary(网络恢复后其他节点会自动重新加入):```bash $ docker exec -it [container] mysql -uroot -pyoursecret -e 'set global wsrep_provider_options="pc.bootstrap=1"'
或使用etcdctl命令:```bash $ etcdctl rm /galera/my_wsrep_cluster --recursive ```## 开发请通过https://github.com/severalnines/galera-docker-mariadb创建issue,或通过支持渠道https://support.severalnines.com报告bug、改进建议。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务
以下是 severalnines/mariadb 相关的常用 Docker 镜像,适用于 关系型数据库、MySQL 兼容、高性能 等不同场景: