问题解决 docker stack 部署后 REPLICAS 为 0

博客围绕Docker部署后服务未正常启动、REPLICAS显示为0的问题展开。虽未明确问题原因,但给出了解决方案,即单独重启有问题的container。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文 https://blog.youkuaiyun.com/u013054888/article/details/90741042

问题描述

使用 docker stack deploy -c docker-compose.yml xxx 执行部署后会发现服务并没有正常启动,REPLICAS 显示 为 0/1

如下:

➜  learn-docker-compose docker service ls
ID                  NAME                       MODE                REPLICAS            IMAGE                             PORTS
opcugofz0n55        getstartedlab_visualizer   replicated          0/1                 dockersamples/visualizer:stable   *:8083->8083/tcp
o1y8x0j5w6fv        getstartedlab_web          replicated          4/4                 henvealf/learn-docker:part-2      *:4000->80/tcp

原因

不知道

解决方案

单独重启有问题的 container 便可,比如

docker container stop 23131231
docker container start 23131231

End!

<think>我们正在使用Docker Stack部署ProxySQL服务。Docker Stack是用于在Swarm模式下部署服务栈的工具。部署ProxySQL需要准备一个docker-compose.yml文件(在Docker Stack中通常称为stack file),然后使用`docker stack deploy`命令部署。 注意:ProxySQL是一个高性能的MySQL中间件,常用于负载均衡、查询路由等。在部署前,我们需要确保有一个可用的MySQL后端(例如InnoDB Cluster)。 步骤概述: 1. 编写docker-compose.yml文件(stack file)定义ProxySQL服务。 2. 准备ProxySQL的配置文件(可选,可以通过环境变量或配置文件挂载)。 3. 使用`docker stack deploy`部署服务。 详细步骤: 1. 创建项目目录,例如`proxysql_stack`,并进入该目录。 ```bash mkdir proxysql_stack cd proxysql_stack ``` 2. 创建docker-compose.yml文件。这里我们使用一个示例配置,注意根据实际情况调整。 ```yaml version: '3.8' services: proxysql: image: proxysql/proxysql:latest ports: - "6033:6033" # ProxySQL的MySQL接口 - "6032:6032" # ProxySQL的管理接口 volumes: - proxysql-data:/var/lib/proxysql # 如果需要自定义配置,可以挂载配置文件 # - ./proxysql.cnf:/etc/proxysql.cnf environment: - MYSQL_ROOT_PASSWORD=rootpass # 设置ProxySQL的admin用户密码,可以通过环境变量设置,但注意安全 networks: - proxysql-net deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager # 建议部署在manager节点 volumes: proxysql-data: networks: proxysql-net: driver: overlay ``` 注意: - 我们使用了官方ProxySQL镜像。 - 挂载了一个数据卷用于持久化ProxySQL的数据(包括配置和状态)。 - 暴露了6033(用于MySQL客户端连接)和6032(用于管理)端口。 - 通过环境变量设置admin密码(这里仅为示例,生产环境应使用secrets)。 3. 如果需要自定义配置,可以在同一目录下创建`proxysql.cnf`文件,并在docker-compose.yml中取消挂载注释。但注意,ProxySQL在第一次启动时会使用内置的默认配置,然后可以通过管理接口修改配置,并保存到数据库(持久化到数据卷)。因此,通常我们不需要挂载配置文件,而是通过管理接口配置。 4. 部署服务栈: ```bash docker stack deploy -c docker-compose.yml proxysql ``` 5. 检查服务状态: ```bash docker stack services proxysql docker service logs proxysql_proxysql ``` 6. 配置ProxySQL: 部署完成后,我们需要通过管理接口(端口6032)配置后端MySQL服务器。可以使用MySQL客户端连接: ```bash mysql -u admin -p -h 127.0.0.1 -P 6032 --prompt='ProxySQLAdmin> ' ``` 密码为环境变量中设置的`MYSQL_ROOT_PASSWORD`(示例中为rootpass)。 在管理界面中,我们需要配置: - 添加后端MySQL服务器(例如InnoDB Cluster的节点) - 配置监控用户 - 配置读写分离规则等 示例配置命令: ```sql -- 添加后端服务器 INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (0, 'mysql-master', 3306); INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1, 'mysql-slave1', 3306); INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (1, 'mysql-slave2', 3306); -- 配置监控用户 SET mysql-monitor_username = 'monitor_user'; SET mysql-monitor_password = 'monitor_pass'; -- 保存配置 LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK; ``` 注意:以上配置仅为示例,实际配置需要根据后端MySQL集群的架构和用户权限来设置。 7. 测试连接: 使用MySQL客户端连接ProxySQL的6033端口,验证是否能正确路由到后端MySQL。 常见问题: - 服务启动后状态一直为“new”或“pending”:检查节点资源是否足够,以及放置约束(placement constraints)是否正确。使用`docker node ls`查看节点状态,确保有可用的manager节点。 - 如果之前部署过同名服务,使用`docker stack rm`删除后重新部署,确保没有残留的网络或卷冲突。 - 如果使用自定义配置文件,确保文件权限正确,容器可以读取。 安全建议: - 使用Docker secrets管理敏感信息(如密码)。 - 限制管理接口的访问(默认只监听在0.0.0.0,可以通过配置绑定到内部网络)。 以上步骤提供了一个基本的部署流程,具体配置需要根据实际环境调整。 相关问题: 1. 如何为ProxySQL配置TLS加密? 2. 如何实现ProxySQL的高可用? 3. 如何监控ProxySQL的性能指标? 4. 如何通过Docker Stack实现ProxySQL配置的自动化初始化?</think>以下是使用 Docker Stack 部署 ProxySQL 的详细教程,基于 Docker Swarm 模式实现高可用 MySQL 负载均衡: ### 前置条件 1. 已初始化 Docker Swarm 集群:`docker swarm init` 2. 已部署 MySQL InnoDB Cluster(至少3节点) 3. 开放防火墙端口:`6032`(管理)、`6033`(服务) --- ### 部署步骤 #### 步骤 1:创建配置文件目录 ```bash mkdir -p proxysql/conf cd proxysql ``` #### 步骤 2:创建 ProxySQL 配置文件 `conf/proxysql.cnf` ```ini datadir="/var/lib/proxysql" admin_variables = { admin_credentials = "admin:admin_password" mysql_ifaces = "0.0.0.0:6032" } mysql_variables = { threads = 4 interfaces = "0.0.0.0:6033" } mysql_servers = ( { address="mysql-master", port=3306, hostgroup=0 }, { address="mysql-slave1", port=3306, hostgroup=1 }, { address="mysql-slave2", port=3306, hostgroup=1 } ) mysql_query_rules = ( { rule_id=1 active=1 match_pattern="^SELECT" destination_hostgroup=1 apply=1 }, { rule_id=2 active=1 match_pattern=".*" destination_hostgroup=0 apply=1 } ) ``` > **关键配置说明**: > - `hostgroup=0`:写组(主库) > - `hostgroup=1`:读组(从库) > - `match_pattern="^SELECT"`:路由 SELECT 查询到读组[^1] #### 步骤 3:创建 Docker Stack 文件 `docker-compose.yml` ```yaml version: '3.8' services: proxysql: image: proxysql/proxysql:2.5 ports: - "6033:6033" # 应用连接端口 - "6032:6032" # 管理端口 volumes: - ./conf/proxysql.cnf:/etc/proxysql.cnf - proxysql-data:/var/lib/proxysql networks: - mysql-net deploy: replicas: 2 placement: constraints: - node.role == manager restart_policy: condition: on-failure volumes: proxysql-data: networks: mysql-net: external: true # 需提前创建 docker network create -d overlay mysql-net ``` #### 步骤 4:部署 Stack ```bash docker stack deploy -c docker-compose.yml proxysql ``` #### 步骤 5:验证服务状态 ```bash # 查看服务状态 docker service ls --filter name=proxysql # 检查日志 docker service logs proxysql_proxysql # 进入管理界面 mysql -u admin -padmin_password -h 127.0.0.1 -P 6032 --prompt='ProxySQL> ' ``` #### 步骤 6:在管理界面验证配置 ```sql -- 查看后端服务器状态 ProxySQL> SELECT * FROM runtime_mysql_servers; -- 检查路由规则 ProxySQL> SELECT * FROM mysql_query_rules; ``` --- ### 连接测试 ```bash # 通过 ProxySQL 连接 MySQL mysql -u app_user -papp_pass -h 127.0.0.1 -P 6033 ``` --- ### 故障排除技巧 1. **服务卡在 "new" 状态**: ```bash docker service update --force proxysql_proxysql ``` 2. **配置不生效**: - 检查配置文件挂载:`docker exec -it <container-id> cat /etc/proxysql.cnf` 3. **连接问题**: - 验证网络连通性:`docker exec -it proxysql_container nc -zv mysql-master 3306` --- ### 生产环境优化建议 1. **使用 Secrets 管理密码**: ```bash echo "admin_password" | docker secret create proxysql_admin_pass - ``` 在 compose 文件中引用: ```yaml environment: PROXYSQL_ADMIN_PASSWORD_FILE: /run/secrets/proxysql_admin_pass secrets: - proxysql_admin_pass ``` 2. **健康检查配置**: ```yaml healthcheck: test: ["CMD", "mysql", "-uadmin", "-p$${PROXYSQL_ADMIN_PASSWORD}", "-h127.0.0.1", "-P6032", "-e", "SHOW DATABASES"] interval: 10s timeout: 5s retries: 3 ``` 3. **自动故障转移**: ```sql UPDATE mysql_servers SET max_replication_lag = 30; LOAD MYSQL VARIABLES TO RUNTIME; ``` --- ### 架构图 ```mermaid graph TD A[Application] --> B(ProxySQL:6033) B --> C[MySQL Master] B --> D[MySQL Slave1] B --> E[MySQL Slave2] F[Admin] --> G(ProxySQL:6032) ``` --- ### 相关问题 1. 如何实现 ProxySQL 配置的热重载? 2. ProxySQL 与 MySQL Router 的性能对比如何? 3. 如何监控 ProxySQL 的流量指标? 4. 在 Kubernetes 中部署 ProxySQL 的最佳实践是什么? [^1]: ProxySQL 通过 hostgroup 实现读写分离,SELECT 查询自动路由到从库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值