【问题标题】:Running MySql on different port from Docker在与 Docker 不同的端口上运行 MySql
【发布时间】:2020-06-07 05:45:26
【问题描述】:

我遇到了与 Run MySQL on Port 3307 Using Docker Compose 类似的问题,但要么我看不到树木的木材,要么这里的解决方案不起作用。

我有以下 docker-compose.yml 文件:

version: '3'
services:
    db:
        image: mysql:5.7
        container_name: squirrels_db
        volumes:
          - db_data:/var/lib/docker/volumes/squirrels_db_data/_data
        restart: always
        ports:
          # <Port exposed> : <MySQL Port running inside container>
          - 3310:3306
        environment:
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: wordpress
            MYSQL_USER: mydb_user
            MYSQL_PASSWORD: password
        volumes:
          - ./var/lib/docker/volumes/squirrels_db_data/_data
        networks:
          internal-net:
            ipv4_address: 172.29.0.11

    wordpress:
        image: wordpress:latest
        container_name: squirrels_web
        depends_on:
            - db
        ports:
           - 8000:80
        restart: always
        environment:
            WORDPRESS_DB_HOST: db:3306
            WORDPRESS_DB_USER: mydb_user
            WORDPRESS_DB_NAME: mydb_name
            WORDPRESS_DB_PASSWORD: password

        volumes:
          - ./data/wp_content:/var/www/html/wp-content
          - ./config/wordpress/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
        networks: 
          nginx-proxy:
          internal-net:
            ipv4_address: 172.29.0.12      

# Names our volume
volumes:
  db:

networks:
  nginx-proxy:
    external:
      name: nginx-proxy
  internal-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.29.0.0/16

注意:我在这里更改了用户名和密码,最终会将它们保存在 .env 文件中

当我点击http://localhost:8000 时,我在日志中看到一条 WordPress 传递的“建立数据库连接时出错”消息和以下内容(来自 docker-compose 日志):

PHP 警告:mysqli::__construct(): (HY000/2002): 连接被拒绝 在第 22 行的标准输入代码中 MySQL 连接错误:(2002) 连接被拒绝

这现在正式让我发疯了,仅仅知道我错过了一些明显的东西就没有任何帮助!因此,任何意见或建议都非常感谢

谢谢

【问题讨论】:

  • 我应该补充一点,我可以使用以下命令从命令行手动连接到 mysql:mysql -u mydb_user -p -h 172.29.0.11
  • 我怀疑WORDPRESS_DB_HOST: db:3306 行是一个问题,因为它包含: 两次。你能在不同的行中说明端口吗?
  • 我从这篇文章docs.docker.com/compose/wordpress得到那句话

标签: mysql docker


【解决方案1】:

我设法让它工作。这是工作文件——我将在下面解释我的更改:

version: "3"
services:
  db:
    image: mysql:5.7
    container_name: squirrels_db
    volumes:
      # You prepended with db_data: but volume was called db – scroll down to volumes to see my fix
      - db_data:/var/lib/docker/volumes/squirrels_db_data/_data
    restart: always
    ports:
      # <Port exposed> : <MySQL Port running inside container>
      - 3310:3306
    environment:
      MYSQL_ROOT_PASSWORD: password
      # This is likely the isse - you called it wordpress but tried to connect to mydb_name in the wordpress container
      MYSQL_DATABASE: mydb_name
      MYSQL_USER: mydb_user
      MYSQL_PASSWORD: password
    # REMOVE BELOW 2 LINES - you declared above
    # volumes:
    #   - ./var/lib/docker/volumes/squirrels_db_data/_data
    networks:
      internal-net:
        ipv4_address: 172.29.0.11

  wordpress:
    image: wordpress:latest
    container_name: squirrels_web
    depends_on:
      - db
    ports:
      - 8000:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: db # db:3306 is fine but that's default so removed
      WORDPRESS_DB_USER: mydb_user
      WORDPRESS_DB_NAME: mydb_name
      WORDPRESS_DB_PASSWORD: password
    volumes:
      - ./data/wp_content:/var/www/html/wp-content
      - ./config/wordpress/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    networks:
      nginx-proxy:
      internal-net:
        ipv4_address: 172.29.0.12

# Names our volume
volumes:
  # FIX: renamed from db to db_data. Added {} to declare an empty volume
  db_data: {}

networks:
  nginx-proxy:
    external:
      name: nginx-proxy
  internal-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.29.0.0/16

变化

  1. 我认为您的缩进很好 - 但我将其更改为第一次测试

  2. 您在 db 容器中声明了 2 个卷键。第一个看似正确,第二个缺少 db_data: volume 前缀。

  3. 您的卷名为 db,但被用作(如第 2 点)作为 db_data

  4. 您的数据库名称不匹配。您在MYSQL_DATABASE: wordpress 的设置中调用了db wordpress,然后尝试在WORDPRESS_DB_NAME: mydb_name 连接到mydb_name

更简单的解决方案

虽然上述方法可行,但您确实需要网络吗?下面的方法也可以,而且更简单:

version: "3"
services:
  db:
    image: mysql:5.7
    container_name: squirrels_db
    volumes:
      - db_data:/var/lib/docker/volumes/squirrels_db_data/_data
    restart: always
    ports:
      - 3310:3306
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: mydb_name
      MYSQL_USER: mydb_user
      MYSQL_PASSWORD: password

  wordpress:
    image: wordpress:latest
    container_name: squirrels_web
    depends_on:
      - db
    ports:
      - 8000:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: mydb_user
      WORDPRESS_DB_NAME: mydb_name
      WORDPRESS_DB_PASSWORD: password
    volumes:
      - ./data/wp_content:/var/www/html/wp-content
      - ./config/wordpress/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini

volumes:
  db_data: {}

【讨论】:

  • 非常感谢。现在可以在本地工作(只要我删除我的 nginx-proxy 网络),但是当我尝试在我的服务器(使用 nginx-proxy)上运行它时会失败。我现在没有时间,但会在报告之前再玩一些。我拥有内部网络的原因是我可以拥有一个静态 ip,这使得手动/命令行等更容易访问 mysql。这在此处并不是必需的,因此已将其删除并在本地工作。尽管如此,主服务器上的 nginx-proxy 仍然存在上述问题。
  • 酷 - 我猜 nginx-proxy 问题可能完全是另外一回事。你知道你可以通过运行docker-compose exec -it [container] [command] CLI 进入实例吗?所以在你的情况下,docker-compose exec -it db bash 会打开一个 bash shell。如果可能,不要忘记标记为已解决,这样我就会得到甜美的绿色勾号;)
  • 谢谢安迪,标记为已解决,因为我现在可以在本地运行它。仍然需要弄清楚服务器设置,但这与此无关。再次感谢您的帮助 - 这让我发疯了! :)
猜你喜欢
  • 1970-01-01
  • 2017-05-28
  • 2017-07-30
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 2017-04-29
  • 2014-04-14
  • 1970-01-01
相关资源
最近更新 更多