Προγραμματισμός C: Εγκατάσταση GCC με Docker

Περιβάλλον Ανάπτυξης C με Containers

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

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

  • Εξηγεί τι είναι το Docker και γιατί το χρησιμοποιούμε
  • Κατανοεί τη διαφορά μεταξύ Image και Container
  • Εγκαθιστά το Docker Desktop στον υπολογιστή του
  • Δημιουργεί containers με διάφορα images (Apache, Ubuntu)
  • Εγκαθιστά τον GCC compiler μέσα σε Ubuntu container
  • Μεταγλωττίζει και εκτελεί προγράμματα C μέσα στο container

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

Για να γράψεις και να τρέξεις προγράμματα σε C, χρειάζεσαι:

❌ Το πρόβλημα χωρίς Docker:
  • Διαφορετική εγκατάσταση σε Windows / Mac / Linux
  • Προβλήματα συμβατότητας εκδόσεων
  • "Στον υπολογιστή μου δουλεύει!" 😤
  • Δύσκολη εγκατάσταση σε Windows
✅ Η λύση με Docker:
  • Ίδιο περιβάλλον παντού (Windows, Mac, Linux)
  • Εύκολη εγκατάσταση με μία εντολή
  • Καμία σύγκρουση με το λειτουργικό σύστημα
  • Επαγγελματικό περιβάλλον ανάπτυξης

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

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

🏠 Αναλογία με σπίτι:
  • Image = Το αρχιτεκτονικό σχέδιο του σπιτιού (blueprint)
  • Container = Το πραγματικό σπίτι που χτίστηκε από το σχέδιο

Από ένα σχέδιο μπορείς να χτίσεις πολλά σπίτια!

Διαφορά Image vs Container

Image Container
📦 "Πακέτο" με όλα τα απαραίτητα 🏃 Το image σε εκτέλεση
Στατικό (δεν αλλάζει) Δυναμικό (τρέχει, σταματά)
Αποθηκεύεται στο Docker Hub Τρέχει στον υπολογιστή σου
Παράδειγμα: gcc:latest Παράδειγμα: my-gcc-container
📦 Image
"Πακέτο" με GCC, Linux, βιβλιοθήκες
⬇️
🐳 Container
Το image "τρέχει" - μπορείς να κάνεις compile!
📌 Τι ξέρει το Docker:
  • Πώς να τρέξει containers
  • Πώς να διαχειριστεί δίκτυα και αρχεία
  • Πώς να απομονώσει διεργασίες
❌ Τι ΔΕΝ ξέρει το Docker:
  • Τι είναι η C ή ο GCC
  • Πώς να κάνει compile τον κώδικά σου
  • Τι κάνει το πρόγραμμά σου

🖐️ 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)
  • Είναι πλήρως απομονωμένα μεταξύ τους!

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

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

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

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

docker run # Δημιουργεί και ξεκινά ένα ΝΕΟ container -d # Detached mode: τρέχει στο background --name my-ubuntu # Δίνουμε όνομα στο container (για εύκολη διαχείριση)
-p 8092:80 # Port mapping για το web: # 8092 = πόρτα του υπολογιστή (host) # 80 = πόρτα μέσα στο container
-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 my-ubuntu bash

Τώρα μπορείς να εγκαταστήσεις τον GCC compiler:

# Ενημέρωση λίστας πακέτων apt-get update
# Εγκατάσταση GCC compiler apt-get install gcc
# Επαλήθευση εγκατάστασης gcc --version
✅ Έτοιμο!

Τώρα έχεις τον GCC compiler εγκατεστημένο και μπορείς να κάνεις compile προγράμματα C!

💡 Διαφορά httpd image vs Ubuntu image:
  • httpd:2.4 → Έτοιμο image με Apache προεγκατεστημένο και ρυθμισμένο
  • ubuntu:24.04 → "Καθαρό" λειτουργικό, εσύ εγκαθιστάς ό,τι θέλεις

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

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

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

💻 Compile και Εκτέλεση Προγράμματος C

Τώρα που έχουμε τον GCC εγκατεστημένο στο Ubuntu container, ας κάνουμε compile ένα πρόγραμμα!

Βήμα 1: Δημιουργία αρχείου C μέσα στο container

Μέσα στο container (αφού έχεις κάνει docker exec -it my-ubuntu bash), δημιούργησε ένα αρχείο:

# Δημιουργία αρχείου hello.c με echo echo '#include <stdio.h> int main() { printf("Hello from Docker!\\n"); return 0; }' > hello.c

Ή αν προτιμάς, χρησιμοποίησε έναν editor:

# Εγκατάσταση nano editor (προαιρετικά) apt-get install nano # Δημιουργία αρχείου nano hello.c

Και γράψε τον κώδικα:

#include <stdio.h> int main() { printf("Hello from Docker!\n"); return 0; }

Βήμα 2: Compile το πρόγραμμα

# Compile με GCC gcc hello.c -o hello
🔍 Τι σημαίνει η εντολή;
  • gcc → Ο compiler
  • hello.c → Το αρχείο πηγαίου κώδικα
  • -o hello → Output: δημιουργεί εκτελέσιμο με όνομα "hello"

Βήμα 3: Εκτέλεση του προγράμματος

# Εκτέλεση ./hello # Αποτέλεσμα: Hello from Docker!
🎉 Επιτυχία!

Μόλις έκανες compile και έτρεξες ένα πρόγραμμα C μέσα στο Docker!

Βήμα 4: Έξοδος από το container

# Έξοδος exit

🗂️ Διαχείριση του Container

# Δες τα containers που τρέχουν docker ps # Σταμάτα το container docker stop my-ubuntu # Ξεκίνα ξανά το container docker start my-ubuntu # Διαγραφή container (πρέπει πρώτα να σταματήσει) docker stop my-ubuntu docker rm my-ubuntu

📦 Μεταφορά Container

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

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

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

docker commit my-ubuntu my-gcc:1.0
📌 Τι κάνει:

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

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

docker save my-gcc:1.0 > my-gcc.tar

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

3️⃣ Μεταφορά σε άλλον υπολογιστή

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

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

docker load < my-gcc.tar

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

docker run -d --name my-ubuntu \ -p 8092:80 -p 3307:3306 \ my-gcc:1.0 sleep infinity
🎉 ΤΕΛΟΣ!

Τώρα έχεις το ίδιο περιβάλλον ανάπτυξης C σε οποιονδήποτε υπολογιστή!

📝 Σύνοψη Εντολών

Εντολή Περιγραφή
docker run -d --name my-ubuntu ... Δημιουργία νέου container
docker exec -it my-ubuntu bash Είσοδος στο container
apt-get install gcc Εγκατάσταση GCC compiler
gcc file.c -o output Compile αρχείου C
./output Εκτέλεση προγράμματος
docker stop my-ubuntu Σταμάτημα container
docker start my-ubuntu Εκκίνηση container
docker rm my-ubuntu Διαγραφή container