如何通过docker swarm创建运行相同mysql数据库的容器?

xxe27gdn  于 2023-02-28  发布在  Mysql
关注(0)|答案(1)|浏览(209)

我正在尝试使用Docker Swarm创建一个具有相同数据库的2个节点和2个容器的集群来练习。我首先创建了卷、网络并启动了集群:

docker volume create $service_volume
docker network create --driver overlay --scope global $network_name
docker swarm init

然后,我尝试创建数据库的副本,然后在集群中插入另一个节点,并通过NFS划分负载和同步文件。
我尝试使用一个docker组合文件如下:

version: '3.0'
services:
  mysql_service:
    image: mysql:latest
    replicas: 2
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123
      MYSQL_DATABASE: testdb
    ports:
      - '3306:3306'
    expose:
      - '3306'
    networks:
      - mysql_network
    volumes:
      - mysql_volume:/var/lib/mysql

但由于以下错误而无法创建服务:

ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.mysql_service: 'replicas'

然后我尝试直接通过以下方式创建服务:

docker service create --name mysql_service --replicas 2 --network mysql_network --env MYSQL_DATABASE=testdb --env MYSQL_ROOT_PASSWORD=123 --mount type=volume,src=mysql_volume,dst=/var/lib/mysql -p 3306:3306 mysql:latest

创建了服务,但没有在mysql_volume中创建新数据库,当尝试通过dbeaver连接sys.db(随图像提供)时,我收到一个错误:

null,  message from server: "Host '10.0.0.2' is not allowed to connect to this MySQL server"

我真的不知道我想做的是不该做的还是有别的办法。
先谢谢你!

gt0wga4j

gt0wga4j1#

尝试运行复制的mysql时会遇到一些问题。发布端口会将服务任务连接到群集入口网络,这将在副本之间负载平衡请求。现在我不熟悉mysql,但我认为您需要显式连接到一个或另一个示例来设置群集。
处理此问题的一种方法是使用主机模式网络。
首先,标记两个docker群节点作为你要运行mysql示例的两个节点:

docker node update --label-add mysql=true node1
docker node update --label-add mysql=true node2

然后,使用compose.yml部署mysql,如下所示:

version: "3.9"

networks:
  public:
    name: mysql_public
    attachable: true
    external: false

services:
  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: 123
      MYSQL_DATABASE: testdb
    networks:
    - public
    ports:
    - mode: host
      published: 3306
      target: 3306
    volumes:
    - /mnt/mysql:/var/lib/mysql
    deploy:
      replicas: 2
      placement:
        max_replicas_per_node: 1
        constraints:
        - node.labels.mysql==true

使用这种方法,您可以显式连接到Node1或Node2以访问两个不同的MySQL示例。
而且,由于运行mysql的主机都有标签,所以可以直接在节点上进行持久存储,我发现这比docker卷更安全,因为docker卷太容易修剪了。

相关问题