I've got a docker-compose.yml that looks like this:
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql2
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wptest
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
volumes:
- ./site/:/var/www/html/
- ~/playground/certs/:/etc/ssl/certs/
depends_on:
- db
image: wordpress:latest
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wptest
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:
It works and my wordpress installation is fine - except for the fact that there is a self-signed cert in the mix. So when I try to update my wordpress installation or something, it fails (same with plugins).
If I get into the bash shell of the container and run update-ca-certificates it finds my keys and installs them and then I can run updates without issue.
My question is - can I automate that, so it automatically pulls in my certs and runs the command after the container is up while still allowing me to use docker-compose up ?
You can create a simple Dockerfile that pulls from the wordpress image and add a RUN command with whatever you want to do.
FROM wordpress:latest
RUN your-command-here
And then change you docker-compose to use this new image instead of the official wordpress one, probably something like:
(notice the build arguments)
wordpress:
volumes:
- ./site/:/var/www/html/
- ~/playground/certs/:/etc/ssl/certs/
depends_on:
- db
build:
context: .
dockerfile: ./Dockerfile
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wptest
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
Related
I built two WordPress websites, one bound to port 9000 and one to 8000. They are both connected to the same MySQL database.
When I access the port 8000 it works perfectly and connects to both the website and the database.
On the other side, when I access the port 9000 it just automatically redirects me to the port 8000 and to its website. Any reason why this may happen?
This is the docker-compose file:
Tried to clear the cache and tried it on Firefox (default browser is Chrome) but it still happens.
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
second_wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "9000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
Go to http://localhost:9000/wp-admin/install.php to install your second instance.
Be aware that the configuration is stored in files (in /var/www/html/) inside the container and will be lost when you stop the container. So you'll have to install it again when you restart.
If you want to save the configuration, you can create a volume and map it to /var/www/html using something like this
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/www/html
and
volumes:
wordpress:
The problem was that both sites used the same DATABASE inside mySQL, the solution was to create different databases in mySQL and assign each website to it.
Then the wordpress sites will take the info from different databases and not route.
I'm new to Docker and created myself a Container using a Compose File.
Now I came to a point where I wanted to use my development result in production.
Is there any way to backup the whole content so that I can use it in a production environment ?
The compose file that I used to spin up my Container:
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: myRootPassword
MYSQL_DATABASE: wordpress_oxygen
MYSQL_USER: wordpress_oxygen
MYSQL_PASSWORD: myDBPassword
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
Docker compose is not for production. For production try docker swarm.
Also you should add volume for wordpress, see example
https://hub.docker.com/_/wordpress
How backup volumes please see https://docs.docker.com/storage/volumes/#backup-restore-or-migrate-data-volumes
I'm new to the docker world and maybe I'm missing something.
I created the following docker-compose file
version: '3.3'
services:
db:
image: mysql:latest
restart: always
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
networks:
- wpsite
phpmyadmin:
depends_on:
- db
image: phpmyadmin/phpmyadmin
ports:
- '8080:80'
environment:
PMA_HOST: db
MYSQL_ROOT_PASSWORD: password
networks:
- wpsite
wp:
depends_on:
- db
image: andreccosta/wordpress-xdebug
volumes:
- ./wp:/var/www/html
ports:
- 8000:80
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
XDEBUG_CONFIG: remote_host=172.17.0.1
networks:
- wpsite
networks:
wpsite:
volumes:
db_data:
When i run it with docker-compose up everything goes well, but when I try to access localhost:8080 (path for phpmyadmin) and try to login i'm not able to connect to mysql.
If i try to enter the mysql container with
docker exec -t -i <conatiner_name> bash
and try to login to mysql i'm able to do it.
I used this same file on a different computer and everything works well.
I'm running docker on ubuntu.
UPDATE
I solved the issue by changing the version of the mysql image from latest to 5.7.27.
I had running container with wordpress and other container with MySQL and its volume (see config below). Then I've run docker-compose up -d --build and then I see wordpress installation page, that means empty database. Also I could kill some docker process before that, don't remember exactly which by command ```sudo kill -9 [process_id].
Where can I find solution to restore my volume with all the information this has?
services:
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
- wordpress_files:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: my_wordpress_db_password
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: my_db_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: my_wordpress_db_password
volumes:
wordpress_files:
db_data:
uploads.ini:
You should take a look at the output of "docker volume ls". If you were using the container only with the docker run command and now switched to compose, maybe you when you runned docker-compose up Docker created a new empty volume called db_db_data.
I have the following file at ./wordpress/docker-compose.yaml:
version: '3.3'
serivces:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
evironment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
volumes:
- ./:/var/www/html
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data
When I run cd ./wordpress && docker-compose up -d I get the following error:
ERROR: In file './docker-compose.yaml', volume must be a mapping, not a string.
Can anyone tell me what I'm doing wrong?
There are certain typo errors first of, like serivces, evironment. They should spell services and environment. Also for the "... not string" error, just append ":" after your volume name like below
volumes:
db_data:
I had the same problem just now and the key was the indentation of the volume name i.e. db_data.
I fixed it by putting the volume name on the same level of indentation as the depends_on under the wordpress service in the example above. (hit TAB)
volumes:
mydata:
vs
volumes:
mydata:
that's will fix it and it works for me
volumes:
db_data:
driver: local
version: '3.3'
serivces:
db:
image: mysql:5.7
command: bash -c "mkdir -p /var/lib/mysql/"
volumes:
- db_data:/var/lib/mysql/
restart: always
evironment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
volumes:
- ./:/var/www/html
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data: {}
save as docker-compose.yml
cd wordpress
docker-compose up