goblin_rocket
goblin_rocket

Reputation: 377

Moving Wordpress site to Docker: Error establishing DB connection

Ive been making new sites with Wordpress & Docker recently and have a reasonable grasp of how it all works and Im now looking to move some established sites into Docker.

Ive been following this guide:

https://stephenafamo.com/blog/moving-wordpress-docker-container/

I have everything setup as it should be but when I go to my domain.com:1234 I get the error message 'Error establishing a database connection'. I have changed 'DB HOST' to 'mysql' in wp-config.php as advised and all the DB details from the site Im bringing in are correct.

I have attached to the mysql container and checked that the db is there and with the right user and also made sure the pw is correct via mysql CLI too.

SELinux is set to permissive and I havent changed any dir/file ownership nor permissions and for the latter dirs are all 755 and files 644 as they should be.

Edit: I should mention that database/data and everything under that seem to be owned by user/group 'polkitd input' instead of root.

Docker logs aren't really telling me much either apart from the 500 error messages for the WP container when I browse the site on port 1234 (as expected though).

This is the docker-compose file:

version: '2'

services:
  example_db:
    image: mysql:latest
    container_name: example_db
    volumes:
      - ./database/data:/var/lib/mysql
      - ./database/initdb.d:/docker-entrypoint-initdb.d
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password123 # any random string will do
      MYSQL_DATABASE: mydomin_db # the name of your mysql database
      MYSQL_USER: my domain_me # the name of the database user
      MYSQL_PASSWORD: password123 # the password of the mysql user

  example:
    depends_on:
      - example_db
    image: wordpress:php7.1 # we're using the image with php7.1
    container_name: example
    ports:
      - "1234:80"
    restart: always
    links:
      - example_db:mysql
    volumes:
      - ./src:/var/www/html

Suggestions most welcome as Im out of ideas!

Upvotes: 12

Views: 42490

Answers (8)

mtdcy.chen
mtdcy.chen

Reputation: 41

  1. make sure the database matches:

WORDPRESS_DB_NAME/WORDPRESS_DB_USER/WORDPRESS_DB_PASSWORD must match with db explicitly.

  1. try use links instead of depends:

some system/docker version may have restrictions of communicating between containers.

Upvotes: 0

aderchox
aderchox

Reputation: 4074

In some cases a probable cause of this issue could be, you have made volumes using docker compose up and then when you did docker compose down you expected the volumes to be deleted as well as the docker images, but this is not how it works.

From the doc you could read this:

For data that needs to persist between updates, use host or named volumes.

It implicitly means that named volumes will not get deleted with down, so what happens is, when you do an up and then add a row to a table and then do a subsequent down, then on the next up you will get the same old volume and so querying the same table would give you the same row you created previously!

What does this have to do with the error Error establishing DB connection, you may ask. To answer your question, let's assume one scenario: What if you changed some MYSQL passwords in the docker compose file in between running the down command and the second up command?

MYSQL keeps its own data just like any other data in its tables, so when you do the second up, Docker loads the old volume (the one created by the first up) and thus the old credential information will be used by MYSQL and Docker will not even have the opportunity to insert your new information (the ones you changed in the docker compose file) in the administration tables. So obviously, you will be rejected.

The solution thus now would be very simple. To fix it, either do:

docker-compose down -v

to remove the named volumes as well as the images when running the down, or do:

docker volume rm [volname]

if you've done the down before, and now you want to delete the named volumes.

Upvotes: 1

vins
vins

Reputation: 539

make sure that the wp-config.php file has same credentials defined for db_user, db_password as in docker-composer yml file. I too had similar problem i deleted all the files and re-installed and saw that docker-composer up -d would start everything but the wp-config.php file contents for mysql settings were not defined as in docker. so i changed it accordingly and started working eventually

Upvotes: 6

You
You

Reputation: 37

I share with you my approach

Show running version, question to see if all is well on your side!

$ docker --version && docker-compose --version

run Docker Copose file

$ docker-compose -f docker-compose.yml up -d

after you wait fast forward

show running containers and name of the Wordpress Container is listening on port 8000

 $ docker ps 

you will see the name of your WordPress container on the table as follows if you have followed the steps listed on their site https://hub.docker.com/_/wordpress

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES

xxxxxxxxxxxx        wordpress:latest    "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        0.0.0.0:8000->80/tcp   cms_wordpress_1

xxxxxxxxxxxx        mysql:5.7           "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        3306/tcp, 33060/tcp    cms_db_1

and if you check your browser with the address : localhost:8000 you will get the message "error establishing DB connection"

launch bash inside the Wordpress container

$ docker exec -it cms_wordpress_1 bash

apt update fails as there is no connectivity

$ apt update

open up new terminal and show current Firewalld configuration

$ sudo cat /etc/firewalld/firewalld-workstation.conf | greb 'FirewallBackend'
currently set to 'nftables'

set value to 'iptables'

$ sudo sed -i 's/FirewallBackend=nftables/FirewallBackend=iptables/g' /etc/firewalld/firewalld-workstation.conf

confirme new value

$ sudo cat /etc/firewalld/firewalld-workstation.conf | grep 'FirewallBackend'

restart Firwalld service to apply change

$ sudo systemctl restart firewalld.service

Refresh the running Wordpress session in your browser and that's good. good work.

Upvotes: 3

wai yan win htain
wai yan win htain

Reputation: 23

If you follow this tutorials ,https://stephenafamo.com/blog/moving-wordpress-docker-container/, your site wil not work properly. Coz It doesn't restore database and you need to restore manually .sql dump file existed in initdb.d dir by using this command.

cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE

I also stuck in this and my CSS are not working properly. Please let me know when you have new idea .

Upvotes: 0

xtra
xtra

Reputation: 2352

With the new version of docker-compose it will look like this (if you don't want to use PhpMyAdmin you can leave it out):

version: '3.7'

volumes:
  wp-data:
networks:
  wp-back:

services:

  db:
    image: mysql:5.7
    volumes:
      - wp-data:/var/lib/mysql
    environment:
       MYSQL_ROOT_PASSWORD: rootPassword
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wp-user
       MYSQL_PASSWORD: wp-pass
    ports:
      - 8889:3306
    networks:
      - wp-back

  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: db
      MYSQL_USER: wp-user
      MYSQL_PASSWORD: wp-pass
      MYSQL_ROOT_PASSWORD: rootPassword
    ports:
      - 3001:80
    networks:
      - wp-back

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - 8888:80
      - 443:443
    environment:
       WORDPRESS_DB_HOST: db
       WORDPRESS_DB_USER: wp-user
       WORDPRESS_DB_PASSWORD: wp-pass
    volumes:
      - ./wordpress-files:/var/www/html
    container_name: wordpress-site
    networks:
      - wp-back

The database volume is a named volume wp-data, while the wordpress html is a bind-mount to your current directory ./wordpress-files .

Upvotes: 9

Akshay Shikre
Akshay Shikre

Reputation: 61

if you want it all in one container you can refer this repo here, https://github.com/akshayshikre/lamp-alpine/tree/development

Here from lamp-alpine image is used Then mysql, php, apache2 (lamp stack) is installed and copied local wordpress demosite and db for demo purpose

if you do not want any kind of continuous integration part ignore .circleci folder Check docker-compose file and Dockerfile, Environment variables are in .env file

Upvotes: 1

cooshal
cooshal

Reputation: 778

Please take a look at the following compose script. I tried and tested. It works fine.

version: '2'

services:
  db:
    image: mysql:latest
    container_name: db_server
    volumes:
      - ./database/data:/var/lib/mysql
      - ./database/initdb.d:/docker-entrypoint-initdb.d
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password123 # any random string will do
      MYSQL_DATABASE: udb_test # the name of your mysql database
      MYSQL_USER: me_prname # the name of the database user
      MYSQL_PASSWORD: password123 # the password of the mysql user

  example:
    depends_on:
      - db
    image: wordpress:php7.1 # we're using the image with php7.1
    container_name: wp-web
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: me_prname
      WORDPRESS_DB_PASSWORD: password123
      WORDPRESS_DB_NAME: udb_test
    ports:
      - "1234:80"
    restart: always
    volumes:
      - ./src:/var/www/html

Let me know if you encounter further issues.

Upvotes: 3

Related Questions