ssherlock
ssherlock

Reputation: 119

Running MySql on different port from Docker

I have a similar issue to Run MySQL on Port 3307 Using Docker Compose but either I can't see the wood for the trees or the solution here is not working.

I have the following docker-compose.yml file:

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

Note: I have changed usernames and passwords here and will eventually have them in a .env file

When I hit http://localhost:8000 I am seeing a WordPress delivered "Error establishing a database connection" message and the following in the log (from docker-compose logs):

PHP Warning: mysqli::__construct(): (HY000/2002): Connection refused in Standard input code on line 22 MySQL Connection Error: (2002) Connection refused

This now officially driving me nuts, not helped at all by just knowing I am missing something obvious! So, any observations or suggestions gratefully received

Thanks

Upvotes: 3

Views: 1069

Answers (1)

Andy Mardell
Andy Mardell

Reputation: 1191

I managed to get it working. Here's the working file – I'll explain my changes below:

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

Changes

  1. I think your indentation was fine - but I changed this as a first test

  2. You had 2 volumes keys declared in your db container. the first was seemingly correct, the second was missing the db_data: volume prepending the path.

  3. Your volume was named db but was being used (as in point 2) as db_data

  4. Your database names didn't match. You called the db wordpress on setup at MYSQL_DATABASE: wordpress then tried to connect to mydb_name at WORDPRESS_DB_NAME: mydb_name

Simpler solution

Although the above works, do you definitely need the networking? The below will also work and is much simpler:

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: {}

Upvotes: 1

Related Questions