Μάθημα 11: Εγκατάσταση Laravel και Docker

Σύγχρονο PHP Development με Containers και MVC

📋 Στόχοι Μαθήματος

Στο τέλος του μαθήματος ο φοιτητής θα μπορεί να:

  • Εξηγεί τι είναι το Docker και γιατί το χρησιμοποιούμε
  • Κατανοεί τη διαφορά μεταξύ Image και Container
  • Εγκαθιστά το Docker Desktop στον υπολογιστή του
  • Εξηγεί τι είναι το Laravel Framework και το MVC
  • Δημιουργεί νέο Laravel project με Docker (Laravel Sail)
  • Περιγράφει τη ροή ενός αιτήματος σε Laravel
  • Αναγνωρίζει τη δομή ενός Laravel project

🛠️ Το Περιβάλλον Ανάπτυξης

Πριν γράψουμε οποιονδήποτε κώδικα, χρειαζόμαστε ένα σταθερό περιβάλλον. Σε μια web εφαρμογή απαιτούνται:

Το Docker λύνει αυτό το πρόβλημα δημιουργώντας απομονωμένα περιβάλλοντα (containers), ώστε η εφαρμογή να τρέχει πάντα με τον ίδιο τρόπο.

👉 Σημαντική διάκριση:

Το Docker δεν ανήκει στην εφαρμογή. Ανήκει στο πώς τρέχει η εφαρμογή. Είναι το "περιβάλλον", όχι ο "κώδικας".

🐳 Τι είναι το Docker (Θεωρητικά)

Το Docker βασίζεται σε δύο βασικές έννοιες:

Έννοια Περιγραφή Παρομοίωση
Image Το "σχέδιο" - περιέχει όλα τα απαραίτητα 📐 Αρχιτεκτονικό σχέδιο σπιτιού
Container Το "τρέχον αντίγραφο" του image 🏠 Το χτισμένο σπίτι

Χαρακτηριστικά κάθε Container

📦 Κάθε container:
  • Είναι ανεξάρτητο από τα υπόλοιπα
  • Περιέχει μόνο ό,τι χρειάζεται
  • Μπορεί να διαγραφεί χωρίς απώλεια κώδικα
⚠️ Το Docker ΔΕΝ:
  • Γνωρίζει MVC
  • Γνωρίζει Laravel
  • Ενδιαφέρεται για τον κώδικα

Απλώς εξασφαλίζει ότι: «Η εφαρμογή τρέχει σε ελεγχόμενο περιβάλλον»

Γιατί χρησιμοποιούμε Docker;

Πρόβλημα ΧΩΡΙΣ Docker Λύση ΜΕ Docker
😫 "Στον δικό μου υπολογιστή δουλεύει!" ✅ Ίδιο περιβάλλον παντού
😫 Εγκατάσταση PHP, MySQL, Apache χειροκίνητα ✅ Όλα έτοιμα με μία εντολή
😫 Διαφορετικές εκδόσεις PHP σε κάθε μηχάνημα ✅ Καθορισμένη έκδοση για όλους
😫 Conflicts μεταξύ projects ✅ Κάθε project σε ξεχωριστό container

Πώς λειτουργεί το Docker

📄 Dockerfile / docker-compose.yml
Αρχεία που περιγράφουν τι χρειάζεται η εφαρμογή
⬇️
📦 Image
"Πακέτο" με όλα τα απαραίτητα (PHP, MySQL, κτλ)
⬇️
🐳 Container
Το image "τρέχει" - η εφαρμογή είναι ζωντανή!

🖐️ Hands-on: Πρακτική Εγκατάσταση Docker

Ας δούμε βήμα-βήμα πώς εγκαθιστούμε και χρησιμοποιούμε το Docker στην πράξη.

Βήμα 1: Κατέβασμα Docker Desktop

Επισκεφθείτε την επίσημη σελίδα εγκατάστασης ανάλογα με το λειτουργικό σας:

  • Mac: https://docs.docker.com/desktop/setup/install/mac-install/
  • Windows: https://docs.docker.com/desktop/setup/install/windows-install/
  • Linux: https://docs.docker.com/desktop/setup/install/linux/
Βήμα 2: Εγκατάσταση Docker Desktop

Ακολουθήστε τις οδηγίες του installer για το λειτουργικό σας σύστημα.

Βήμα 3: Εκκίνηση και Επαλήθευση

Ανοίξτε το Docker Desktop και επιβεβαιώστε ότι τρέχει:

# Έλεγχος έκδοσης Docker docker --version # Αναμενόμενο αποτέλεσμα: Docker version 24.0.7, build afdd53b
Βήμα 4: Δημιουργία δύο Apache Containers

Θα δημιουργήσουμε δύο containers με Apache σε διαφορετικές θύρες για να δούμε πώς λειτουργεί η απομόνωση!

🔹 Container 1 – Apache στη θύρα 8090

docker run -d \ # Εκκινεί container σε background (detached mode) --name apache-8090 \ # Δίνει όνομα στο container για εύκολη διαχείριση -p 8090:80 \ # Port mapping: # 8090 = πόρτα του host (υπολογιστή) # 80 = πόρτα μέσα στο container (Apache) httpd:2.4 # Image: Apache HTTP Server έκδοση 2.4 # Πληκτρολόγηση στο terminal: docker run -d --name apache-8090 -p 8090:80 httpd:2.4
🌐 Πρόσβαση από browser:

http://localhost:8090

🔹 Container 2 – Apache στη θύρα 8091

docker run -d \ # Εκκινεί container σε background --name apache-8091 \ # Μοναδικό όνομα για το δεύτερο container -p 8091:80 \ # Port mapping: # 8091 = πόρτα του host # 80 = πόρτα Apache μέσα στο container httpd:2.4 # Το ίδιο image Apache (ίδια "βάση", άλλο container) # Πληκτρολόγηση στο terminal: docker run -d --name apache-8091 -p 8091:80 httpd:2.4
🌐 Πρόσβαση από browser:

http://localhost:8091

✅ Τι μόλις πετύχαμε;
  • Δύο ανεξάρτητοι Apache servers τρέχουν ταυτόχρονα
  • Χρησιμοποιούν το ίδιο image (httpd:2.4) αλλά είναι διαφορετικά containers
  • Κάθε ένα ακούει σε διαφορετική θύρα (8090 vs 8091)
  • Είναι πλήρως απομονωμένα μεταξύ τους!

📝 Αλλαγή περιεχομένου μέσω Docker Desktop (GUI)

Παρακάτω σου δείχνω πώς να βάλεις διαφορετικά αρχεία (index.html) σε κάθε Apache container ΜΕΣΑ από το Docker Desktop, χωρίς terminal.

🧭 Σενάριο:

Έχεις:

  • apache-8090 → http://localhost:8090
  • apache-8091 → http://localhost:8091

Θέλεις διαφορετικό περιεχόμενο στον καθένα!

✅ Βήμα 1: Άνοιξε το container
  1. Docker Desktop → Containers
  2. Κλικ στο apache-8090

Θα δεις tabs όπως: Logs, Inspect, Files, Exec

✅ Βήμα 2: Πήγαινε στο root folder του Apache
  1. Πήγαινε στο tab Files
  2. Άνοιξε τον φάκελο: /usr/local/apache2/htdocs

Αυτός είναι ο DocumentRoot του Apache - εδώ βρίσκονται τα αρχεία της ιστοσελίδας.

✅ Βήμα 3: Δημιούργησε ή άλλαξε το index.html

Έχεις 2 επιλογές:

  • Επιλογή Α: Κάνε διπλό κλικ στο index.html για να το επεξεργαστείς
  • Επιλογή Β: Δεξί κλικ → Edit file
📄 Παράδειγμα για apache-8090:
<!DOCTYPE html>
<html>
<head>
    <title>Server 8090</title>
</head>
<body>
    <h1>🟢 Apache Container 8090</h1>
    <p>Αυτός είναι ο πρώτος server!</p>
</body>
</html>
📄 Παράδειγμα για apache-8091:
<!DOCTYPE html>
<html>
<head>
    <title>Server 8091</title>
</head>
<body>
    <h1>🔵 Apache Container 8091</h1>
    <p>Αυτός είναι ο δεύτερος server!</p>
</body>
</html>
✅ Αποτέλεσμα:
  • Άνοιξε http://localhost:8090 → Βλέπεις "🟢 Apache Container 8090"
  • Άνοιξε http://localhost:8091 → Βλέπεις "🔵 Apache Container 8091"

Δύο διαφορετικές σελίδες, δύο διαφορετικά containers!

⚠️ Σημείωση:

Οι αλλαγές μέσα στο container είναι προσωρινές. Αν διαγράψεις το container και το ξαναφτιάξεις, θα χαθούν. Για μόνιμες αλλαγές χρησιμοποιούμε volumes (θα το δούμε αργότερα).

💻 Πώς μπαίνεις στο terminal του container (shell)

Μπορείς να μπεις "μέσα" στο container και να τρέχεις εντολές σαν να ήσουν σε ξεχωριστό υπολογιστή!

🔹 Apache container 8090

docker exec -it apache-8090 bash

Μετά θα δεις κάτι σαν:

root@096ed5006732:/usr/local/apache2#
👉 ΤΩΡΑ είσαι μέσα στο container!

Μπορείς να τρέξεις εντολές Linux, να δεις αρχεία, να κάνεις αλλαγές.

🔹 Apache container 8091

docker exec -it apache-8091 bash
🔍 Τι σημαίνει -it;
  • -iinteractive (κρατά ανοιχτό το input)
  • -tterminal (TTY)

Χωρίς -it δεν έχεις κανονικό shell.

🔧 Εγκατάσταση εργαλείων μέσα στο container

Το Apache image είναι βασισμένο σε Debian Linux. Μπορείς να εγκαταστήσεις εργαλεία με τον package manager apt:

# Μέσα στο container (αφού έκανες docker exec -it ...) # Ενημέρωση λίστας πακέτων apt update # Εγκατάσταση vim editor apt install -y vim
⚠️ Σημείωση:

Τα εργαλεία που εγκαθιστάς μέσα στο container είναι προσωρινά. Αν διαγράψεις το container, θα χαθούν. Για μόνιμες εγκαταστάσεις χρησιμοποιούμε custom Dockerfile.

📝 Παράδειγμα: Δημιουργία αρχείου μέσα στο container
# Μπες στο container
docker exec -it apache-8090 bash

# Πήγαινε στον φάκελο htdocs
cd /usr/local/apache2/htdocs

# Δημιούργησε νέο αρχείο
echo "<h1>Hello from Terminal!</h1>" > test.html

# Έξοδος από το container
exit

Τώρα μπορείς να δεις το αρχείο στο: http://localhost:8090/test.html

🗂️ Διαχείριση των Containers

# Δες τα containers που τρέχουν docker ps # Σταμάτα ένα container docker stop apache-8090 # Ξεκίνα ξανά ένα container docker start apache-8090 # Διαγραφή container (πρέπει πρώτα να σταματήσει) docker stop apache-8090 docker rm apache-8090 # Διαγραφή και των δύο containers docker stop apache-8090 apache-8091 docker rm apache-8090 apache-8091
💡 Σημαντική παρατήρηση:

Αυτό το παράδειγμα δείχνει τη δύναμη του Docker: μπορούμε να τρέξουμε πολλαπλές υπηρεσίες από το ίδιο image, σε διαφορετικές θύρες, χωρίς conflicts. Στο Laravel θα κάνουμε κάτι παρόμοιο αλλά με PHP + MySQL + Redis!

🔹 Container 3 – Ubuntu με πολλαπλές θύρες

Ας δημιουργήσουμε ένα τρίτο container με Ubuntu 24.04 που θα έχει δύο port mappings:

docker run -d --name gmpardis-ubuntu \ -p 8092:80 -p 3307:3306 \ ubuntu:24.04 sleep infinity

📖 Επεξήγηση εντολών

docker run # Δημιουργεί και ξεκινά ένα ΝΕΟ container -d # Detached mode: τρέχει στο background --name gmpardis-ubuntu # Δίνουμε όνομα στο container (για εύκολη διαχείριση)
-p 8092:80 # Port mapping για το web: # 8092 = πόρτα του υπολογιστή (host) # 80 = πόρτα μέσα στο container (Apache)
-p 3307:3306 # Port mapping για MySQL: # 3307 = πόρτα του host # 3306 = πόρτα MySQL μέσα στο container
ubuntu:24.04 # Image: Ubuntu Linux έκδοση 24.04 LTS
sleep infinity # Εντολή που τρέχει μέσα στο container # Κρατά το container "ζωντανό" για πάντα
⚠️ Γιατί sleep infinity;

Το Ubuntu image δεν έχει κάποια υπηρεσία που τρέχει by default. Χωρίς το sleep infinity, το container θα σταματούσε αμέσως! Με αυτή την εντολή, το container μένει ανοιχτό και μπορούμε να μπούμε μέσα και να εγκαταστήσουμε ό,τι θέλουμε.

Είσοδος στο Ubuntu container

docker exec -it gmpardis-ubuntu bash

Τώρα μπορείς να εγκαταστήσεις ό,τι θέλεις μέσα στο Ubuntu:

# Ενημέρωση λίστας πακέτων apt-get update
# Εγκατάσταση Apache HTTP Server apt-get install apache2
# Εκκίνηση Apache service apache2 start
# Εγκατάσταση PHP apt-get install php libapache2-mod-php
# Βεβαιώσου ότι το PHP module είναι ενεργό a2enmod php8.3
# Επανεκκίνηση Apache για να φορτώσει την PHP service apache2 restart
# Δημιουργία δοκιμαστικής PHP σελίδας echo "<?php phpinfo(); ?>" > /var/www/html/info.php # Γράφει ένα απλό αρχείο που δείχνει πληροφορίες PHP για έλεγχο ότι δουλεύει
# Εγκατάσταση MariaDB Server apt-get install mariadb-server
# Εκκίνηση MariaDB service mariadb start
# Εγκατάσταση phpMyAdmin apt-get install phpmyadmin
# Είσοδος στη MariaDB mysql

Θα δεις prompt:

MariaDB [(none)]>
# Δημιουργία χρήστη και δικαιωμάτων (μία-μία ή όλες μαζί) CREATE USER 'gmpardis'@'localhost' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'gmpardis'@'localhost'; FLUSH PRIVILEGES; EXIT;
✅ Έτοιμο!

Τώρα έχεις χρήστη gmpardis με password 123456 για να συνδεθείς στο phpMyAdmin!

🌐 Πρόσβαση:
  • Web server: http://localhost:8092
  • MySQL: localhost:3307
  • phpMyAdmin: http://localhost:8092/phpmyadmin
💡 Διαφορά Apache image vs Ubuntu image:
  • httpd:2.4 → Έτοιμο image με Apache προεγκατεστημένο και ρυθμισμένο
  • ubuntu:24.04 → "Καθαρό" λειτουργικό, εσύ εγκαθιστάς ό,τι θέλεις

Το Ubuntu σου δίνει πλήρη έλεγχο αλλά απαιτεί περισσότερη δουλειά!

📦 Μεταφορά Container

Μπορείς να μεταφέρεις το container που έφτιαξες σε άλλον υπολογιστή!

🔹 Μετατρέπεις το container σε image

1️⃣ Στον υπολογιστή σου (Mac)

docker commit gmpardis-ubuntu gmpardis-lamp:1.0
📌 Τι κάνει:

Παίρνει το τρέχον container (Ubuntu + Apache + PHP + MariaDB + phpMyAdmin) και το αποθηκεύει σαν Docker image.

2️⃣ Αποθήκευση σε αρχείο

docker save gmpardis-lamp:1.0 > gmpardis-lamp.tar

👉 Δημιουργεί αρχείο gmpardis-lamp.tar

3️⃣ Μεταφορά σε Windows

4️⃣ Στον Windows υπολογιστή

(με Docker Desktop εγκατεστημένο)

docker load < gmpardis-lamp.tar

5️⃣ Τρέχεις το container στα Windows

docker run -d --name gmpardis-ubuntu \ -p 8092:80 -p 3307:3306 \ gmpardis-lamp:1.0
🎉 ΤΕΛΟΣ!

👉 Ανοίγεις: http://localhost:8092/phpmyadmin

🏗️ MVC Αρχιτεκτονική

1. Τι πρόβλημα λύνει το MVC;

❌ Χωρίς MVC:
  • Όλα είναι ανακατεμένα σε ένα αρχείο
  • HTML + PHP + SQL μαζί
  • Δύσκολη συντήρηση
  • Χάος 😵

👉 Το MVC βάζει τάξη στον κώδικα.

2. Τι σημαίνει MVC

MVC = Model – View – Controller

Χωρίζουμε την εφαρμογή σε 3 κομμάτια, το καθένα με συγκεκριμένο ρόλο.

3. View (Τι βλέπει ο χρήστης)

👉 Το View είναι:
  • HTML
  • Λίγη εμφάνιση
  • Καμία λογική

📌 Παράδειγμα View:

<h1>Καλώς ήρθες</h1> <p>Όνομα χρήστη: Γιώργος</p>
❌ Το View δεν:
  • μιλάει με βάση
  • κάνει υπολογισμούς

4. Model (Τα δεδομένα)

👉 Το Model:
  • Αντιπροσωπεύει δεδομένα
  • Μιλάει με τη βάση
  • Δεν ξέρει τίποτα για HTML

📌 Παράδειγμα Model:

class User { public function getName() { return "Γιώργος"; } }
❌ Το Model δεν:
  • εμφανίζει σελίδες
  • ξέρει πώς φαίνεται ο χρήστης

5. Controller (Ο συντονιστής)

👉 Ο Controller:
  • Δέχεται το αίτημα του χρήστη
  • Μιλάει στο Model
  • Στέλνει δεδομένα στο View

📌 Παράδειγμα Controller:

$user = new User(); $name = $user->getName(); include "view.php";

6. Πώς δουλεύουν μαζί (ροή)

Ροή MVC:

1️⃣ Ο χρήστης ανοίγει μια σελίδα

2️⃣ Ο Controller ενεργοποιείται

3️⃣ Ο Controller ζητά δεδομένα από το Model

4️⃣ Το Model επιστρέφει δεδομένα

5️⃣ Ο Controller τα στέλνει στο View

6️⃣ Το View εμφανίζεται στον χρήστη

7. Παράδειγμα χωρίς MVC (ΛΑΘΟΣ)

<?php $conn = mysqli_connect(...); $result = mysqli_query($conn, "SELECT name FROM users"); echo "<h1>Χρήστης</h1>"; while ($row = mysqli_fetch_assoc($result)) { echo $row['name']; } ?>
❌ Όλα ανακατεμένα!

8. Παράδειγμα με MVC (ΣΩΣΤΟ)

Model (User.php)

class User { public function getAll() { return ["Γιώργος", "Μαρία"]; } }

Controller (UserController.php)

$user = new User(); $users = $user->getAll(); include "UserView.php";

View (UserView.php)

<h1>Χρήστες</h1> <ul> <?php foreach ($users as $u): ?> <li><?= $u ?></li> <?php endforeach; ?> </ul>

9. Γιατί το MVC είναι καλό;

✔ Πλεονεκτήματα MVC:
  • ✔ Καθαρός κώδικας
  • ✔ Εύκολες αλλαγές
  • ✔ Ομαδική δουλειά
  • ✔ Λιγότερα bugs
  • ✔ Έτοιμο για frameworks (Laravel)

10. Πώς συνδέεται με Laravel

👉 Το Laravel επιβάλλει MVC:
  • Modelsapp/Models
  • Controllersapp/Http/Controllers
  • Viewsresources/views

Για να εγκατασταθεί το Laravel, χρειάζονται εργαλεία όπως PHP και Composer. Στη σύγχρονη πρακτική, αυτά τρέχουν μέσα από Docker.

🔴 Τι είναι το Laravel (Θεωρητικά)

Το Laravel είναι ένα framework που οργανώνει την ανάπτυξη εφαρμογών. Παρέχει:

👉 Το Laravel βασίζεται στο MVC και καθορίζει:
  • Πού γράφεται κάθε κομμάτι κώδικα
  • Ποιος είναι υπεύθυνος για τι

Για να εγκατασταθεί το Laravel, χρειάζονται εργαλεία όπως PHP και Composer. Στη σύγχρονη πρακτική, αυτά τρέχουν μέσα από Docker.

Χαρακτηριστικό Περιγραφή
📁 MVC Architecture Model-View-Controller - Οργανωμένη δομή κώδικα
🛣️ Routing Εύκολη διαχείριση URLs και endpoints
🗄️ Eloquent ORM Εύκολη επικοινωνία με βάσεις δεδομένων
🎨 Blade Templates Δυναμικά HTML templates
🔐 Authentication Έτοιμο σύστημα login/register
🐳 Laravel Sail Εύκολη εγκατάσταση με Docker

🏗️ Η Αρχιτεκτονική MVC

Το MVC (Model-View-Controller) είναι αρχιτεκτονικό πρότυπο που χωρίζει την εφαρμογή σε τρία μέρη:

📊 Model

Τα Δεδομένα

  • Αναπαριστά τα δεδομένα
  • Επικοινωνεί με τη βάση
  • Περιέχει επιχειρησιακή λογική

👁️ View

Η Εμφάνιση

  • Δείχνει δεδομένα στον χρήστη
  • HTML templates (Blade)
  • Δεν περιέχει λογική

🎮 Controller

Ο Συντονιστής

  • Δέχεται το αίτημα
  • Ελέγχει τη ροή
  • Συντονίζει Model & View
🎯 Στόχος του MVC:
  • Διαχωρισμός ευθυνών - Κάθε μέρος κάνει μία δουλειά
  • Καθαρός κώδικας - Εύκολος στην ανάγνωση
  • Ευκολία συντήρησης - Αλλαγές σε ένα μέρος δεν επηρεάζουν τα άλλα

Model (Αναλυτικά)

📊 Το Model:
  • Αναπαριστά τα δεδομένα της εφαρμογής
  • Επικοινωνεί με τη βάση δεδομένων
  • Περιέχει επιχειρησιακή λογική (business logic)

Στο Laravel, τα Models αντιστοιχούν σε πίνακες της βάσης και χειρίζονται εγγραφές.

Το Model ΔΕΝ: εμφανίζει HTML, χειρίζεται HTTP αιτήματα

View (Αναλυτικά)

👁️ Το View:
  • Είναι η εμφάνιση της εφαρμογής
  • Δείχνει δεδομένα στον χρήστη
  • ΔΕΝ περιέχει λογική εφαρμογής

Στο Laravel, τα Views είναι Blade templates που δέχονται δεδομένα και εμφανίζουν αποτέλεσμα.

Το View ΔΕΝ: μιλάει με βάση δεδομένων, παίρνει αποφάσεις

Controller (Αναλυτικά)

🎮 Ο Controller:
  • Δέχεται το αίτημα από τον χρήστη
  • Ελέγχει τη ροή της εφαρμογής
  • Συντονίζει Model και View

Στο Laravel, κάθε route οδηγεί σε Controller που αποφασίζει τι θα επιστραφεί.

Ο Controller είναι: ο μεσάζοντας της εφαρμογής

🔄 Ροή Αιτήματος σε Laravel με Docker

Πώς επεξεργάζεται ένα αίτημα

1️⃣ Αίτημα χρήστη
Ο χρήστης ζητά μια σελίδα (π.χ. /login)
⬇️
2️⃣ Docker Services
Το Docker έχει ήδη σηκώσει PHP, MySQL, Web Server
⬇️
3️⃣ Laravel Routing
Το Laravel λαμβάνει το αίτημα και το routing οδηγεί στον κατάλληλο Controller
⬇️
4️⃣ Controller → Model
Ο Controller καλεί το Model για να πάρει δεδομένα
⬇️
5️⃣ Model → Database
Το Model επιστρέφει δεδομένα από τη βάση
⬇️
6️⃣ Controller → View
Ο Controller στέλνει τα δεδομένα στο View
⬇️
7️⃣ Απάντηση στον χρήστη
Το View εμφανίζεται στον browser
✅ Η ροή είναι ξεκάθαρη και προβλέψιμη!

Κάθε βήμα έχει συγκεκριμένη ευθύνη.

🔐 Θεωρητικό Παράδειγμα: Login

Ας δούμε πώς συνεργάζονται όλα σε ένα πραγματικό σενάριο login:

Επίπεδο Ρόλος Τι κάνει
🐳 Docker Περιβάλλον Εξασφαλίζει PHP και βάση δεδομένων
🔴 Laravel Framework Οργανώνει το authentication
🎮 Controller Συντονιστής Επεξεργάζεται το login request
📊 Model Δεδομένα Ελέγχει τον χρήστη στη βάση
👁️ View Εμφάνιση Εμφανίζει επιτυχία ή σφάλμα
👉 Κάθε ρόλος είναι διακριτός!

Αυτός ο διαχωρισμός κάνει τον κώδικα εύκολο στην κατανόηση και συντήρηση.

⛵ Laravel Sail (Docker + Laravel μαζί)

Το Laravel παρέχει το Sail, το οποίο είναι:

💡 Θεωρητικά:

Το Sail επιτρέπει στο Laravel να "ζήσει" μέσα σε containers. Για να δημιουργηθεί νέο project, χρησιμοποιείται ένα container που περιέχει PHP και Composer - χωρίς να απαιτείται τοπική εγκατάσταση PHP!

Δημιουργία νέου Laravel Project

⚠️ Προαπαιτούμενα:
  • Το Docker Desktop πρέπει να τρέχει
  • Σύνδεση στο internet
  • Τουλάχιστον 4GB ελεύθερη μνήμη RAM
# Πήγαινε στον φάκελο που θέλεις (παράδειγμα) cd ~/Projects # Δημιουργία νέου Laravel project με το όνομα "my-app" curl -s "https://laravel.build/my-app" | bash # Περίμενε... θα κατεβάσει αρκετά αρχεία (5-10 λεπτά)

Εκκίνηση του Project

# Μπες στον φάκελο του project cd my-app # Ξεκίνα τα Docker containers ./vendor/bin/sail up # Ή για να τρέξει στο background: ./vendor/bin/sail up -d
✅ Επιτυχία!

Άνοιξε τον browser στη διεύθυνση: http://localhost

Θα δεις την αρχική σελίδα του Laravel!

Διακοπή των containers

# Για να σταματήσεις τα containers ./vendor/bin/sail down # Ή αν τρέχει στο προσκήνιο, πάτα: Ctrl + C

⌨️ Βασικές Εντολές Sail & Docker

Εντολές Laravel Sail

Εντολή Περιγραφή
./vendor/bin/sail up Ξεκινά τα containers
./vendor/bin/sail up -d Ξεκινά στο background
./vendor/bin/sail down Σταματά τα containers
./vendor/bin/sail php artisan Τρέχει εντολές artisan
./vendor/bin/sail composer Τρέχει εντολές composer
./vendor/bin/sail mysql Σύνδεση στη MySQL
./vendor/bin/sail shell Είσοδος στο container
💡 Συντόμευση!

Για να μη γράφεις κάθε φορά ./vendor/bin/sail, πρόσθεσε αυτό στο ~/.bashrc ή ~/.zshrc:

# Προσθήκη alias για sail alias sail='./vendor/bin/sail' # Μετά μπορείς απλά να γράφεις: sail up sail down sail php artisan migrate

Χρήσιμες εντολές Docker

# Δες τα containers που τρέχουν docker ps # Δες ΟΛΑ τα containers (και τα σταματημένα) docker ps -a # Δες τα images που έχεις κατεβάσει docker images # Σταμάτα όλα τα containers docker stop $(docker ps -q) # Καθάρισε unused images και containers docker system prune

📂 Δομή Laravel Project

Όταν δημιουργείς ένα Laravel project, δημιουργείται η παρακάτω δομή φακέλων:

my-app/ ├── app/ # Ο κύριος κώδικας της εφαρμογής │ ├── Http/ │ │ ├── Controllers/ # Controllers (λογική) │ │ └── Middleware/ # Middleware (φίλτρα) │ └── Models/ # Models (βάση δεδομένων) │ ├── config/ # Ρυθμίσεις εφαρμογής │ ├── database/ # Migrations & Seeders │ ├── migrations/ # Αλλαγές στη βάση │ └── seeders/ # Test data │ ├── public/ # Δημόσια αρχεία (CSS, JS, images) │ └── index.php # Entry point │ ├── resources/ # Views και assets │ └── views/ # Blade templates (HTML) │ ├── routes/ # Ορισμός URLs │ └── web.php # Web routes (σημαντικό!) │ ├── storage/ # Logs, cache, uploads │ ├── vendor/ # Dependencies (composer) │ ├── .env # Ρυθμίσεις περιβάλλοντος (σημαντικό!) ├── composer.json # PHP dependencies └── docker-compose.yml # Docker configuration

Τα πιο σημαντικά αρχεία για αρχή:

📌 routes/web.php

Εδώ ορίζουμε τα URLs της εφαρμογής μας (routes).

📌 app/Http/Controllers/

Εδώ γράφουμε τους Controllers.

📌 app/Models/

Εδώ γράφουμε τα Models.

📌 resources/views/

Εδώ βάζουμε τα HTML templates (Blade files).

📌 .env

Εδώ βάζουμε passwords, API keys, ρυθμίσεις βάσης.

⚙️ Το αρχείο .env

Το .env περιέχει τις ρυθμίσεις του περιβάλλοντος:

# Όνομα εφαρμογής APP_NAME=Laravel APP_ENV=local APP_DEBUG=true APP_URL=http://localhost # Ρυθμίσεις βάσης δεδομένων (ήδη ρυθμισμένες για Sail) DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=sail DB_PASSWORD=password
⚠️ ΠΡΟΣΟΧΗ!

Το αρχείο .env περιέχει passwords και ευαίσθητα δεδομένα. ΠΟΤΕ μην το ανεβάζεις στο GitHub! Είναι ήδη στο .gitignore.

🎯 Γιατί αυτή η προσέγγιση είναι σωστή

Τεχνολογία Προσφέρει
🐳 Docker Σταθερό περιβάλλον - Ίδιο παντού
🔴 Laravel Παραγωγικότητα - Έτοιμες λύσεις
🏗️ MVC Καθαρή αρχιτεκτονική - Οργάνωση
✅ Ο συνδυασμός επιτρέπει:

Επαγγελματική ανάπτυξη εφαρμογών με σύγχρονες πρακτικές!

📝 Συμπέρασμα

Τι μάθαμε σήμερα:

  • Docker → Τρέχει την εφαρμογή σε containers
  • Laravel → Οργανώνει τον κώδικα με framework
  • MVC → Δομεί τη λογική (Model-View-Controller)
  • Sail → Γέφυρα Docker-Laravel
  • ✅ Βασικές εντολές: sail up, sail down, sail artisan
  • ✅ Δομή φακέλων Laravel (routes, views, controllers, models)
💡 Κλειδί κατανόησης:

Αν κατανοήσεις τη σχέση Docker → Laravel → MVC, κατανοείς τη βάση των σύγχρονων web εφαρμογών!

Γρήγορη Αναφορά Εντολών

Ενέργεια Εντολή
Νέο Laravel project curl -s "https://laravel.build/όνομα" | bash
Εκκίνηση Docker ./vendor/bin/sail up -d
Διακοπή Docker ./vendor/bin/sail down
Migrations ./vendor/bin/sail php artisan migrate
Σύνδεση MySQL ./vendor/bin/sail mysql
📚 Για το επόμενο μάθημα:
  • Βεβαιωθείτε ότι το Docker Desktop είναι εγκατεστημένο
  • Δημιουργήστε ένα Laravel project και επιβεβαιώστε ότι τρέχει
  • Εξερευνήστε τη δομή φακέλων

✅ Τέλος Μαθήματος 11

Εγκατάσταση Laravel και Docker - Αρχιτεκτονική MVC

Πανεπιστήμιο Πελοποννήσου - Τμήμα Ψηφιακών Συστημάτων

Μπάρδης Γιώργος