在Docker中将MySql运行在不同的端口

3

我有一个类似于使用Docker Compose运行MySQL在端口3307上的问题,但要么我看不清问题所在,要么这里的解决方案无法工作。

我有以下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 logs):

PHP警告:mysqli :: __ construct():(HY000/2002):拒绝连接 Standard input code on line 22 MySQL Connection Error: (2002) Connection refused

这让我非常困扰,尤其是因为我知道我正在错过一些明显的东西!因此,任何观察或建议都将不胜感激。

谢谢


我应该补充说明,我可以使用以下命令手动连接到mysql: mysql -u mydb_user -p -h 172.29.0.11 - ssherlock
我怀疑 WORDPRESS_DB_HOST: db:3306 这一行存在问题,因为它包含了两个冒号。您能否将端口在另一行中声明? - Nae
1
我从这篇文章 https://docs.docker.com/compose/wordpress/ 中得到了这行代码。 - ssherlock
1个回答

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:卷前缀路径。

  3. 您的卷名为db,但正在使用(如点2中)作为db_data

  4. 您的数据库名称不匹配。您在设置时称db为wordpress,而尝试连接到mydb_name的WORDPRESS_DB_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代理网络),但是当我尝试在使用nginx代理的服务器上运行时就会失败。我现在没有时间,但是会在反馈之前进行更多的尝试。 我创建internal-net网络的原因是为了拥有静态IP,这样更容易手动/命令行连接到mysql等。但这在这里不是必需的,因此我已将其删除并在本地运作良好。然而,在主服务器上使用nginx代理仍存在前面提到的问题。 - ssherlock
很酷 - 我猜想nginx-proxy的问题可能是完全不同的东西。你知道你可以通过运行docker-compose exec -it [container] [command]进入实例的CLI吗?所以在你的情况下,docker-compose exec -it db bash将打开一个bash shell。如果可能的话,请别忘了标记为已解决,这样我就能得到漂亮的绿色勾勾;) - Andy Mardell
1
谢谢Andy,我已经将其标记为已解决,因为我现在可以在本地运行它。仍然需要弄清楚服务器设置,但这与此无关。再次感谢您的帮助 - 它让我发疯了! :) - ssherlock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接