Πανεπιστήμιο Δυτικής Αττικής Τμήμα Μηχανικών Πληροφορικής και Υπολογιστών # Υπολογιστική Νέφους και Υπηρεσίες ## Θέμα: Wordpress #### Στόχος: Δημιουργία docker swarm #### Υπ. Καθηγητής: Α. Αναγνωστόπουλος | Ομάδα | AM | | ---- | ---- | |Οζμπούρσαλη Φωτεινή - manager | 131039 | |Κερασιώτης Αθανάσιος - worker | 131113 | |Αγαθαγγελίδη Αικατερίνη - worker | 151108| |Μητρόπουλος Ιωάννης - worker | 151015 | ------ ### 1. Χρήση παραδείγματος github ``` wget -r -np https://github.com/gabidavila/docker-wordpress-ssl-nginx-mysql ``` ### 2. Έλεγχος swarm *Εκτέλεση* ``` docker node ls ``` *Αποτελέσματα* ``` ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION ob89puh8bz9n5cdxrsppmug2z snf-12364 Ready Active 19.03.8 9gx538gc60i9vzda7j5ct31al * snf-12366 Ready Active Leader 19.03.8 6cgh0yeqa65r53n7fabw9079f snf-12565 Ready Active 18.09.7 tjxyrlr4zlj6xgxcsz6gbf6s7 snf-12591 Ready Active 18.09.7 ``` ### 3. Δημιουργία και εκτέλεση Dockerfile *Δημιουργία:* ``` # =============================================================================== # Dockerfile # "Wordpress + Nginx + Cached + NoDB" docker image - production ready # # What's it included: # # - php-fpm # - Wordpress - build with the **latest** version # - Nginx - as reverse proxy, HTTP / HTTPS enabled. # - Cache - fastcgi-cache, fastcgi_cache_purge, Opcache # - No DB included. # # Optional # # - Deploy `letsencrypt` SSL. # - Deploy normal SSL. # # @link https://letsencrypt.org/ | letsencrypt # # It is based on Ubuntu 14.04 LTS # =============================================================================== # Set the base image to Ubuntu FROM ubuntu:14.04 # File Author / Maintainer MAINTAINER Lei SHI # Default HTTP and HTTPS and MySQL ports EXPOSE 80 443 3306 # =============================================================================== # Env. Setup # # Keep upstart from complaining RUN dpkg-divert --local --rename --add /sbin/initctl && \ ln -sf /bin/true /sbin/initctl # Let the container know that there is no tty ENV DEBIAN_FRONTEND noninteractive # Update the repository sources list and finish upgrade RUN apt-get update && apt-get -y upgrade # ---------------------------------------------------------- # Dependencies # ---------------------------------------------------------- # Basic Dependencies # # The basic dependecies includes: # # - PHP & fpm # - MySQL client # - curl # - Git # - pwgen - Open-Source Password Generator # - python-setuptools - for `easy_install` # RUN apt-get install -y mysql-client-5.6 \ mysql-server-5.6 \ php5-fpm \ php5-mysql \ pwgen \ python-setuptools \ curl \ git \ unzip # **Wordpress** Dependencies RUN apt-get install -y php5-curl \ php5-gd \ php5-intl \ php-pear \ php5-imagick \ php5-imap \ php5-mcrypt \ php5-memcache \ php5-ming \ php5-ps \ php5-pspell \ php5-recode \ php5-sqlite \ php5-tidy \ php5-xmlrpc \ php5-xsl ### ---- FIX ----- # Fix 'add-apt-repository: not found' in Ubuntu 14.04 LTS RUN apt-get -y install software-properties-common \ python-software-properties # ---------------------------------------------------------- # Nginx # # Nginx compiled with `fastcgi_cache` and `fastcgi_cache_purge` # # @link https://easyengine.io/wordpress-nginx/tutorials/single-site/fastcgi-cache-with-purging/ # ---------------------------------------------------------- RUN add-apt-repository ppa:rtcamp/nginx && \ apt-get update && \ apt-get remove nginx* && \ apt-get install -y nginx-custom ############################################################ # Configurations # # ---------------------------------------------------------- # MySQL Config # ---------------------------------------------------------- # RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf COPY config/my.cnf /etc/mysql/my.cnf # ---------------------------------------------------------- # Nginx Config # ---------------------------------------------------------- # Create uer for Nginx running RUN adduser --system --no-create-home --shell /bin/false --group --disabled-login www-front # Copy config files to `/etc/nginx/` folder COPY config/nginx.conf /etc/nginx/nginx.conf COPY config/nginx-site-http.conf /etc/nginx/nginx-site-http.conf COPY config/nginx-site-https.conf /etc/nginx/nginx-site-https.conf # Default **site** config - HTTP # Later if need to enforce SSL, use `nginx-site-http.conf` instead. COPY config/nginx-site-http.conf /etc/nginx/sites-available/default COPY config/nginx-ssl.conf /etc/nginx/ssl-template.conf COPY config/nginx-restrictions.conf /etc/nginx/restrictions.conf # ---------------------------------------------------------- # PHP-fpm Config # ---------------------------------------------------------- RUN sed -i -e "s/;cgi.fix_pathinfo\s*=\s*1/cgi.fix_pathinfo = 0/g; s/expose_php\s*=\s*On/expose_php = Off/g" \ /etc/php5/fpm/php.ini RUN sed -i -e "s/expose_php\s*=\s*On/expose_php = Off/g" /etc/php5/fpm/php.ini RUN sed -i -e "s/upload_max_filesize\s*=\s*2M/upload_max_filesize = 100M/g; s/post_max_size\s*=\s*8M/post_max_size = 100M/g" \ /etc/php5/fpm/php.ini #RUN sed -i -e "s/post_max_size\s*=\s*8M/post_max_size = 100M/g" /etc/php5/fpm/php.ini RUN sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf RUN sed -i -e "s/;catch_workers_output\s*=\s*yes/catch_workers_output = yes/g; s/listen\s*=\s*\/var\/run\/php5-fpm.sock/listen = 127.0.0.1:9000/g; s/;listen.allowed_clients\s*=\s*127.0.0.1/listen.allowed_clients = 127.0.0.1/g" \ /etc/php5/fpm/pool.d/www.conf #RUN sed -i -e "s/listen\s*=\s*\/var\/run\/php5-fpm.sock/listen = 127.0.0.1:9000/g" /etc/php5/fpm/pool.d/www.conf #RUN sed -i -e "s/;listen.allowed_clients\s*=\s*127.0.0.1/listen.allowed_clients = 127.0.0.1/g" /etc/php5/fpm/pool.d/www.conf # ---------------------------------------------------------- # Opcode Config # ---------------------------------------------------------- RUN sed -i -e"s/^;opcache.enable\s*=\s*0/opcache.enable = 1/; s/^;opcache.max_accelerated_files\s*=\s*2000/opcache.max_accelerated_files = 4000/" /etc/php5/fpm/php.ini #RUN sed -i -e"s/^;opcache.max_accelerated_files\s*=\s*2000/opcache.max_accelerated_files = 4000/" /etc/php5/fpm/php.ini # =============================================================================== # Install & Config Supervisor # # Supervisor is a process manager which makes managing a number of long-running programs a trivial task # by providing a consistent interface through which they can be monitored and controlled. # # it uses `easy_install` (from `python-setuptools`) to install **supervisor**. # # @link http://supervisord.org/# # RUN /usr/bin/easy_install supervisor && \ /usr/bin/easy_install supervisor-stdout COPY config/supervisord.conf /etc/supervisord.conf # =============================================================================== # Install Wordpress # # Get the code of **latest** version. RUN cd /usr/share/nginx/ && \ curl -o wp-latest.tar.gz https://wordpress.org/latest.tar.gz && \ tar -xvf wp-latest.tar.gz && \ rm wp-latest.tar.gz # Target **webroot** - `/usr/share/nginx/www` RUN rm -rf /usr/share/nginx/www && \ mv /usr/share/nginx/wordpress /usr/share/nginx/www && \ chown -R www-data:www-data /usr/share/nginx/www # =============================================================================== # System Initialization # ## Copy the **pre-defined** bash script COPY bash/init.sh /init.sh ## Modify the permisison - make sure they are excuatable RUN chmod 755 /init.sh # Set up default CMD CMD ["/bin/bash", "/init.sh"] # =============================================================================== # Copy "optional" scripts # # Under `/addon` folder. # # `letsencrypt` SSL related # @link https://letsencrypt.org/ | letsencrypt COPY bash/ssl-letsencrypt.sh /addon/letsencrypt/ssl-letsencrypt.sh # Normal SSL related COPY bash/ssl.sh /addon/ssl.sh # Install WP plugins COPY bash/wp-install-plugins.sh /addon/wp-install-plugins.sh # =============================================================================== # Volume Mounting # # - Wprdpress webroot # - Log # # Mount the volumns VOLUME ["/var/lib/mysql", "/usr/share/nginx/www", "/var/log"] ``` *Εκτέλεση:* ``` chmod +x ./Dockerfile ./Dockerfile docker images ``` ### 4. Δημιουργία docker-compose.yml ``` version: '3.7' services: db: image: mariadb volumes: - db_data:/var/lib/mysql ports: - "3306:3306" networks: - wp-net restart: always environment: MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress deploy: placement: constraints: [node.role == worker] replicas: 1 update_config: delay: 10s restart_policy: condition: on-failure wordpress: depends_on: - db image: wordpress:latest ports: - "9000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: - wordpress:/var/www/html networks: - wp-net deploy: placement: constraints: [node.role == worker] replicas: 1 resources: limits: #max resources cpus: '0.50' memory: 50M reservations: #default resources cpus: '0.25' memory: 20M update_config: delay: 10s restart_policy: condition: on-failure nginx: image: nginx ports: - 80:80 - 443:443 volumes: - wordpress:/var/www/html - ./nginx.conf:/etc/nginx/conf.conf depends_on: - wordpress networks: - wp-net deploy: mode: replicated replicas: 1 restart_policy: condition: on-failure minio1: image: minio/minio:RELEASE.2020-06-03T22-13-49Z hostname: minio1 volumes: - minio1-data:/export ports: - "9005:9000" networks: - minio_distributed deploy: restart_policy: delay: 10s max_attempts: 10 window: 60s placement: constraints: - node.labels.minio1==true command: server http://minio{1...4}/export secrets: - secret_key - access_key healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 minio2: image: minio/minio:RELEASE.2020-06-03T22-13-49Z hostname: minio2 volumes: - minio2-data:/export ports: - "9006:9000" networks: - minio_distributed deploy: restart_policy: delay: 10s max_attempts: 10 window: 60s placement: constraints: - node.labels.minio2==true command: server http://minio{1...4}/export secrets: - secret_key - access_key healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 minio3: image: minio/minio:RELEASE.2020-06-03T22-13-49Z hostname: minio3 volumes: - minio3-data:/export ports: - "9007:9000" networks: - minio_distributed deploy: restart_policy: delay: 10s max_attempts: 10 window: 60s placement: constraints: - node.labels.minio3==true command: server http://minio{1...4}/export secrets: - secret_key - access_key healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 minio4: image: minio/minio:RELEASE.2020-06-03T22-13-49Z hostname: minio4 volumes: - minio4-data:/export ports: - "9008:9000" networks: - minio_distributed deploy: restart_policy: delay: 10s max_attempts: 10 window: 60s placement: constraints: - node.labels.minio4==true command: server http://minio{1...4}/export secrets: - secret_key - access_key healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 volumes: minio1-data: minio2-data: minio3-data: minio4-data: db_data: wordpress: networks: wp-net: minio_distributed: driver: overlay secrets: secret_key: external: true access_key: external: true ``` ### 5. Swarm deploy ``` docker stack deploy -c docker-compose.yml wordpress docker service ls ``` *Αποτελέσματα* ``` vihqdyawjc10 nefos_db replicated 1/1 mariadb:latest *:3306->3306/tcp y7nbv60la2sg nefos_minio1 replicated 1/1 minio/minio:RELEASE.2020-06-03T22-13-49Z *:9005->9000/tcp 0bcjccvpagd2 nefos_minio2 replicated 1/1 minio/minio:RELEASE.2020-06-03T22-13-49Z *:9006->9000/tcp 17vpuld32qui nefos_minio3 replicated 0/1 minio/minio:RELEASE.2020-06-03T22-13-49Z *:9007->9000/tcp 0mbyzsuq5gvq nefos_minio4 replicated 0/1 minio/minio:RELEASE.2020-06-03T22-13-49Z *:9008->9000/tcp 8izloz68b9ky nefos_nginx replicated 1/1 nginx:latest *:80->80/tcp, *:443->443/tcp 2cbg82sytzbg nefos_wordpress replicated 1/1 wordpress:latest *:9000->80/tcp ``` ### 6. Nginx configuration ``` server { listen 80; server_name localhost; root /var/www/html; index index.php; access_log /var/log/nginx/wordpress-access.log; error_log /var/log/nginx/wordpress-error.log; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass wordpress:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } ``` ### 7. Update Minio nodes ``` docker node update --label-add minio1=true snf-12364 docker node update --label-add minio2=true snf-12366 docker node update --label-add minio3=true snf-12565 docker node update --label-add minio4=true snf-12591 docker node update --label-add group=minio snf-12364 docker node update --label-add group=minio snf-12565 ```