如何使用 docker-compose 连接到数据库,连接到本地机器上的另一个服务(redash & mysql & python_script )

How to connect to db with docker-compose which connect to another service on local machine (redash & mysql & python_script )

我有数据库,它连接到 python 脚本抛出网络 avito_connect。此脚本更改 MySQL 中的数据。我想用 redash 可视化这些数据。 Docker-使用 mysql_db 编写文件初始化 redash。 但是当我尝试在 mysql 服务中添加网络时 - redash 看不到 mysql db。我不明白为什么。 docker-编写以下代码:

 version: '2'
x-redash-service: &redash-service
  image: redash/redash:8.0.0.b32245
  depends_on:
    - postgres
    - redis
  env_file: redash.env
  restart: always

services:
  server:
    <<: *redash-service
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4

  scheduler:
    <<: *redash-service
    command: scheduler
    environment:
      QUEUES: "celery"
      WORKERS_COUNT: 1

  scheduled_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "scheduled_queries,schemas"
      WORKERS_COUNT: 1

  adhoc_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "queries"
      WORKERS_COUNT: 2

  redis:
    image: redis:5.0-alpine
    restart: always
  postgres:
    image: postgres:9.5-alpine
    env_file: redash.env
    restart: always
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

  mysql:
 #   container_name: mysql_db
    image: mysql:5.7
    stdin_open: true # docker run -i
    tty: true        # docker run -t
    volumes:
      - /Users/zzema/Documents/Docker/selenium-template/mysql:/var/lib/mysql
      - /Users/zzema/Documents/Docker/selenium-template/sql_config_path:/etc/mysql/conf.d
    restart: always
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_DATABASE=todos
      - MYSQL_USER=devuser
      - MYSQL_PASSWORD=secret

# With this uncomment lines I can't connect to my_sql from redash
#    networks:
#      avito_connect:
#        aliases:
#          - mysql
#networks:
#  avito_connect:
#    external: true

我在 docker-compose

末尾评论了无效的代码行

一个容器要到达另一个容器,它们必须在同一个 Docker 网络上。

Networking in Compose 中描述了您可以使用的整体网络环境。如果您什么都不做,Compose 将为您创建一个名为 default 的网络,容器将附加到该网络。如果您为服务声明 networks:,它将替换 default 网络,除非您明确声明它。

如果您取消注释这些行,实际上您会得到:

networks:
  default: {}          # created by Compose
  avito_connect: {...} # manually created
services:
  server:
    networks:
      default: {}      # automatically inserted
  mysql:
    networks:          # no `default` because there is an explicit setting
      avito_connect: {...}

现在这两个服务不在同一个网络上,无法相互连接。

有几种方法可以解决这个问题。一种是将数据库附加到两个网络:

services:
  mysql:
    networks:
      default:
      avito_connect:

另一种方法是将“默认”网络设置为您尝试连接的外部网络:

version: '2.4' # minimum 2.1, must be later than 2(.0)
networks:
  default:
    external: true
    name: avito_connect
# and no networks: blocks in any service