Reputation: 119
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
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
I think your indentation was fine - but I changed this as a first test
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.
Your volume was named db but was being used (as in point 2) as db_data
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
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