{"id":226,"date":"2025-01-24T22:41:07","date_gmt":"2025-01-24T22:41:07","guid":{"rendered":"https:\/\/boyan-tabakov.xyz\/?p=226"},"modified":"2025-01-24T22:44:08","modified_gmt":"2025-01-24T22:44:08","slug":"docker-compose-file-for-mariadb-php-apache","status":"publish","type":"post","link":"https:\/\/boyan-tabakov.xyz\/index.php\/2025\/01\/24\/docker-compose-file-for-mariadb-php-apache\/","title":{"rendered":"Docker Compose File for MariaDB + PHP + Apache"},"content":{"rendered":"\n<p>This is a docker-compose.yml file designed to allow users to run MariaDB + PHP + Apache to use for learning purposes. Below is the docker-compose file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># This file deploys MariaDB, PMA and Apache.\n# deploy this using Docker and wait a bit for it to start up.\n# -----------------------------------------------------------------------------------------------\n# PHP MY ADMIN: http:\/\/localhost:8090\/\n# TERMINAL FOR DATABASE: https:\/\/localhost:8091\/ user is kasm_user and password is 'password'.\n# FILE UPLOAD TO APACHE: http:\/\/localhost:8094\/ user is admin and password is admin\n# APACHE: http:\/\/localhost:8093\/\n# -----------------------------------------------------------------------------------------------\n# User is ROOT and password is notSecureChangeMe and database is db\n# Note: you dont have to change the password unless this will be exposed to the internet.\nservices:\n  db:\n    container_name: database\n    image: mariadb:10.11\n    restart: always\n    volumes:\n      - mysql_lessons:\/var\/lib\/mysql\n    environment:\n      MYSQL_ROOT_PASSWORD: notSecureChangeMe\n    post_start:\n      - command: &#91;\"\/bin\/bash\", \"-c\", \"apt update &amp;&amp; apt install openssh-server -y &amp;&amp; echo 'root:root' | chpasswd &amp;&amp; echo 'Changed root password' &amp;&amp; echo PermitRootLogin yes &gt;&gt; \/etc\/ssh\/sshd_config &amp;&amp; service ssh restart &amp;&amp; echo mysql -u root -pnotSecureChangeMe &gt;&gt; \/root\/.bashrc\"]\n\n  phpmyadmin:\n    container_name: phpmyadmin\n    image: phpmyadmin\n    restart: always\n    ports:\n      - 8090:80\n    depends_on:\n      - db\n    environment:\n      - PMA_ARBITRARY=1\n      - PMA_HOST=db  \n      - MYSQL_ROOT_PASSWORD=notSecureChangeMe\n      - PMA_USER=root      \n      - PMA_PASSWORD=notSecureChangeMe\n    links:\n      - db:db\n\n  terminal-db:\n    image: kasmweb\/terminal:1.16.0\n    container_name: mysql-term\n    restart: always\n    depends_on:\n      - db\n    ports:\n      - 8091:6901\n    environment:\n      - VNC_PW=password\n      - SHELL_EXEC=sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@db\n\n  apache:\n    container_name: webserver\n    image: 'php:7.4-apache'\n    restart: always\n    ports:\n      - '8093:80'\n    volumes:\n      - apache:\/var\/www\/html\n    links:\n      - db:db\n    command: &#91;\"\/bin\/bash\", \"-c\", \"docker-php-ext-install mysqli &amp;&amp; exec apache2-foreground\"]\n\n\n  uploader:\n    image: filebrowser\/filebrowser:latest\n    container_name: uploader\n    ports:\n      - \"8094:80\" # Expose the web interface on port 8080\n    volumes:\n      - apache:\/srv \n    post_start:\n      - command: &#91;\"\/bin\/bash\", \"-c\", \"chmod 777 \/srv\/*\"]\n    environment:\n      - FB_NO_AUTH=true\n    restart: unless-stopped\n\nvolumes:\n  mysql_lessons:\n  apache:<\/code><\/pre>\n\n\n\n<p>Save this on your desktop as docker-compose-lamp.yml.<\/p>\n\n\n\n<style>\nh2, p { display: block !important; }\n<\/style>\n\n\n\n<p class=\"has-large-font-size\">Recommended Installation: Use Local Docker<\/p>\n\n\n\n<p>If you have <a href=\"https:\/\/docker.com\">Docker <\/a>installed on your PC: <kbd>shift <\/kbd><code>+ right clicking<\/code> and selecting &#8220;Open PowerShell Window here&#8221;:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"288\" height=\"228\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image.png\" alt=\"\" class=\"wp-image-227\"\/><\/figure>\n<\/div>\n\n\n<p>Type to run docker containers: <code>docker compose -f docker-compose-lamp.yml up -d <br><\/code>Type to stop docker containers: <code>docker compose -f docker-compose-lamp.yml<\/code><\/p>\n\n\n\n<p>It may take a while before they start, so be patient. If it&#8217;s done, it will look something like this:<\/p>\n\n\n\n<p>(other docker messages)<br><code>[+] Running 6\/6<br>\u2714 Network desktop_default Created 0.1s<br>\u2714 Container uploader Started 0.9s<br>\u2714 Container database Started 28.3s<br>\u2714 Container mysql-term Started 29.0s<br>\u2714 Container webserver Started 28.7s<br>\u2714 Container phpmyadmin Started 29.0s<br>PS C:\\Users\\Desktop&gt;<\/code><\/p>\n\n\n\n<p>Now you can use the localhost urls to access Docker. <a href=\"#option2\" data-type=\"internal\" data-id=\"#option2\">Jump to bottom<\/a>.<\/p>\n\n\n\n<p>On the cloud, use <a href=\"http:\/\/cloud.google.com\">Google Cloud<\/a> or <a href=\"https:\/\/labs.play-with-docker.com\/\" data-type=\"link\" data-id=\"https:\/\/labs.play-with-docker.com\/\">Play with Docker<\/a>.<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>Option 1: Play with Docker<\/strong> (not recommended)<\/p>\n\n\n\n<p>Note that cloud options may have limited working hours and may not be available at all times. For Play with docker:<\/p>\n\n\n\n<p>Click Login:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"843\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1-1024x843.png\" alt=\"\" class=\"wp-image-228\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1-1024x843.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1-300x247.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1-768x632.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1.png 1085w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Click Docker:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"634\" height=\"268\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-2.png\" alt=\"\" class=\"wp-image-229\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-2.png 634w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-2-300x127.png 300w\" sizes=\"auto, (max-width: 634px) 100vw, 634px\" \/><\/figure>\n<\/div>\n\n\n<p>A window will popup to allow you to sign in with Docker.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"617\" height=\"571\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-3.png\" alt=\"\" class=\"wp-image-230\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-3.png 617w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-3-300x278.png 300w\" sizes=\"auto, (max-width: 617px) 100vw, 617px\" \/><\/figure>\n<\/div>\n\n\n<p>You will be redirected to Docker. Close the popup and select Docker on the login page again.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"607\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-4-1024x607.png\" alt=\"\" class=\"wp-image-231\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-4-1024x607.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-4-300x178.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-4-768x455.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-4.png 1144w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Click Login:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"843\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1-1024x843.png\" alt=\"\" class=\"wp-image-228\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1-1024x843.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1-300x247.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1-768x632.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-1.png 1085w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Click Docker:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"634\" height=\"268\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-2.png\" alt=\"\" class=\"wp-image-229\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-2.png 634w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-2-300x127.png 300w\" sizes=\"auto, (max-width: 634px) 100vw, 634px\" \/><\/figure>\n<\/div>\n\n\n<p>You will then see this.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"607\" height=\"574\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-5.png\" alt=\"\" class=\"wp-image-232\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-5.png 607w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-5-300x284.png 300w\" sizes=\"auto, (max-width: 607px) 100vw, 607px\" \/><\/figure>\n<\/div>\n\n\n<p>Click Accept.<\/p>\n\n\n\n<p>Now click Start:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"801\" height=\"913\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-6.png\" alt=\"\" class=\"wp-image-233\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-6.png 801w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-6-263x300.png 263w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-6-768x875.png 768w\" sizes=\"auto, (max-width: 801px) 100vw, 801px\" \/><\/figure>\n\n\n\n<p>You will be redirected here:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"557\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-7-1024x557.png\" alt=\"\" class=\"wp-image-234\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-7-1024x557.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-7-300x163.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-7-768x418.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-7-1536x836.png 1536w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-7.png 1716w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>You can see session time and your instances.<\/p>\n\n\n\n<p>Click New Instance.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"312\" height=\"191\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-8.png\" alt=\"\" class=\"wp-image-235\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-8.png 312w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-8-300x184.png 300w\" sizes=\"auto, (max-width: 312px) 100vw, 312px\" \/><\/figure>\n\n\n\n<p>You will then see node1.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"558\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-9-1024x558.png\" alt=\"\" class=\"wp-image-236\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-9-1024x558.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-9-300x163.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-9-768x418.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-9-1536x837.png 1536w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-9.png 1715w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Click the terminal (the black box with text) and type in: &#8220;<code>touch docker-compose.yml<\/code>&#8220;<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"417\" height=\"101\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-10.png\" alt=\"\" class=\"wp-image-237\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-10.png 417w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-10-300x73.png 300w\" sizes=\"auto, (max-width: 417px) 100vw, 417px\" \/><\/figure>\n<\/div>\n\n\n<p>Click the editor button:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"554\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-11-1024x554.png\" alt=\"\" class=\"wp-image-238\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-11-1024x554.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-11-300x162.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-11-768x416.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-11-1536x831.png 1536w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-11.png 1709w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>A popup window will appear. Click <code>docker-compose.yml<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"844\" height=\"459\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-12.png\" alt=\"\" class=\"wp-image-239\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-12.png 844w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-12-300x163.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-12-768x418.png 768w\" sizes=\"auto, (max-width: 844px) 100vw, 844px\" \/><\/figure>\n\n\n\n<p>Paste my docker file into this file and click Save.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"849\" height=\"450\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-13.png\" alt=\"\" class=\"wp-image-240\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-13.png 849w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-13-300x159.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-13-768x407.png 768w\" sizes=\"auto, (max-width: 849px) 100vw, 849px\" \/><\/figure>\n\n\n\n<p>Close the popup and in the terminal type in <code>docker-compose up -<\/code>d.<\/p>\n\n\n\n<p>If you did it right you should see it loading like this:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"773\" height=\"216\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-14.png\" alt=\"\" class=\"wp-image-241\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-14.png 773w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-14-300x84.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-14-768x215.png 768w\" sizes=\"auto, (max-width: 773px) 100vw, 773px\" \/><\/figure>\n<\/div>\n\n\n<p>Be patient while the docker containers download.<\/p>\n\n\n\n<p>Even if it seems stuck, its actively processing data. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"592\" height=\"197\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-15.png\" alt=\"\" class=\"wp-image-242\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-15.png 592w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-15-300x100.png 300w\" sizes=\"auto, (max-width: 592px) 100vw, 592px\" \/><figcaption class=\"wp-element-caption\">Image showing Docker seemingly stuck<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Try to visit your instance by clicking Open Port and typing in 8090.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"504\" height=\"296\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-16.png\" alt=\"\" class=\"wp-image-243\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-16.png 504w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-16-300x176.png 300w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"468\" height=\"182\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-17.png\" alt=\"\" class=\"wp-image-244\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-17.png 468w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-17-300x117.png 300w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/figure>\n\n\n\n<p>8090 is PhpMyAdmin. By opening it you should see a page simlar to this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"511\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-18-1024x511.png\" alt=\"\" class=\"wp-image-245\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-18-1024x511.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-18-300x150.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-18-768x383.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-18-1536x766.png 1536w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-18.png 1893w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-large-font-size\"><strong>Option 2: Google Cloud:<\/strong><\/p>\n\n\n\n<p>As for Google Cloud:<\/p>\n\n\n\n<p>Go to my link: <a href=\"https:\/\/cloud.google.com\/\">Cloud Computing Services | Google Cloud<\/a><\/p>\n\n\n\n<p>Click on Console on top left:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"876\" height=\"517\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-19-edited.png\" alt=\"\" class=\"wp-image-247\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-19-edited.png 876w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-19-edited-300x177.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-19-edited-768x453.png 768w\" sizes=\"auto, (max-width: 876px) 100vw, 876px\" \/><\/figure>\n\n\n\n<p>Now click on the honeycomb looking selector:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"557\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-21-1024x557.png\" alt=\"\" class=\"wp-image-249\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-21-1024x557.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-21-300x163.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-21-768x418.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-21-1536x836.png 1536w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-21.png 1621w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Click on new project:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"558\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-22.png\" alt=\"\" class=\"wp-image-250\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-22.png 750w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-22-300x223.png 300w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/figure>\n\n\n\n<p>Call it something like Code space:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"815\" height=\"531\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-23.png\" alt=\"\" class=\"wp-image-251\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-23.png 815w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-23-300x195.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-23-768x500.png 768w\" sizes=\"auto, (max-width: 815px) 100vw, 815px\" \/><\/figure>\n\n\n\n<p>And click Create.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"247\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-24.png\" alt=\"\" class=\"wp-image-252\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-24.png 630w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-24-300x118.png 300w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/figure>\n\n\n\n<p>Once you are in your project, click on the Cloud Shell button:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1515\" height=\"825\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/Screenshot-2025-01-24-235848-edited.png\" alt=\"\" class=\"wp-image-279\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/Screenshot-2025-01-24-235848-edited.png 1515w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/Screenshot-2025-01-24-235848-edited-300x163.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/Screenshot-2025-01-24-235848-edited-1024x558.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/Screenshot-2025-01-24-235848-edited-768x418.png 768w\" sizes=\"auto, (max-width: 1515px) 100vw, 1515px\" \/><\/figure>\n\n\n\n<p>From here, click on the three dots:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"483\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-27-1024x483.png\" alt=\"\" class=\"wp-image-255\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-27-1024x483.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-27-300x141.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-27-768x362.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-27-1536x724.png 1536w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-27.png 1598w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Click on Upload:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"277\" height=\"442\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-28.png\" alt=\"\" class=\"wp-image-256\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-28.png 277w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-28-188x300.png 188w\" sizes=\"auto, (max-width: 277px) 100vw, 277px\" \/><\/figure>\n\n\n\n<p>Here, click Choose Files:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"347\" height=\"422\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-29.png\" alt=\"\" class=\"wp-image-257\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-29.png 347w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-29-247x300.png 247w\" sizes=\"auto, (max-width: 347px) 100vw, 347px\" \/><\/figure>\n\n\n\n<p>Now upload the file that you saved on your computer from the beginning.<\/p>\n\n\n\n<p>Now click Upload.<br><\/p>\n\n\n\n<p>This is similar to the PC method. Now type in <code>docker compose -f docker-compose-lamp.yml up -d <\/code><br>and hit Enter.<\/p>\n\n\n\n<p>You should see this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"352\" height=\"125\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-30.png\" alt=\"\" class=\"wp-image-258\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-30.png 352w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-30-300x107.png 300w\" sizes=\"auto, (max-width: 352px) 100vw, 352px\" \/><\/figure>\n\n\n\n<p>Slowly, your containers will download and you will be able to access them once we set up forwarding.<\/p>\n\n\n\n<p>When its done you will be returned back to the command line:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"407\" height=\"223\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-31.png\" alt=\"\" class=\"wp-image-259\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-31.png 407w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-31-300x164.png 300w\" sizes=\"auto, (max-width: 407px) 100vw, 407px\" \/><\/figure>\n\n\n\n<p>Now click this icon on the top left:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"465\" height=\"264\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-32.png\" alt=\"\" class=\"wp-image-260\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-32.png 465w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-32-300x170.png 300w\" sizes=\"auto, (max-width: 465px) 100vw, 465px\" \/><\/figure>\n\n\n\n<p>Now you click this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"247\" height=\"130\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-33.png\" alt=\"\" class=\"wp-image-261\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"336\" height=\"226\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-34.png\" alt=\"\" class=\"wp-image-262\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-34.png 336w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-34-300x202.png 300w\" sizes=\"auto, (max-width: 336px) 100vw, 336px\" \/><\/figure>\n\n\n\n<p>And you choose a port from the available:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># PHP MY ADMIN: http:\/\/localhost:<em>8090<\/em>\/\n# TERMINAL FOR DATABASE: https:\/\/localhost:<em>8091<\/em>\/ user is kasm_user and password is 'password'.\n# FILE UPLOAD TO APACHE: http:\/\/localhost:<em>8094<\/em>\/ user is admin and password is admin\n# APACHE: http:\/\/localhost:<em>8093<\/em>\/<\/code><\/pre>\n\n\n\n<p>And type it in and click change and preview, and keep doing this until you open up all the ports as new tabs.<\/p>\n\n\n\n<p>Once you are ready to shut down, type in: <code>docker compose -f docker-compose-lamp.yml down<\/code><\/p>\n\n\n\n<p>And close out the tab.<\/p>\n\n\n\n<p class=\"has-large-font-size\" id=\"option2\">How to use:<\/p>\n\n\n\n<p>Let&#8217;s first review phpMyAdmin:<\/p>\n\n\n\n<p>Opening it in your desired workspace, you see this page:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"604\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-35-1024x604.png\" alt=\"\" class=\"wp-image-263\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-35-1024x604.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-35-300x177.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-35-768x453.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-35-1536x906.png 1536w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-35.png 1619w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>From here you can use Phpmyadmin as normal.<\/p>\n\n\n\n<p>Opening the terminal for MariaDB on https:\/\/localhost:8091 shows us this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"646\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-36-1024x646.png\" alt=\"\" class=\"wp-image-264\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-36-1024x646.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-36-300x189.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-36-768x484.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-36.png 1459w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>This is because the webpage uses self signed certificates. Simply click on Advanced and then &#8220;Accept the risk and Continue&#8221;<\/p>\n\n\n\n<p>You will be them prompted to sign in:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"398\" height=\"269\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-37.png\" alt=\"\" class=\"wp-image-265\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-37.png 398w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-37-300x203.png 300w\" sizes=\"auto, (max-width: 398px) 100vw, 398px\" \/><\/figure>\n<\/div>\n\n\n<p>Username: kasm_user<br>Password: password<\/p>\n\n\n\n<p>You will then be greeted by the MariaDB command line:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"802\" height=\"779\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-38.png\" alt=\"\" class=\"wp-image-266\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-38.png 802w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-38-300x291.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-38-768x746.png 768w\" sizes=\"auto, (max-width: 802px) 100vw, 802px\" \/><\/figure>\n\n\n\n<p>From here you can execute SQL Commands.<\/p>\n\n\n\n<p>Opening http:\/\/localhost:8093 shows us the Apache Server. If you have nothing loaded, it will show &#8220;It works!&#8221; message.<\/p>\n\n\n\n<p>I recommend you use this starter code to check if we are able to use PHP and MariaDB:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nprint \"Hello From PHP \\n!\";\n$servername = \"db\";\n$username = \"root\";\n$password = \"notSecureChangeMe\";\n\n\/\/ Create connection\n$conn = new mysqli($servername, $username, $password);\n\n\/\/ Check connection\nif ($conn-&gt;connect_error) {\n    die(\"Connection failed: \" . $conn-&gt;connect_error);\n}\necho \"Connected successfully to the database server.&lt;br&gt;\";\n\n\/\/ List databases\n$result = $conn-&gt;query(\"SHOW DATABASES\");\nif ($result-&gt;num_rows &gt; 0) {\n    echo \"Databases:&lt;br&gt;\";\n    while ($row = $result-&gt;fetch_assoc()) {\n        echo \"- \" . $row&#91;'Database'] . \"&lt;br&gt;\";\n    }\n} else {\n    echo \"No databases found.\";\n}\n\n$conn-&gt;close();\n?&gt;\nHello from HTML!<\/code><\/pre>\n\n\n\n<p>If you get as output this:<\/p>\n\n\n\n<p>Hello From PHP !Connected successfully to the database server.<br>Databases:<br>&#8211; information_schema<br>&#8211; mysql<br>&#8211; performance_schema<br>&#8211; sys<br>Hello from HTML!<\/p>\n\n\n\n<p>or something slightly different, it means PHP and SQL is working.<\/p>\n\n\n\n<p>Now, to upload files we open: http:\/\/localhost:8094\/<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"561\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-39-1024x561.png\" alt=\"\" class=\"wp-image-267\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-39-1024x561.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-39-300x164.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-39-768x421.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-39-1536x842.png 1536w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-39.png 1584w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Username: admin<br>Password: admin<\/p>\n\n\n\n<p>You can use this utility to upload files to Apache.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-40-1024x549.png\" alt=\"\" class=\"wp-image-268\" srcset=\"https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-40-1024x549.png 1024w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-40-300x161.png 300w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-40-768x412.png 768w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-40-1536x824.png 1536w, https:\/\/boyan-tabakov.xyz\/wp-content\/uploads\/2025\/01\/image-40.png 1601w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Note that this setup is not production ready &#8211; and so it is not recommended to be exposed to the web. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is a docker-compose.yml file designed to allow users to run MariaDB + PHP + Apache to use for learning purposes. Below is the docker-compose file. Save this on your desktop as docker-compose-lamp.yml. Recommended Installation: Use Local Docker If you have Docker installed on your PC: shift + right clicking and selecting &#8220;Open PowerShell Window &#8230; <a title=\"Docker Compose File for MariaDB + PHP + Apache\" class=\"read-more\" href=\"https:\/\/boyan-tabakov.xyz\/index.php\/2025\/01\/24\/docker-compose-file-for-mariadb-php-apache\/\" aria-label=\"Read more about Docker Compose File for MariaDB + PHP + Apache\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":266,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-226","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech"],"_links":{"self":[{"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/posts\/226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/comments?post=226"}],"version-history":[{"count":10,"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/posts\/226\/revisions"}],"predecessor-version":[{"id":280,"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/posts\/226\/revisions\/280"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/media\/266"}],"wp:attachment":[{"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/categories?post=226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/boyan-tabakov.xyz\/index.php\/wp-json\/wp\/v2\/tags?post=226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}