【问题标题】:How can I connect from `project` to `mysql` container in docker swarm?如何在 docker swarm 中从 `project` 连接到 `mysql` 容器?
【发布时间】:2021-11-03 09:36:41
【问题描述】:

我正在尝试使用以下配置docker-compose.yaml 文件通过以下命令使用 docker swarm 部署堆栈:

docker stack deploy --with-registry-auth -c docker-compose.yaml project
version: "3.9"

services:
  mysql:
    image: mysql:8.0
    deploy:
      replicas: 1
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - internal
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_HOST: '%'
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: project_production
      MYSQL_USER: username
      MYSQL_PASSWORD: password
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.13.4
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - internal
  website:
    image: registry.gitlab.com/project/project-website:latest
    networks:
      - internal
    deploy:
      replicas: 1
    ports:
      - 3000:3000
    environment:
      - RAILS_ENV=production
      - MYSQL_HOST=mysql
      - ES_HOST=http://es01
      - project_DATABASE_USERNAME=root
      - project_DATABASE_PASSWORD=root
    depends_on:
      - es01
      - mysql

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local
  mysql_data:

networks:
  internal:
    external: true
    name: project

在部署堆栈之前,我还通过以下命令为项目创建了网络:

docker network create -d overlay project

但是当我看到使用docker logs 命令的project 的日志时,我看到以下错误停止了我的project 开始:

Mysql2::Error: Host '10.0.2.202' is not allowed to connect to this MySQL server

我完全按照文件的建议进行了,我不确定我提出的设置有什么问题!

问题:

如何在 docker swarm 中从 project 连接到 mysql 容器?

【问题讨论】:

  • 您首先在外部创建网络有什么原因吗?看起来它是一个公共网络,您正在连接到错误的 (Myslq2) 实例。你的mysql用户名和密码也不匹配。

标签: docker containers docker-swarm


【解决方案1】:

根据文档,Docker Swarm 会自动为您创建覆盖网络。所以我认为你不需要默认创建外部网络,除非你有特定的需求:

当您初始化 swarm 或将 Docker 主机加入现有 swarm 时,会在该 Docker 主机上创建两个新网络:

  • 一个称为入口的覆盖网络,它处理与群服务相关的控制和数据流量。当您创建一个 swarm 服务并且不将其连接到用户定义的覆盖网络时,它会默认连接到入口网络。
  • 一个名为 docker_gwbridge 的桥接网络,它将单个 Docker 守护程序连接到参与集群的其他守护程序。

正如 Chris 在 cmets 中也提到的,数据库凭据也不匹配。

可选:MYSQL_ROOT_HOST 仅当您想以root 用户身份连接时才需要,这在生产环境中不推荐使用。也不需要将端口暴露给主机,因为数据库服务只会在集群内部使用。因此,如果您仍想使用 root 用户,您可以将变量设置为仅允许来自集群内部的连接,例如 MYSQL_ROOT_HOST=10.*.*.*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2019-01-25
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多