GusG
5 years ago
3 changed files with 319 additions and 0 deletions
@ -0,0 +1,64 @@ |
|||||
|
= DOC |
||||
|
|
||||
|
Αφού έχουμε εγκαταστήσει τα απαραίτητα προγράμματα δημιουργούμε το Makefile το οποίο θα περιέχει τις εντολές δημιουργίας του image καθώς και το deploy του docker-compose στο swarm. |
||||
|
|
||||
|
To Makefile περιέχει τις εντολές: |
||||
|
[source, sh] |
||||
|
---- |
||||
|
echo -e "\e[31mBuilding our nginx image!" |
||||
|
sleep 2 |
||||
|
echo -e "\e[39m" |
||||
|
docker build -f Dockerfile -t anginx . |
||||
|
echo -e "\e[31mDeploying service" |
||||
|
sleep 2 |
||||
|
echo -e "\e[39m" |
||||
|
docker stack deploy -c docker-compose.yml wordpress |
||||
|
---- |
||||
|
|
||||
|
Στη συνέχεια εκτελούμε την εντολή [underline]#chmod +x Makefile# ώστε να δώσουμε τα απραίτητα δικαιώματα στο αρχείο. |
||||
|
|
||||
|
Για να το εκτελέσουμε τρέχουμε το ./Makefile |
||||
|
|
||||
|
[TIP] |
||||
|
O manager ελέγχει ότι όλες οι υπηρεσίες τρέχουν σωστά με την εντολή [underline]#docker service ls# |
||||
|
|
||||
|
== Testing |
||||
|
=== WordPress |
||||
|
:nofooter: |
||||
|
Προκειμένου να δούμε real-time τα αποτελέσματα του WordPress, βάζουμε στον browser μια από τις ακόλουθες IPv4: |
||||
|
|
||||
|
*83.212.77.39* |
||||
|
|
||||
|
*83.212.77.27* |
||||
|
|
||||
|
*83.212.77.24* |
||||
|
|
||||
|
*83.212.77.25* |
||||
|
|
||||
|
image::https://i.imgur.com/ecBF9WN.png[] |
||||
|
|
||||
|
=== PHPMyAdmin |
||||
|
Προκειμένου να δούμε real-time τα αποτελέσματα του PHPMyAdmin, βάζουμε στον browser μια από τις ακόλουθες IPv4: |
||||
|
|
||||
|
*83.212.77.39:8080* |
||||
|
|
||||
|
*83.212.77.27:8080* |
||||
|
|
||||
|
*83.212.77.24:8080* |
||||
|
|
||||
|
*83.212.77.25:8080* |
||||
|
|
||||
|
image::https://i.imgur.com/BG2Vxt9.png[] |
||||
|
|
||||
|
=== Minio |
||||
|
Προκειμένου να δούμε real-time τα αποτελέσματα του Minio, βάζουμε στον browser μια από τις ακόλουθες IPv4: |
||||
|
|
||||
|
*83.212.77.39:9001-9004* |
||||
|
|
||||
|
*83.212.77.27:9001-9004* |
||||
|
|
||||
|
*83.212.77.24:9001-9004* |
||||
|
|
||||
|
*83.212.77.25:9001-9004* |
||||
|
|
||||
|
image::https://i.imgur.com/Kaz7KTR.png[] |
@ -0,0 +1,57 @@ |
|||||
|
= INSTALL |
||||
|
|
||||
|
Για την εκτέλεση της εργαστηριακής άσκησης χρησιμοποιήσαμε τις υπηρεσίες του https://cyclades.okeanos-knossos.grnet.gr[~okeanos] |
||||
|
|
||||
|
Πιο συγκεκριμένα, χρησιμοποιήσαμε ένα VM με τα ακόλουθα χαρακτηριστικά |
||||
|
|
||||
|
image::https://i.imgur.com/GwwJuvU.png[] |
||||
|
image::https://i.imgur.com/MH8dQzS.png[] |
||||
|
|
||||
|
___ |
||||
|
|
||||
|
|
||||
|
== Docker Swarm Initialization |
||||
|
:nofooter: |
||||
|
Προκειμένου να δημιουργήσουμε το σμήνος (swarm) ο manager έτρεξε την εντολή |
||||
|
|
||||
|
[source, console] |
||||
|
---- |
||||
|
docker swarm init --advertise-addr 83.212.77.39 |
||||
|
---- |
||||
|
|
||||
|
Οι workers για να συνδεθούν στο _swarm_ (σμήνος) πρέπει να εκτελέσουν |
||||
|
[source, console] |
||||
|
---- |
||||
|
docker swarm join --token SWMTKN-1-433emh74ij7y4loql5z5js9t7ptxkfdgwwsdzq18p3ag7uxswt-9ah0x5cwf6xnl1djgyet0x si 83.212.77.39:2377 |
||||
|
---- |
||||
|
|
||||
|
[TIP] |
||||
|
Για να εμφανιστεί το join token ο manager τρέχει την εντολή |
||||
|
|
||||
|
[source, console] |
||||
|
---- |
||||
|
docker swarm join-token worker |
||||
|
---- |
||||
|
|
||||
|
== Working Directory |
||||
|
|
||||
|
Στη συνέχεια δημιουργούμε το working directory μας με την εντολή |
||||
|
|
||||
|
[source, console] |
||||
|
---- |
||||
|
mkdir docker |
||||
|
---- |
||||
|
|
||||
|
[TIP] |
||||
|
Αν κάνουμε _pwd_ θα δούμε ότι βρισκόμαστε στο directory /home/user/docker |
||||
|
|
||||
|
Όλοι οι χρήστες θα πρέπει να έχουν στον συγκεκριμένο φάκελο τα αρχεία nginx.conf & cert.pem & key.pem |
||||
|
|
||||
|
---- |
||||
|
|_ home |
||||
|
|_ user |
||||
|
|_ docker |
||||
|
|_ nginx.conf |
||||
|
|_ cert.pem |
||||
|
|_ key.pem |
||||
|
---- |
@ -0,0 +1,198 @@ |
|||||
|
= README |
||||
|
|
||||
|
Για να συνδεθούμε στην εικονική μηχανή τρέχουμε την εντολή. |
||||
|
|
||||
|
[source, console] |
||||
|
---- |
||||
|
ssh user@<ip> |
||||
|
password: **** |
||||
|
---- |
||||
|
|
||||
|
image::https://i.imgur.com/P4ViujF.png[] |
||||
|
|
||||
|
[CAUTION] |
||||
|
Πρέπει να είστε συνδεδεμένοι στο https://wiki.noc.uniwa.gr/doku.php?id=vpn_service_openvpn[VPN - Πανεπιστημίου Δυτικής Αττικής] |
||||
|
|
||||
|
== Τεχνολογίες |
||||
|
|
||||
|
Για την υλοποίηση της εργασίας χρησιμοποιήθηκε η τεχνολογία *Docker* το οποίο εικονικοποιεί σε επίπεδο λειτουργικού συστήματος. |
||||
|
|
||||
|
[source, console] |
||||
|
---- |
||||
|
sudo apt-get update |
||||
|
sudo apt install docker.io |
||||
|
sudo systemctl start docker |
||||
|
sudo systemctl enable docker |
||||
|
---- |
||||
|
|
||||
|
[TIP] |
||||
|
Για να ελέγξουμε ότι η υπηρεσία του *Docker* λειτουργεί εκτελούμε την εντολή |
||||
|
|
||||
|
[source, console] |
||||
|
---- |
||||
|
docker --version |
||||
|
---- |
||||
|
|
||||
|
== Εκτέλεση Εργασίας |
||||
|
|
||||
|
Αρχικά, δημιουργούμε το δικό μας image για τον *nginx* ανάλογα με τις ανάγκες της υπηρεσίας μας. |
||||
|
|
||||
|
Το αποθηκεύουμε σε ένα αρχείο ονομάζοντας το [underline]#Dockerfile# |
||||
|
|
||||
|
Επόμενο βήμα είναι η εκτέλεση της παρακάτω εντολής για τη δημιουργία του image |
||||
|
|
||||
|
[source, console] |
||||
|
---- |
||||
|
docker build -f Dockerfile -t anginx . |
||||
|
---- |
||||
|
|
||||
|
[NOTE] |
||||
|
==== |
||||
|
Οptions: |
||||
|
|
||||
|
* -f προσδιορίζει το αρχείο για το build |
||||
|
* -t tag (το όνομα του image) |
||||
|
* "." είναι το current directory |
||||
|
==== |
||||
|
|
||||
|
Όλα τα services τα οποία θα τρέξουν στην εργασία μας βρίσκονται στο αρχείο [underline]#docker-compose.yml# |
||||
|
|
||||
|
Αναλυτικά: |
||||
|
|
||||
|
=== Nginx |
||||
|
|
||||
|
[source, yml] |
||||
|
---- |
||||
|
nginx: |
||||
|
image: anginx #image from docker building my Dockerfile (docker build -f Dockerfile -t anginx .) // <1> |
||||
|
container_name: production_nginx // <2> |
||||
|
volumes: // <3> |
||||
|
- /home/user/docker/nginx.conf:/etc/nginx/conf.d/default.conf |
||||
|
- /home/user/docker/cert.pem:/etc/nginx/public.crt |
||||
|
- /home/user/docker/key.pem:/etc/nginx/private.key |
||||
|
ports: // <4> |
||||
|
- 9080:80 |
||||
|
- 9443:443 |
||||
|
networks: // <5> |
||||
|
- main_net |
||||
|
---- |
||||
|
|
||||
|
=== MariaDB |
||||
|
[source, yml] |
||||
|
---- |
||||
|
mariadb: |
||||
|
image: mariadb // <1> |
||||
|
container_name: mariadb // <2> |
||||
|
volumes: // <3> |
||||
|
- db_data:/var/lib/mysql |
||||
|
environment: // <8> |
||||
|
MYSQL_ROOT_PASSWORD: wordpress |
||||
|
MYSQL_DATABASE: wordpress |
||||
|
networks: // <5> |
||||
|
- main_net |
||||
|
---- |
||||
|
|
||||
|
=== WordPress |
||||
|
[source, yml] |
||||
|
---- |
||||
|
wordpress: |
||||
|
image: wordpress:latest // <1> |
||||
|
container_name: wordpress // <2> |
||||
|
restart: always |
||||
|
deploy: #create replicas with specific resources // <6> |
||||
|
mode: replicated |
||||
|
replicas: 2 |
||||
|
# max_replicas_per_node: 1 |
||||
|
resources: |
||||
|
limits: #max resources |
||||
|
cpus: '0.50' |
||||
|
memory: 50M |
||||
|
reservations: #default resources |
||||
|
cpus: '0.25' |
||||
|
memory: 20M |
||||
|
ports: // <4> |
||||
|
- 80:80 |
||||
|
volumes: // <3> |
||||
|
- wp-app:/var/www/html |
||||
|
environment: // <8> |
||||
|
WORDPRESS_DB_HOST: mariadb:3306 |
||||
|
WORDPRESS_DB_NAME: wordpress |
||||
|
WORDPRESS_DB_USER: root |
||||
|
WORDPRESS_DB_PASSWORD: wordpress |
||||
|
networks: // <5> |
||||
|
- main_net |
||||
|
depends_on: // <7> |
||||
|
- mariadb |
||||
|
---- |
||||
|
|
||||
|
=== PHPMyAdmin |
||||
|
[source, yml] |
||||
|
---- |
||||
|
phpmyadmin: |
||||
|
image: phpmyadmin/phpmyadmin // <1> |
||||
|
container_name: phpmyadmin // <2> |
||||
|
deploy: // <6> |
||||
|
mode: replicated |
||||
|
replicas: 2 |
||||
|
# max_replicas_per_node: 1 |
||||
|
resources: |
||||
|
limits: |
||||
|
cpus: '0.50' |
||||
|
memory: 50M |
||||
|
reservations: |
||||
|
cpus: '0.25' |
||||
|
memory: 20M |
||||
|
environment: // <8> |
||||
|
PMA_HOST: mariadb |
||||
|
MYSQL_ROOT_PASSWORD: wordpress |
||||
|
PMA_PORT: 3306 |
||||
|
ports: // <4> |
||||
|
- 8080:80 |
||||
|
networks: // <5> |
||||
|
- main_net |
||||
|
---- |
||||
|
|
||||
|
=== Minio |
||||
|
[source, yml] |
||||
|
---- |
||||
|
minio1: |
||||
|
image: minio/minio:RELEASE.2020-04-10T03-34-42Z // <1> |
||||
|
hostname: minio1 |
||||
|
volumes: // <3> |
||||
|
- minio1-data:/export |
||||
|
ports: // <4> |
||||
|
- "9001:9000" |
||||
|
networks: // <5> |
||||
|
- minio_distributed |
||||
|
deploy: // <6> |
||||
|
restart_policy: |
||||
|
delay: 10s |
||||
|
max_attempts: 10 |
||||
|
window: 60s |
||||
|
placement: |
||||
|
constraints: |
||||
|
- node.labels.minio1==true |
||||
|
command: server http://minio{1...4}/export |
||||
|
environment: // <8> |
||||
|
MINIO_ACCESS_KEY: AKIAIOSFODNN7EXAMPLE |
||||
|
MINIO_SECRET_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
||||
|
# secrets: |
||||
|
# - secret_key |
||||
|
# - access_key |
||||
|
healthcheck: |
||||
|
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] |
||||
|
interval: 30s |
||||
|
timeout: 20s |
||||
|
retries: 3 |
||||
|
---- |
||||
|
|
||||
|
=== Configuration Options: |
||||
|
:nofooter: |
||||
|
<1> image: Το image file από το οποίο θα τρέξει το service |
||||
|
<2> container_name: Είναι το όνομα του service |
||||
|
<3> volumes: "Mount host paths or named volumes from our VM to the service" |
||||
|
<4> ports: Είναι τα ports τα οποία κάνουμε expose "στον έξω" κόσμο |
||||
|
<5> networks: Είναι το εικονικό δίκτυο στο οποίο θα τρέξει το service |
||||
|
<6> deploy: Κάνουμε specify τα resources και τον αριθμό των replicas που θα τρέξουν |
||||
|
<7> depends_on: "Express dependency between services" |
||||
|
<8> environment: "Add environment variables" |
Loading…
Reference in new issue