Docker Wordpress API aanroepen in ander Docker project

Een artikel hoe je de Wordpress API wat draait op Docker kan benaderen in een ander Docker project
Voor een project heb ik de Wordpress / Woocomerce API nodig om producten op te halen en deze te kunnen gebruiken in een Laravel Project. Ik gebruik Docker voor beide projecten.
Laravel docker-compose-yml bestand
Voor een Laravel project gebruik ik mijn docker-laravel repository https://github.com/mvd81/docker-laravel maar met Laravel Sail, of andere Docker instellingen werkt dit ook.Wordpress docker-compose.yml bestand
Voor Wordpress gebruik ik dit docker-compose.yml bestand.version: '3'
services:
# Database
db:
image: mysql:8.0.21
volumes:
- db_data:/var/lib/mysql
restart: always
ports:
- '3317:3306'
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
# WordPress
wordpress:
depends_on:
- db
ports:
- '8078:80'
build:
context: .
dockerfile: Dockerfile
restart: always
volumes:
- './wordpress:/var/www/html'
- './wp-content:/home/tw109108/domains/webbouwplus.nl/public_html/wp-content'
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DEBUG: 1
networks:
default:
external:
name: laravel_project_network_name
volumes:
db_data:
Hetzelfde netwerk
Om de projecten te laten communiceren moeten beide projecten op hetzelfde Docker netwerk zitten. Pas in de Wordpress docker-compose.yml bestand `laravel_project_network_name` naar de naam van je Laravel project (ps. je Docker Laravel project netwerk moet in type 'bridge' draaien).Na het opstarten van beide projecten (docker-compose up -d) kan ik beide projecten benaderen in een internetbrowser, localhost:laravel-project-port en localhost:wordpress-project-port
Wordpress / Woocomerce API benaderen in het Laravel project
Nu wil ik in het Laravel project de Wordpress / Woocommerce API aanroepen. Omdat Docker een gesloten systeem is werkt het volgende helaas niet.$response = Http::get('http://localhost:wordpress-port/wp-json/wc/v3/products');
Je krijgt dan de foutmelding:
cURL error 7: Failed to connect to localhost port after 0 ms: Couldn't connect to server
Juiste manier om een andere container te benaderen
De juiste manier om de Wordpress Docker container te benaderen is om de Docker containernaam te gebruiken. Je kan de Docker containernamen opvragen via de commandline:docker ps
In de laatste kolom 'NAME' zie je de namen van de containers.
Het volgende werkt 'normaal' gesproken om iets aan te roepen van een andere container.
$response = Http::get('http://wp-container-naam/wp-json/wc/v3/products');
Helaas krijg je weer dezelfde Curl error:
cURL error 7: Failed to connect to localhost port after 0 ms: Couldn't connect to server
Dit keer is het geen Docker probleem maar ligt het probleem bij Wordpress. Het komt omdat de WP_SITEURL
in je Worpress verwijst naar http://localhost:poort-nummer en zoals we dit nu weten kan je dit niet gebruiken in Docker.
Je zou de WP_SITEURL
kunnen bijwerken in wp-config.php
of dit aanpassen in de wp_options database tabel naar de Docker Wordpress containernaam maar dan is de Wordpress site uiteraard niet meer te gebruiken in de webbrowser.
Oplossing om een dynamische WP_SITEURL te gebruiken
De oplossing is eenvoudig, om deWP_SITEURL
en WP_HOME
dynamisch te definiëren.
Zet in wp-config.php
:
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
Als het goed is zou je nu de Wordpress / Woocommerce API kunnen benaderen uit je Laravel project.