NGUYEN XUAN CUONG

http://nxcuong.ued.vn

Bài 6 1 - Thực hành tạo ra 3 container, chạy 3 dịch vụ khác nhau là httpd, php-fpm, mysql

Sau đây sẽ thực hành tạo ra 3 container, chạy 3 dịch vụ khác nhau là httpd, php-fpm, mysql. Tạo một mạng bridge để liên kết những container này với nhau (giao tiếp với nhau qua cổng nội bộ httpd:80, php-fpm:9000, mysql:443). Trong đó thiết lập thêm httpd mở cổng public 8080 để ánh xạ vào 80 của nó.
Bài 6 1 - Thực hành tạo ra 3 container, chạy 3 dịch vụ khác nhau là httpd, php-fpm, mysql
Sau đây sẽ thực hành tạo ra 3 container, chạy 3 dịch vụ khác nhau là httpd, php-fpm, mysql. Tạo một mạng bridge để liên kết những container này với nhau (giao tiếp với nhau qua cổng nội bộ httpd:80, php-fpm:9000, mysql:443). Trong đó thiết lập thêm httpd mở cổng public 8080 để ánh xạ vào 80 của nó.

Cài đặt PHP trên Docker

Chọn cài đặt php:7.4-fpm (các phiên bản khác tương tự) đây là PHP 7.4 cài đặt sẵn PHP-FPM, mặc định cho phép apache gọi đến PHP thông qua proxy với cổng 9000, xem thêm Apache Handler PHP Handler, phù hợp để tạo một container riêng chuyên chạy PHP.

Tải image php:7.4-apache
root@docker:~# docker pull php:7.4-fpm

Tạo một container chạy PHP từ image php:7.4-fpm, đặt tên container này là Php74
root@docker:~# docker run -d --name "Php74" -h Php74 -v WWW:/var/www/ php:7.4-fpm

Các tham số tạo, chạy container như đã biết trong phần trước, ở đây cụ thể là:
  • -d : container sau khi tạo chạy luôn ở chế độ nền.
  • --name Php74 : container tạo ra và đặt luôn cho nó tên là Php74 (Tương tác với container dễ đọc hơn khi sử dụng tên thay vì phải sử dụng mã hash id, nếu không đặt tên thì docker sinh ra tên ngẫu nhiên).
  • -h Php74 đặt tên HOSTNAME của container là Php74
  • -v WWW:/var/www/ thư mục trên máy host /mnt/www (với Windows đường dẫn theo OS này như "c:\path\xxx\xxxx") được gắn vào container bởi volume WWW đã tạo ở bài 4
  • php:7.4-fpm là image khởi tạo ra container, nếu image này chưa có nó tự động tải về.
Sau lệnh này, một container đã tạo container có tên đặt là Php74 từ image php:7.4-fpm. Hãy kiểm tra tình hình các container xem sao với lệnh:
root@docker:~# docker ps -a

Như hình trên, một container có tên Php74 được tạo ra, chạy với lệnh script mặc định docker-php-entrypoint, dịch vụ PHP-FPM chạy và lắng nghe ở cổng 9000. Script mặc định này mô tả trong một file Dockerfile, loại file này sẽ tìm hiểu sau. Ở đây bạn có thể xem thông tin file này kèm trong image bằng lệnh.
docker inspect image_name_or_id
ví dụ:
root@docker:~# docker inspect php:7.4-fpm

Trong image php:7.3-fpm thì đọc thông tin này, có mục:
"Entrypoint": [ "docker-php-entrypoint" ],

Vì Entrypoint quy định các lệnh chạy mặc định khi tạo - chạy container, nên bạn thấy script docker-php-entrypoint được chạy.
Chú ý: trong một số image, Entrypoint chạy script kết thúc ngay dẫn đến container kết thúc ngay, kể cả khi khởi chạy lại container bằng docker start thì nó cũng kết thúc luôn. Những loại image như vậy, cần tiến trình hoạt động dài để giữ cho container sống. Để khắc phục, thêm vào nó tham số -i ở lệnh docker run

Giờ nếu muốn nhảy vào tương tác với container này (container phải đang chạy), thì gọi lệnh bash của nó bằng cách:
root@docker:~# docker exec -it Php74 bash

Đang trong container, hãy gõ lệnh kiểm tra php version:
php -v

Kết quả hiện thị thông tin phiên bản PHP, vậy bạn đã có một container PHP rồi!. Thử tạo một script PHP có tên test.php và chạy nó từ dòng lệnh của container này.
root@docker:~# docker exec -it Php74 bash
root@Php74:/var/www/html# echo "<?php echo 'Hello World';" > test.php
root@Php74:/var/www/html# php test.php

#Kết quả: Hello World!
Bạn có thể copy, chỉnh sửa các file theo đường dẫn của máy Host /mnt/www/html/ (html là thư mục tự sinh khi chạy docker php) và nó truy cập được từ containr trong đường dẫn /var/www/html

Mở rộng: có sẵn một script có tên là docker-php-ext-configure và docker-php-ext-install để bạn cấu hình

Cài các Extension cho PHP, ví dụ nếu muốn có thêm OpCache thì gõ:
docker-php-ext-configure opcache --enable-opcache \
    && docker-php-ext-install opcache
Cài thêm mysqli - extension để kết nối PHP đến MySQL
docker-php-ext-configure opcache --enable-mysqli \
    && docker-php-ext-install mysqli
Cài thêm pdo_mysql - extension để kết nối PHP đến MySQL với thư viện PDO
docker-php-ext-configure opcache --enable-pdo_mysql \
    && docker-php-ext-install pdo_mysql
File php.ini mà PHP nạp nằm ở /usr/local/etc/php, để có file ini này gõ lệnh:
cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
Để có trình soạn thảo text vim gõ lệnh:
apt-get update && apt-get install vim
Nếu cần chỉnh sửa thiết lập nào đó, vào ini chỉnh sủa, gõ lệnh:
vim /usr/local/etc/php/php.ini
Khi cài đặt extension, thay đổi thiết lập để hiệu lực hãy khởi động lại container này bằng lệnh:
docker restart Php74
Kiểm tra các phần mở rộng đã có trong PHP bằng lệnh php -m, cái nào cần dùng còn thiếu thì cài vào theo cách như trên.


Cài đặt MySQL 5.7 và phpMyAdmin bằng Docker

Các bước cài đặt:
  • Tạo Docker network
  • Khởi tạo Docker container từ Docker image của MySQL
  • Khởi tạo Docker container từ Docker image của phpMyAdmin

Tạo Docker network

Việc tạo Docker network giúp cho các Docker container trong cùng 1 network có thể giao tiếp với nhau thông qua container name

Chạy lệnh sau:
docker network create mysql
Lệnh trên sẽ tạo một Docker network có tên là mysql. Chúng ta sẽ đặt 2 Docker container chạy MySQL và phpMyAdmin bên trong network mysql này

Khởi tạo Docker container từ Docker image của MySQL

Trước tiên, hãy tạo một thư mục dùng để lưu dữ liệu của Docker container, ví dụ: /home/moe/mysql_data
Sau đó, chạy lệnh:
docker run --name learn_mysql --network mysql -v /home/moe/mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7
trong đó:
--name learn_mysql: tên của container. Tên này sẽ được sử dụng ở bước sau, khi chúng ta khới tạo container chạy phpMyAdmin
--network mysql: đặt container này trong network mysql vừa được tạo ở bước 1
-v /home/moe/mysql_data:/var/lib/mysql : Volume dữ liệu từ container ra bên ngoài thư mục mysql_data mà chúng ta vừa tạo
-e MYSQL_ROOT_PASSWORD=123: đặt password cho user root. Mỗi một MySQL server khi được khởi tạo đều sẽ có một user root ban đầu.

Khởi tạo Docker container từ Docker image của phpMyAdmin


Chạy lệnh sau:
docker run --name myadmin -d --network mysql -p 8081:80 -e PMA_HOST=learn_mysql phpmyadmin/phpmyadmin
trong đó:
--name myadmin: tên container
--network mysql: đặt container này vào trong network mysql. Lúc này 2 container chạy phpMyAdmin và MySQL đều ở trong cùng 1 network
-e PMA_HOST=learn_mysql: địa chỉ IP của MySQL server. Vì chúng ta đã đặt 2 container chạy phpMyAdmin và MySQL trong cùng 1 network (mysql) nên chúng ta có thể dùng tên container chạy MySQL (learn_mysql) cho biến môi trường này
-p 8081:80: mapping cổng 80 của container với cổng 8081 của máy host

Sau khi hoàn thành cả 3 bước trên, chúng ta truy cập vào địa chỉ: http://localhost:8081/, xuất hiện màn hình:

Giao diện phpMyAdmin
phpMyAdmin
 

Ở mục ngôn ngữ, bạn có thể chọn ngôn ngữ là Tiếng Việt hoặc Tiếng Anh

Ở mục Đăng nhập, bạn hãy dùng tài khoản root, mật khẩu chính là mật khẩu bạn đã đặt cho biến môi trường MYSQL_ROOT_PASSWORD khi khởi tạo MySQL container, như trong bài viết này thì mật khẩu tôi đặt là 123

Đăng nhập bằng tài khoản root
phpMyAdminLogIn

Và đây là kết quả khi đăng nhập thành công:

Giao diện phpMyAdmin
phpMyAdminUI