NGUYEN XUAN CUONG

https://nxcuong.ued.vn

Bài 6 - Thực hành tạo môi trường cài đặt 1 website

Bài thực hành cài đặt các container php, httpd, mariadb và phymyadmin
Bài 6 - Thực hành tạo môi trường cài đặt 1 website

MÔ TẢ SƠ ĐỒ MÔI TRƯỜNG DOCKER CHO BÀI LAB


TRÊN MÁY HOST

Cài đặt docker trên Ubuntu 22.10

root@docker:~# sudo apt update -y
root@docker:~# sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
root@docker:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
root@docker:~# sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu kinetic stable"
root@docker:~# sudo apt update -y
root@docker:~# apt-cache policy docker-ce
root@docker:~# sudo apt install -y docker-ce
root@docker:~# sudo apt install docker-compose
root@docker:~# sudo systemctl status docker

Tải các image cần thiết về

root@docker:~# docker pull httpd
root@docker:~# docker pull php:7.4-fpm
root@docker:~# docker pull phpmyadmin
root@docker:~# docker pull mariadb

Kiểm tra các image đã được tải về
root@docker:~# docker images

Tạo các thư mục lưu trữ chung để mount vào các voulme hoặc container
  • Tạo thư mục chứa đựng source code thư mục này sẽ map với volume V-SOURCECODE
root@docker:~# mkdir /mnt/sourcecode
  • Tạo thư mục mariadb chứa đựng database thư mục này sẽ map với volume V-MARIADB
root@docker:~# mkdir /mnt/mariadb
  • Tạo thư mục logs chứa đựng database thư mục này sẽ map với volume V-LOGS
root@docker:~# mkdir /mnt/logs
  • Tạo thư mục tmp chứa đựng các file tạm thư mục này sẽ map với volume V-TMP
root@docker:~# mkdir /mnt/tmp
  • Tạo thư mục config và 4 thư mục con là httpd, php74, mariadb và nginx chứa đựng các file config của các dịch vụ thư mục này sẽ map với volume V-CONFIG
root@docker:~# mkdir /mnt/config
root@docker:~# cd /mnt/config
root@docker:~# mkdir httpd php74 mariadb nginx 

THỰC HIỆN TRÊN DOCKER

Tạo VOLUME

Thực hiện việc khởi tạo các volume để map các thư mục vào các volume này, các volume này sẽ được mount vào các container để dùng chung dữ liệu
  • Tạo volume sourcecode để mount vào container chứa source code
root@docker:~# docker volume create --opt device=/mnt/sourcecode --opt type=none --opt o=bind V-SOURCECODE
  • Tạo volume database để mount vào container chứa database
root@docker:~# docker volume create --opt device=/mnt/mariadb --opt type=none --opt o=bind V-MARIADB
  • Tạo volume TMP để mount vào container chứa các file temp
root@docker:~# docker volume create --opt device=/mnt/tmp --opt type=none --opt o=bind V-TMP
  • Tạo volume CONFIG để mount vào container chứa các file config như httpd.conf, my.cfg
root@docker:~# docker volume create --opt device=/mnt/config --opt type=none --opt o=bind V-CONFIG
  • Tạo volume LOGS để mount vào container chứa log của các ứng dụng
root@docker:~# docker volume create --opt device=/mnt/logs --opt type=none --opt o=bind V-LOGS
  • ​​​​​Kiểm tra các volume đã tạo
root@docker:~# docker volume ls

Tạo NETWORK

Tạo network riêng cho nhóm Container này
root@docker:~# docker network create --driver bridge NET-DAMP

Chạy container đầu tiên để lấy file mẫu chuẩn của các image

  • Lấy file httpd.conf của image httpd
root@docker:~# docker run --rm -v V-CONFIG:/root/ httpd cp /usr/local/apache2/conf/httpd.conf /root/httpd/
Tham số:
--rm : Xóa container ngay khi chạy xong
-v V-CONFIG:/root/ : ánh xạ Volume V-CONFIG đã tạo ở trên (trong thư mục này sẽ có 4 thư mục con là httpd php74 mariadb nginx) vào thư mục /root/ của container
httpd : image của container sử dụng
cp /usr/local/apache2/conf/httpd.conf /root/httpd/ : thực hiện lệnh copy file httpd.conf ở thư mục /usr/local/apache2/conf/ vào thư mục /root/httpd/ ( thư mục httpd là thư mục được mount vào từ V-CONFIG)
  • Lấy file my.cnf của image mariadb
root@docker:~# docker run --rm -v V-CONFIG:/root/ mariadb cp /etc/mysql/my.cnf /root/mariadb/
Tham số:
--rm : Xóa container ngay khi chạy xong
-v V-CONFIG:/root/ : ánh xạ Volume V-CONFIG đã tạo ở trên (trong thư mục này sẽ có 4 thư mục con là httpd php74 mariadb nginx) vào thư mục /root/ của container
mariadb : image của container sử dụng
cp /etc/mysql/my.cnf /root/mariadb/ : thực hiện lệnh copy file my.cnf ở thư mục /etc/mysql/ vào thư mục /root/mariadb/ ( thư mục mariadb là thư mục được mount vào từ V-CONFIG)
  • Lấy file php.ini của image php:7.4-fpm
root@docker:~# docker run --rm -v V-CONFIG:/root/ php:7.4-fpm cp /usr/local/etc/php/php.ini-production /root/php74/php.ini
Tham số:
--rm : Xóa container ngay khi chạy xong
-v V-CONFIG:/root/ : ánh xạ Volume V-CONFIG đã tạo ở trên (trong thư mục này sẽ có 4 thư mục con là httpd php74 mariadb nginx) vào thư mục /root/ của container
php:7.4-fpm : image của container sử dụng
cp /usr/local/etc/php/php.ini-production /root/php74/php.ini: thực hiện lệnh copy file php.ini-production ở thư mục /usr/local/etc/php/ vào thư mục /root/php74/ và đổi tên file thành php.ini ( thư mục php74 là thư mục được mount vào từ V-CONFIG)

Chỉnh sửa các tham số cho các file config

Ở phần trên chúng ta đã lấy các file config từ image gốc, lần lượt chúng ta chỉnh sửa các tham số phù hợp với môi trường ứng dụng
  • File config httpd.conf
AddHandler "proxy:fcgi://php74:9000" .php


LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so


ServerName localhost:80


DocumentRoot "/var/www/html/"
<Directory "/var/www/html/">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #
    AllowOverride all

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>



Tham số: 
php74 : Tên container chạy image php:7.4-fpm
9000 : Port của PHP-FPM dùng để kết nối với dịch vụ httpd
/var/www/html/ : Đường dẫn document root lưu source code, đường dẫn này sẽ mount Volume  V-SOURCECODE (V-SOURCECODE sẽ map với /mnt/sourcecode trên máy host)
AllowOverride all : Thay đổi hiện tại thành như hình
Require all granted: Thay đổi hiện tại thành như hình
 

TẠO CÁC CONTAINER VÀ MOUNT CÁC NETWORK VOLUME CẦN THIẾT

TẠO VÀ CẤU HÌNH CONTAINER PHP7.4-FPM
Tạo container php74
root@docker:~# docker run -d --name php74 -h php74 --network NET-DAMP -v V-SOURCECODE:/var/www/ -v V-LOGS:/var/log/ -v V-TMP:/tmp/ -v V-CONFIG:/root/ --restart=always php:7.4-fpm
Truy cap vao container php74
root@docker:~# docker exec -it php74 bash

Copy file đã cấu hình từ thư mục config thay thế file đã đổi tên
root@php74:/var/www/html# cp /root/php74/php.ini /usr/local/etc/php/

Exit container
root@php74:/var/www/html# Ctrl P + Q

Khởi động lại docker php để nạp cấu hình mới
root@docker:~# docker restart php74

TẠO VÀ CẤU HÌNH CONTAINER HTTPD1
Tạo container httpd1
root@docker:~# docker run -d --name httpd1 -h httpd --network NET-DAMP -v V-SOURCECODE:/var/www/ -v V-LOGS:/var/log/ -v V-TMP:/tmp/ -v V-CONFIG:/root/ -p 8081:80 --restart=always httpd

Truy cap vao container httpd1
root@docker:~# docker exec -it httpd1 bash

Copy file đã cấu hình từ thư mục config thay thế file đã đổi tên
root@httpd:/usr/local/apache2# mv /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.origin
root@httpd:/usr/local/apache2# cp /root/httpd/httpd.conf /usr/local/apache2/conf/

Exit container
root@httpd:/usr/local/apache2# Ctrl P + Q

Khởi động lại docker php để nạp cấu hình mới
root@docker:~# docker restart httpd1

Kiểm tra cấu hình kết nối httpd vào php
- Tạo 1 file test.php trong thư mục DocumentRoot với nội dung như dưới
<?php

// Show all information, defaults to INFO_ALL
phpinfo();

// Show just the module information.
// phpinfo(8) yields identical results.
phpinfo(INFO_MODULES);

?>
- Truy cập vào địa chỉ dưới xem việc kết nối httpd và php-fpm thành công hay không
http://10.1.18.5:8081/test.php


TẠO VÀ CHẠY CONTAINER MARIADB
root@docker:~# docker run -d --name mariadb -h mariadb --network NET-DAMP -p 3306:3306 -v V-MARIADB:/var/lib/mysql -v V-LOGS:/var/log/ -v V-TMP:/tmp/ -v V-CONFIG:/root/ -e MYSQL_ROOT_PASSWORD=Abc123456 --restart=always mariadb

Truy cập vào Container mariadb
root@docker:~# docker exec -it mariadb bash    
          
Kết nối vào MySQL Server
root@mariadb:/# mysql -uroot -pAbc123456

Từ dấu nhắc MySQL, Tạo một user tên wordpress với password là wordpress123
MariaDB [(none)]> CREATE USER 'wordpress'@'%' IDENTIFIED BY 'wordpress123';

Tạo db có tên db_testdb
MariaDB [(none)]> create database db_wordpress CHARACTER SET utf8 COLLATE utf8_general_ci;

Cấp quyền cho user wordpress trên database db_wordpress
MariaDB [(none)]> GRANT ALL PRIVILEGES ON db_wordpress.* TO 'wordpress'@'%';

Flush lại đatabase
MariaDB [(none)]> flush privileges;

 Xem các database đang có, kết quả có db bạn vừa tạo
MariaDB [(none)]> show databases;          

Kiểm tra user
MariaDB [(none)]> select host, user, password from mysql.user;

Ra khỏi MySQL Server
MariaDB [(none)]> exit

Thoát khỏi Container Docker
root@mariadb:/# Ctrl P + Q

TẠO VÀ CHẠY CONTAINER PHPMYADMIN
root@docker:~# docker run -d --name phpmyadmin -h phymyadmin --network NET-DAMP -p 8004:80 -e PMA_HOST=mariadb --restart=always phpmyadmin

Truy cập vào địa chỉ 10.0.1.18:8004 để vào phpmyadmin

Đăng nhập với tài khoản root với pasword là Abcd123456 của Mariadb đã tạo ở Container

Các tham số của các bước khởi chạy Container
--network NET-LAMP container sẽ kết nối với mạng có tên www-net (cùng mạng với c-php, c-httpd)
-e MYSQL_ROOT_PASSWORD=Abc123456 đặt password cho user root, quản trị mysql là Abc123456
-v MARIADB:/var/lib/mysql nơi lưu trữ các database là ở thư mục /mnt/mariadb của máy Host được mount vào volume MARIADB đã tạo ở trên, làm điểu này để có không mất db khi cần xóa container, hoặc khi cần sử dụng lại các db cũ.
--name php74 : tên của cotainer là php74
-h php74    : hostname của container là php74
-e PMA_HOST=mariadb : kết nối phpmyadmin vào container sql có tên là mariadb (tham số -e để thiết lập biến môi trường)
--restart=always : Docker tự khởi động Container nếu Container bị dừng

TẢI SOUCE CODE WORDPRESS VÀ CÀI ĐẶT WORDPRESS THEO MÔI TRƯỜNG ĐÃ THIẾT LẬP
Di chuyển vào thư mục source trên máy host
root@docker:~# cd /mnt/sourcecode/

Tải phiên bản wordpress mới nhất về
root@docker:/mnt/sourcecode# wget https://vi.wordpress.org/latest-vi.tar.gz

Giải nén file latest-vi.tar.gz sẽ có thư mục wordpress,
root@docker:/mnt/sourcecode# tar -zxvf latest-vi.tar.gz

Copy thư mục wordpress và đổi tên thành docker-wp.nxcuong.ued.udn.vn
root@docker:/mnt/sourcecode# cp -rp wordpress docker-wp.nxcuong.ued.vn

Thêm file virtual host với tên miền là docker-wp.nxcuong.ued.vn vào cuối file httpd.conf
<VirtualHost *:80>
    ServerName docker-wp.nxcuong.ued.vn
    ServerAdmin nxcuong@ued.udn.vn
    DocumentRoot /var/www/docker-wp.nxcuong.ued.vn/
    CustomLog /dev/null combined
    #LogLevel Debug
    ErrorLog /var/log/docker-wp.nxcuong.ued.vn.error.log
    <Directory /var/www/docker-wp.nxcuong.ued.vn/>
        Options -Indexes -ExecCGI +FollowSymLinks -SymLinksIfOwnerMatch
        DirectoryIndex index.php
        Require all granted
        AllowOverride None
    </Directory>
</VirtualHost>

Vào docker httpd1
root@docker:/mnt/sourcecode# docker exec -it httpd1 bash

Copy đè file httpd.conf lên file hiện tại
root@httpd:/usr/local/apache2# cp /root/httpd/httpd.conf /usr/local/apache2/conf/

Gán quyền cho user www-data và group www-data cho thư mục docker-wp.nxcuong.ued.vn
root@httpd:/usr/local/apache2# chown -R www-data.www-data /var/www/docker-wp.nxcuong.ued.vn/

Thoát container
root@httpd:/usr/local/apache2# Ctrl + P + Q

Khởi động lại container httpd1
root@docker:~# docker restart httpd1

Sau khi khai báo xong truy cập vào domain đã tạo là http://docker-wp.nxcuong.ued.vn:8081
trên PHP chúng ta thiếu extention mysqli


CÀI CÁC EXTENTION CỦA PHP
- Truy cập vào container php74
root@docker:~# docker exec -it php74 bash

- Extention Opcache
root@php74:/var/www/html# docker-php-ext-configure opcache --enable-opcache \
    && docker-php-ext-install opcache

- Extention Mysqli
root@php74:/var/www/html# docker-php-ext-install mysqli && docker-php-ext-enable mysqli

- Extention pdo_mysql
root@php74:/var/www/html# docker-php-ext-install pdo_mysql && docker-php-ext-enable pdo_mysql

Thoát container php74 và restart lại
root@php74:/var/www/html# Ctrl + P + Q
root@docker:~# docker restart php74


QUAY LẠI TRANG CÀI ĐẶT WORDPRESS VÀ BẤM F5 ĐỂ TẢI LẠI CẤU HÌNH MỚI CÓ CÁC EXTENTION PHP
 
 
 
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây