Εισαγωγή
Docker είναι μια πλατφόρμα που διευκολύνει την εκτέλεση και τη διαχείριση διεργασιών εφαρμογών σε containers. Παρέχει έναν τρόπο διαχωρισμού των εφαρμογών σας από την υποδομή σας. Τα containers μοιάζουν πολύ με τις εικονικές μηχανές (virtual machines), αλλά είναι πιο φορητά, αποδοτικά και εύκολα στη χρήση. Υπάρχουν διάφοροι τρόποι για να εγκαταστήσετε το Docker σε Linux διανομές. Ο πιο δημοφιλής και εύκολος τρόπος για να εγκαταστήσετε το Docker στο υπάρχον λειτουργικό σύστημα είναι χρησιμοποιώντας τις εντολές yum.
Αυτός ο οδηγός θα δείξει πώς μπορείτε να ρυθμίσετε και να χρησιμοποιήσετε το Docker σε CentOS 7 σε λίγα απλά βήματα.
Προαπαιτούμενα:
- 64-bit Στιγμιότυπο CentOS 7.
- Ένας μη-root χρήστης με δικαιώματα sudo.
Όλες οι εντολές που εκτελείτε σε αυτόν τον οδηγό εκτελούνται ως μη-root χρήστης και, εάν είναι απαραίτητο, η πρόσβαση root θα παρέχεται χρησιμοποιώντας τη λέξη-κλειδί sudo.
Βήμα 1: Ρύθμιση του Docker σε Στιγμιότυπο CentOS 7
Το επίσημο αποθετήριο του CentOS 7 ενδέχεται να μην διαθέτει το πιο πρόσφατο πακέτο εγκατάστασης για το Docker. Σε αυτήν την ενότητα, θα εγκαταστήσετε την τελευταία έκδοση του Docker από το επίσημο αποθετήριο του Docker. Αρχικά, πρέπει να ενημερώσετε τη βάση δεδομένων πακέτων χρησιμοποιώντας:
|
1 |
sudo yum check-update |
Αφού ολοκληρωθεί το βήμα της ενημέρωσης, εκτελέστε την παρακάτω εντολή για να κάνετε λήψη και εγκατάσταση της τελευταίας έκδοσης του Docker:
|
1 |
curl -fsSL https://get.docker.com/ | sh |
Το Docker έχει πλέον εγκατασταθεί, επομένως μπορείτε να εκκινήσετε τον δαίμονα (daemon) του Docker εκτελώντας την παρακάτω εντολή:
|
1 |
sudo systemctl start docker |
Για να επαληθεύσετε εάν εκτελείται ο δαίμονας του Docker, πληκτρολογήστε τα εξής:
|
1 |
sudo systemctl status docker |
Το αποτέλεσμα της εντολής systemctl status θα πρέπει να είναι παρόμοιο με το παρακάτω κοινόχρηστο αποτέλεσμα, το οποίο δείχνει ότι εκτελείται:
|
1 2 3 4 5 6 |
Output: ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2021-02-17 18:22:06 UTC; 10s ago Docs: https://docs.docker.com Main PID: 21884 (dockerd) |
Finally to make sure Docker starts up as you reboot your machine use the command:
|
1 |
sudo systemctl enable docker |
Η εγκατάσταση του Docker σάς παρέχει την υπηρεσία Docker καθώς και το βοηθητικό πρόγραμμα πελάτη (Docker command-line client). Στις επόμενες ενότητες του οδηγού, θα μπορέσετε να εξοικειωθείτε περισσότερο με τη χρήση των εντολών Docker.
Μπορείτε επίσης να ρίξετε μια ματιά στον αναλυτικό οδηγό μας για το πώς να εγκαταστήσετε & να λειτουργήσετε το Docker σε Ubuntu στο δημόσιο νέφος.
Βήμα 2: Χρήση των εντολών Docker χωρίς το πρόθεμα Sudo
Οι εντολές Docker απαιτούν δικαιώματα root για να εκτελεστούν. Επομένως, εάν θέλετε να εκτελέσετε τις εντολές, θα πρέπει να προσθέσετε το πρόθεμα sudo. Κατά την εγκατάσταση, δημιουργείται από προεπιλογή μια ομάδα Docker. Εάν προσθέσετε έναν χρήστη στην ομάδα, μπορείτε να εκτελέσετε τις εντολές Docker χωρίς sudo. Η προσπάθεια εκτέλεσης εντολών Docker χωρίς sudo ή χωρίς την προσθήκη του χρήστη στην ομάδα θα έχει ως αποτέλεσμα ένα αποτέλεσμα παρόμοιο με το παρακάτω:
|
1 2 3 |
Output: docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'. |
Η προσθήκη του ονόματος χρήστη σας στην ομάδα Docker θα διασφαλίσει ότι δεν θα χρειάζεται να χρησιμοποιείτε το sudo για να εκτελείτε τις εντολές Docker:
|
1 |
sudo usermod -aG docker $(whoami) |
Για να προσθέσετε έναν άλλο χρήστη στην ομάδα Docker, μπορείτε απλώς να αντικαταστήσετε το όνομα χρήστη στην εντολή:
|
1 |
sudo usermod -aG docker username |
Για το υπόλοιπο αυτού του οδηγού, θα υποθέσουμε ότι όλες οι εντολές εκτελούνται από έναν χρήστη που ανήκει στην ομάδα χρηστών Docker. Εάν αυτό δεν συμβαίνει, μπορείτε να χρησιμοποιήσετε το πρόθεμα sudo με τις εντολές.
Βήμα 3: Εκτέλεση των εντολών Docker
Τώρα που έχετε εγκαταστήσει και εκτελείτε το Docker, ας δούμε μερικές εντολές για να εξοικειωθείτε με το βοηθητικό πρόγραμμα γραμμής εντολών του Docker. Οι εντολές Docker συνήθως έχουν τη μορφή:
|
1 |
docker [επιλογή] [εντολή] [ορίσματα] |
Για να βρείτε όλες τις διαθέσιμες υποεντολές θα πρέπει να χρησιμοποιήσετε:
|
1 |
docker |
Από την έκδοση Docker 20.10.3, η πλήρης λίστα των διαθέσιμων υποεντολών περιλαμβάνει:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Έξοδος: attach Σύνδεση τοπικών τυπικών εισόδου, εξόδου, και σφαλμάτων ροών σε ένα εκτελούμενο κοντέινερ build Κατασκευή μιας εικόνας από ένα Dockerfile commit Δημιουργία μιας νέας εικόνας από τις αλλαγές ενός κοντέινερ's changes cp Αντιγραφή αρχείων/φακέλων μεταξύ ενός κοντέινερ και του τοπικού συστήματος αρχείων create Δημιουργία ενός νέου κοντέινερ diff Επιθεώρηση αλλαγών σε αρχεία ή καταλόγους στο σύστημα αρχείων ενός κοντέινερs filesystem events Λήψη πραγματικού χρόνου συμβάντων από τον διακομιστή exec Εκτέλεση μιας εντολής σε ένα εκτελούμενο κοντέινερ export Εξαγωγή του συστήματος αρχείων ενός κοντέινερ's ως αρχείο tar tar archive history Εμφάνιση του ιστορικού μιας εικόναςimage images Λίστα εικόνων import Εισαγωγή των περιεχομένων από ένα tarball για τη δημιουργία μιας εικόνας συστήματος αρχείων info Εμφάνιση πληροφοριών- για όλο το σύστημα inspect Επιστροφή πληροφοριών- χαμηλού επιπέδου για αντικείμενα Docker kill Τερματισμός ενός ή περισσότερων εκτελούμενων κοντέινερ load Φόρτωση μιας εικόνας από ένα αρχείο tar ή STDIN login Σύνδεση σε ένα μητρώο Dockerregistry logout Αποσύνδεση από ένα μητρώο Dockerregistry logs Ανάκτηση των αρχείων καταγραφής ενός κοντέινερ container pause Παύση όλων των διεργασιών εντός ενός ή περισσότερωνκοντέινερ port Λίστα θυρών αντιστοιχίσεων ή μιας συγκεκριμένης αντιστοίχισης για το κοντέινερ ps Λίστα κοντέινερ pull Λήψη μιας εικόνας ή ενός αποθετηρίου από ένα μητρώο push Μεταφόρτωση μιας εικόνας ή ενός αποθετηρίου σε ένα μητρώο rename Μετονομασία ενός κοντέινερ restart Επανεκκίνηση ενός ή περισσότερων κοντέινερ rm Κατάργηση ενός ή περισσότερων κοντέινερ rmi Κατάργηση μιας ή περισσότερων εικόνων run Εκτέλεση μιας εντολής σε ένα νέο κοντέινερ save Αποθήκευση μιας ή περισσότερων εικόνων σε ένα tar αρχείο (που διοχετεύεται στο STDOUT από προεπιλογή) search Αναζήτηση στο Docker Hub για εικόνες start Εκκίνηση ενός ή περισσότερων σταματημένων κοντέινερ stats Εμφάνιση μιας ζωντανής ροής των κοντέινερ(s) πόρων χρήσης στατιστικών stop Διακοπή ενός ή περισσότερων εκτελούμενων κοντέινερ tag Δημιουργία μιας ετικέτας TARGET_IMAGE που αναφέρεται στην SOURCE_IMAGE top Εμφάνιση των εκτελούμενων διεργασιών ενός a κοντέινερ unpause Συνέχιση όλων των διεργασιών εντός ενός ή περισσότερων κοντέινερ update Ενημέρωση διαμόρφωσης of ενός ή περισσότερων κοντέινερ version Εμφάνιση των Docker πληροφοριών έκδοσης wait Αναμονή μέχρι ένα ή περισσότερα κοντέινερ να σταματήσουν, και μετά εκτύπωση των κωδικών εξόδου τους |
Μπορείτε να χρησιμοποιήσετε τη σημαία –help με μια συγκεκριμένη εντολή για να λάβετε περισσότερες πληροφορίες σχετικά με αυτήν:
|
1 |
docker subcommand --help |
Για να λάβετε λεπτομερείς πληροφορίες σχετικά με το σύστημα, χρησιμοποιήστε:
|
1 |
docker info |
Βήμα 4: Εργασία με εικόνες Docker
Οι εικόνες Docker μπορούν να χαρακτηριστούν ως το προσχέδιο για τα κοντέινερ Docker. Αυτές οι εικόνες συνήθως λαμβάνονται από το Docker Hub, το οποίο είναι ένα μητρώο που διαχειρίζεται το έργο Docker. Οποιοσδήποτε μπορεί να δημιουργήσει και να ανεβάσει τις εικόνες του στο Docker Hub. Ως αποτέλεσμα, μπορείτε εύκολα να βρείτε μια μεγάλη ποικιλία εφαρμογών και διανομών λειτουργικών συστημάτων στο μητρώο. Ας δοκιμάσουμε ένα απλό πρόγραμμα που θα επιβεβαιώσει την πρόσβαση στο Docker Hub:
|
1 |
docker run hello-world |
Θα πρέπει να λάβετε ένα αποτέλεσμα όπως το παρακάτω, το οποίο δείχνει ότι το Docker λειτουργεί:
|
1 2 3 4 |
Έξοδος: Γεια σας από το Docker! Αυτό το μήνυμα δείχνει ότι η εγκατάστασή σας φαίνεται να be λειτουργεί σωστά. ... |
Μπορείτε να βρείτε διάφορες εικόνες Docker στο Docker Hub χρησιμοποιώντας την εντολή αναζήτησης. Για παράδειγμα, δείτε την παρακάτω εντολή για να αναζητήσετε μια εικόνα CentOS:
|
1 |
docker search centos |
Το ερώτημα αναζήτησης θα εμφανίσει μια λίστα με όλες τις εικόνες που ταιριάζουν με το υποσυμβολοσειρά. Στη δική σας περίπτωση, το αποτέλεσμα θα πρέπει να είναι κάπως έτσι:
|
1 2 3 4 5 6 7 8 |
Έξοδος: NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos Η επίσημη έκδοση του CentOS. 6410 [OK] ansible/centos7-ansible Ansible στο Centos7 132 [OK] consol/centos-xfce-vnc Centos container με "headless" VNC sess… 125 [OK] jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos… 117 [OK] centos/systemd systemd ενεργοποιημένο βασικό container. 96 [OK] ... |
Στα αποτελέσματα αναζήτησης, υπάρχουν διάφορες στήλες που περιγράφουν πληροφορίες σχετικά με την εικόνα. Το OK στη στήλη OFFICIAL καθορίζει ότι η εικόνα δημιουργήθηκε και υποστηρίζεται από την εταιρεία πίσω από την εφαρμογή. Μόλις καταλήξετε στην εικόνα, μπορείτε να τη μεταφορτώσετε στον τοπικό σας υπολογιστή χρησιμοποιώντας την εντολή Docker pull:
|
1 |
docker pull centos |
Μετά τη λήψη της εικόνας, μπορείτε να εκτελέσετε το container χρησιμοποιώντας την εντολή Docker run. Εάν προσπαθήσετε απευθείας να εκτελέσετε μια εικόνα χωρίς προηγούμενη λήψη, το Docker θα κατεβάσει την εικόνα και θα εκτελέσει το container στη συνέχεια:
|
1 |
docker run centos |
Μπορείτε να δείτε τη λίστα με τις εικόνες που έχουν ληφθεί στον τοπικό σας υπολογιστή, χρησιμοποιώντας την παρακάτω εντολή:
|
1 |
docker images |
Θα πρέπει να λάβετε ένα παρόμοιο αποτέλεσμα:
|
1 2 3 4 |
Έξοδος: REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 300e315adb2f 2 μήνες πριν 209MB hello-world latest bf756fb1ae65 13 μήνες πριν 13.3kB |
Αργότερα σε αυτόν τον οδηγό, θα μπορείτε να τροποποιήσετε τις εικόνες για να εκτελέσετε τα containers. Αυτές οι νέες εικόνες μπορούν να προστεθούν ή να σταλούν (push) στο Docker Hub και σε άλλα μητρώα (registries) που φιλοξενούν εικόνες Docker.
Βήμα 5: Εκτέλεση ενός Container Διαδραστικά
Υπάρχουν διάφοροι τύποι containers. Το hello-world container που εκτελέσατε στο Βήμα 4 είναι ένας τύπος container που εκτελείται και τερματίζει αφού εμφανίσει ένα μήνυμα. Ένας άλλος τύπος container είναι ο διαδραστικός (interactive). Μπορείτε να χρησιμοποιήσετε διαδραστικά containers με παρόμοιο τρόπο όπως μια εικονική μηχανή.
Ας δημιουργήσουμε ένα container από την τελευταία εικόνα CentOS. Η χρήση των σημαιών -i και -t στην εντολή Docker run θα δώσει διαδραστική πρόσβαση στο CentOS container:
|
1 |
docker run -it centos |
Η γραμμή εντολών θα αλλάξει και θα πρέπει να μοιάζει με το παρακάτω αποτέλεσμα:
|
1 2 |
Έξοδος: [root@3ce69d2a35b9 /]# |
|
1 |
Σημείωση: Το container id που εμφανίζεται στη γραμμή εντολών είναι μοναδικό και θα σας φανεί χρήσιμο στη συνέχεια, στο , παράδειγμα είναι το it is 3ce69d2a35b9. |
Τώρα οποιαδήποτε εντολή εκτελείτε θα τρέχει μέσα στο container. Αυτό είναι παρόμοιο με την εκτέλεση μιας εντολής σε μια εικονική μηχανή. Ας προσπαθήσουμε να εγκαταστήσουμε τον MySQL server στο CentOS container. Μπορείτε να το κάνετε αυτό χρησιμοποιώντας:
|
1 |
yum install mysql |
Βήμα 6: Οριστικοποίηση Αλλαγών σε ένα Container σε μια Εικόνα Docker
Μετά την εκκίνηση του container, μπορείτε να κάνετε όλες τις λειτουργίες που είναι εφικτές σε μια παρόμοια εικονική μηχανή, όπως η δημιουργία/τροποποίηση αρχείων ή η εγκατάσταση μιας εφαρμογής. Λάβετε υπόψη ότι αυτές οι αλλαγές θα παραμείνουν μόνο για αυτό το container, και αφού καταστρέψετε το container, οι αλλαγές που κάνατε θα χαθούν.
Σε αυτό το μέρος του οδηγού, θα μάθετε πώς να δημιουργείτε μια νέα εικόνα Docker από ένα container με τις αλλαγές που έχετε κάνει. Μετά το Step5 έχετε ένα CentOS container που εκτελείται με εγκατεστημένο διακομιστή MySQL. Αυτό το container είναι πλέον διαφορετικό από την απλή εικόνα CentOS. Μπορείτε να αποθηκεύσετε αυτήν την κατάσταση του container για μελλοντική χρήση. Αρχικά, πρέπει να εξέλθετε από το container χρησιμοποιώντας:
|
1 |
exit |
Υποβάλετε (Commit) τις αλλαγές που κάνατε στο container σε μια νέα εικόνα Docker χρησιμοποιώντας την παρακάτω εντολή:
|
1 |
docker commit -m "Changes done to the image" -a "Author Name" container-id repository/new_image_name |
Στην εντολή, το -m αναφέρεται στο μήνυμα υποβολής (commit message) και θα πρέπει βασικά να υποδηλώνει τις αλλαγές που έγιναν, η ετικέτα -a χρησιμοποιείται για την αναφορά του δημιουργού. Το container-id είναι αυτό από το Step5, το οποίο λάβατε μετά την εκτέλεση του container σε διαδραστική λειτουργία (interactive mode), και συνήθως, το αποθετήριο (repository) είναι το όνομα χρήστη σας για το Docker Hub. Για παράδειγμα:
|
1 |
docker commit -m "added mysql-server" -a "CloudSigma" 59839a1b7de2 finid/centos-mariadb |
|
1 |
Note: Μετά την υποβολή της νέας εικόνας, αυτή είναι αποθηκευμένη στο σύστημά σας. Στα επόμενα στάδια του παρόντος οδηγού θα , μάθετε πώς να προωθήσετε μια εικόνα στο Docker Hub και σε παρόμοια μητρώα τα οποία φιλοξενούν εικόνες dockerΜόλις η . εικόνα σας προωθηθεί στο μητρώο αυτή μπορεί να , είναι προσβάσιμη και από άλλους επίσηςas well. |
Τώρα που η εικόνα έχει υποβληθεί, η εντολή Docker images θα πρέπει να εμφανίζει τη νέα εικόνα καθώς και τις παλιές:
|
1 |
docker images |
Το αποτέλεσμα της εντολής θα πρέπει να είναι παρόμοιο με το παρακάτω:
|
1 2 3 4 5 |
Output: REPOSITORY TAG IMAGE ID CREATED SIZE cloudsigma23/centos-mysql latest 1b9368efea70 13 δευτερόλεπτα πριν 308MB centos latest 300e315adb2f 2 μήνες πριν 209MB hello-world latest bf756fb1ae65 13 μήνες πριν 13.3kB |
Όπως φαίνεται στο παράδειγμα, μια νέα εικόνα centos-mysql δημιουργείται χρησιμοποιώντας την εικόνα CentOS από το Docker Hub. Η διαφορά στο μέγεθος υποδηλώνει ότι έγιναν κάποιες αλλαγές. Σε αυτό το παράδειγμα, ήταν η προσθήκη του διακομιστή MySQL στο container. Την επόμενη φορά που θα χρειαστείτε ένα container με διακομιστή MySQL, μπορείτε απλά να εκτελέσετε τη νέα εικόνα, και ορίστε! Έχετε ένα CentOS container με προεγκατεστημένο διακομιστή MySQL να εκτελείται.
Βήμα 7: Διαχείριση Docker Containers
Τώρα που είστε εξοικειωμένοι με το Docker, αφού το χρησιμοποιήσετε για κάποιο χρονικό διάστημα, θα έχετε ήδη κάποια ενεργά και κάποια ανενεργά containers. Για να λάβετε τη λίστα με τα ενεργά containers θα πρέπει να χρησιμοποιήσετε:
|
1 |
docker ps |
Θα πρέπει να δείτε ένα παρόμοιο αποτέλεσμα:
|
1 2 3 |
Output: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 604c889cf404 centos "/bin/bash" 20 λεπτά πριν Up 20 λεπτά intelligent_easley |
Για να εμφανίσετε τόσο τα ενεργά όσο και τα ανενεργά κοντέινερ, θα πρέπει να χρησιμοποιήσετε τη σημαία -a με την εντολή:
|
1 |
docker ps -a |
Για να βρείτε το τελευταίο κοντέινερ που δημιουργήσατε, μπορείτε να χρησιμοποιήσετε τη σημαία -l:
|
1 |
docker ps -l |
Για να σταματήσετε ένα εκτελούμενο/ενεργό κοντέινερ, εκτελέστε μια απλή εντολή:
|
1 |
docker stop container-id |
Μπορείτε να βρείτε το container-id στο αποτέλεσμα της εντολής Docker ps.
Βήμα 8: Δημοσίευση των Εικόνων σε ένα Αποθετήριο
Το επόμενο βήμα μετά τη δημιουργία της νέας εικόνας είναι να τη μοιραστείτε με τους φίλους σας. Μπορείτε επίσης να τη διαθέσετε σε όλο τον κόσμο χρησιμοποιώντας το Docker Hub ή οποιοδήποτε άλλο μητρώο. Απαιτείται να συνδεθείτε στο αντίστοιχο μητρώο πριν ανεβάσετε (push) την εικόνα.
Στο επόμενο μέρος του οδηγού, θα μάθετε πώς να ανεβάζετε τις εικόνες στο Docker Hub. Αρχικά, εγγραφείτε στο Docker Hub. Θα πρέπει να συνδεθείτε στο Docker Hub για να ανεβάσετε την εικόνα σας χρησιμοποιώντας την παρακάτω εντολή:
|
1 |
docker login -u docker-registry-username |
Μόλις εισαγάγετε τον σωστό κωδικό πρόσβασης και η ταυτοποίηση είναι επιτυχής, μπορείτε να ανεβάσετε την εικόνα σας. Για να ανεβάσετε την εικόνα, χρησιμοποιήστε την παρακάτω εντολή:
|
1 |
docker push docker-registry-username/docker-image-name |
Το αποτέλεσμα της εντολής θα είναι παρόμοιο με αυτό:
|
1 2 3 4 5 |
Output: The push refers to repository [docker.io/cloudsigma23/centos-mysql] ee30e80cbcc5: Pushed 2653d992f4ef: Mounted from library/centos ... |
Μόλις ανεβάσετε την εικόνα, θα πρέπει να εμφανιστεί στον πίνακα ελέγχου του λογαριασμού σας, όπως φαίνεται στην παρακάτω εικόνα:

Σε περίπτωση αποτυχίας με παρόμοιο τρόπο, είναι πιθανό να μην έχετε συνδεθεί:
|
1 2 3 4 5 6 7 |
Output: The push refers to repository [docker.io/cloudsigma23/centos-mysql] ee30e80cbcc5: Layer already exists 2653d992f4ef: Layer already exists errors: denied: requested access to the resource is denied unauthorized: authentication required |
Μπορείτε να συνδεθείτε και να επαναλάβετε την προσπάθεια push.
Συμπέρασμα
Υπάρχουν πολλοί τρόποι με τους οποίους μπορείτε να χρησιμοποιήσετε το Docker. Αυτός ο οδηγός θα πρέπει να σας παρέχει αρκετές πληροφορίες για να ξεκινήσετε. Και δεδομένου ότι το Docker είναι ένα πραγματικά δημοφιλές έργο, μπορείτε να βρείτε πολλές λεπτομέρειες σχετικά με τη χρήση καθώς και διαφορετικές περιπτώσεις χρήσης από τη σελίδα ιστολογίου του έργου.
Μπορείτε επίσης να δείτε τους άλλους οδηγούς μας για το Docker για να μάθετε περισσότερα σχετικά με το τι μπορείτε να κάνετε με το Docker:
- Καθαρισμός Πόρων Docker – Εικόνες, Κοντέινερ και Τόμοι
- Ανάπτυξη Laravel, Nginx και MySQL με το Docker Compose
- Εκτελέστε τον δικό σας διακομιστή VPN στο Docker με το OpenVPN Access Server
Καλή υπολογιστική!
Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.