Dockerizing LEMP Stack với Docker-Compose trên Ubuntu

theanh

Administrator
Nhân viên
Docker-Compose là một công cụ dòng lệnh để định nghĩa và quản lý các ứng dụng docker đa container. Compose là một tập lệnh python, có thể dễ dàng cài đặt bằng lệnh pip (pip là lệnh cài đặt phần mềm Python từ kho lưu trữ gói python). Với compose, chúng ta có thể chạy nhiều container docker bằng một lệnh duy nhất. Nó cho phép bạn tạo một container dưới dạng dịch vụ, rất phù hợp cho môi trường phát triển, thử nghiệm và dàn dựng của bạn.

Trong hướng dẫn này, tôi sẽ hướng dẫn bạn từng bước sử dụng docker-compose để tạo môi trường LEMP Stack (LEMP = Linux - Nginx - MySQL - PHP). Chúng tôi sẽ chạy tất cả các thành phần trong các vùng chứa Docker khác nhau, chúng tôi thiết lập một vùng chứa Nginx, vùng chứa PHP, vùng chứa PHPMyAdmin và vùng chứa MySQL/MariaDB.

Điều kiện tiên quyết
  • Máy chủ Ubuntu 16.04 -64bit
  • Quyền root

Bước 1 - Cài đặt Docker​

Trong bước này, chúng tôi sẽ cài đặt Docker. Docker có sẵn trong kho lưu trữ Ubuntu, chỉ cần cập nhật kho lưu trữ của bạn rồi cài đặt.

Cập nhật kho lưu trữ Ubuntu và nâng cấp:
Mã:
sudo apt-get update[B]sudo apt-get upgrade
Cài đặt Docker mới nhất từ kho lưu trữ Ubuntu.
Mã:
sudo apt-get install -y docker.io
Khởi động docker và cho phép nó khởi động khi khởi động:
Mã:
systemctl start docker
systemctl enable docker
Các dịch vụ Docker đang chạy.

Tiếp theo, bạn có thể thử sử dụng docker bằng lệnh bên dưới để kiểm tra:
Mã:
docker run hello-world
Xin chào thế giới từ docker.




Bước 2 - Cài đặt Docker-Compose​

Ở bước đầu tiên, chúng ta đã cài đặt Docker. Bây giờ chúng ta sẽ cài đặt docker-compose.

Chúng ta cần python-pip để cài đặt compose, hãy cài python và python-pip bằng apt:
Mã:
sudo apt-get install -y python python-pip
Khi quá trình cài đặt hoàn tất, hãy cài đặt docker-compose bằng lệnh pip.
Mã:
pip install docker-compose
Bây giờ hãy kiểm tra phiên bản docker-compose:
Mã:
docker-compose --version
Docker-compose đã được cài đặt.




Bước 3 - Tạo và cấu hình môi trường Docker​

Trong bước này, chúng ta sẽ xây dựng môi trường docker-compose của mình. Chúng ta sẽ sử dụng một người dùng không phải root, vì vậy chúng ta cần tạo người dùng đó ngay bây giờ.

Thêm một người dùng mới có tên là 'hakase' (hãy chọn tên người dùng của riêng bạn tại đây nếu bạn muốn):
Mã:
useradd -m -s /bin/bash hakase
passwd hakase
Tiếp theo, thêm người dùng mới vào nhóm 'docker' và khởi động lại docker.
Mã:
usermod -a -G docker hakase
sudo systemctl restart docker
Bây giờ người dùng 'hakase' có thể sử dụng docker mà không cần sudo.

Tiếp theo, từ người dùng root, hãy đăng nhập vào người dùng 'hakase' bằng su.
Mã:
su - hakase
Tạo một thư mục mới cho môi trường compose.
Mã:
mkdir lemp-compose/
cd lemp-compose/
Đây là môi trường docker-compose của chúng tôi, tất cả các tệp tin nằm trong vùng chứa Docker phải nằm trong thư mục này. Khi sử dụng docker-compose, chúng ta cần một tệp .yml có tên là 'docker-compose.yml'.

Trong thư mục 'lemp-compose', hãy tạo một số thư mục mới và một tệp docker-compose.yml:
Mã:
touch docker-compose.yml
mkdir -p {logs,nginx,public,db-data}
  • logs: Thư mục chứa các tệp nhật ký Nginx.
  • nginx: chứa cấu hình Nginx như máy chủ ảo, v.v.
  • public: thư mục chứa các tệp web, index.html và tệp thông tin PHP.
  • db-data: khối lượng thư mục dữ liệu MariaDB.
Tạo các tệp nhật ký error.log và access.log trong thư mục 'logs'.
Mã:
touch logs/{error,access}.log
Tạo tệp cấu hình máy chủ ảo nginx mới trong thư mục 'nginx':
Mã:
vim nginx/app.conf
Dán cấu hình bên dưới:
Mã:
upstream php {
 server phpfpm:9000;
}
 
server {
 
 server_name 193.70.36.50;
 
 error_log "/opt/bitnami/nginx/logs/myapp-error.log";
 access_log "/opt/bitnami/nginx/logs/myapp-access.log";
 
 root /myapps;
 index index.php index.html;
 
 location / {
 
 try_files $uri $uri/ /index.php?$args;
 }
 
 location ~ \.php$ {
 
 include fastcgi.conf;
 fastcgi_intercept_errors on;
 fastcgi_pass php;
 }
 
 location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
 expires max;
 log_not_found off;
 }
}
Lưu tệp và thoát khỏi vim.

Tạo tệp index.html mới và tệp thông tin PHP trong thư mục 'public'.
Mã:
echo '[HEADING=1]LEMP Docker-Compose[/HEADING]
hakase-labs[/b]' > public/index.html
echo '' > public/info.php
Bây giờ bạn có thể thấy thư mục môi trường như hiển thị bên dưới:
Mã:
tree



Bước 4 - Cấu hình tệp docker-compose.yml​

Ở bước trước, chúng ta đã tạo các thư mục và tệp cần thiết cho vùng chứa của mình. Ở bước này, chúng ta muốn chỉnh sửa tệp 'docker-compose.yml'. Trong tệp docker-compose.yml, chúng ta sẽ định nghĩa các dịch vụ của mình cho ngăn xếp LEMP, các hình ảnh cơ sở cho mỗi vùng chứa và các khối lượng docker.

Đăng nhập vào người dùng 'hakase' và chỉnh sửa tệp docker-compose.yml bằng vim:
Mã:
su - hakase
cd lemp-compose/
vim docker-compose.yml
- Định nghĩa các dịch vụ Nginx

Dán cấu hình thenginx bên dưới:
Mã:
nginx:
 image: 'bitnami/nginx'
 ports:
 - '80:80'
 links:
 - phpfpm
 volumes:
 - ./logs/access.log:/opt/bitnami/nginx/logs/myapp-access.log
 - ./logs/error.log:/opt/bitnami/nginx/logs/myapp-error.log
 - ./nginx/app.conf:/bitnami/nginx/conf/vhosts/app.conf
 - ./public:/myapps
Trong cấu hình đó, chúng tôi đã định nghĩa:
  • nginx: tên dịch vụ
  • hình ảnh: chúng tôi đang sử dụng 'bitnami/nginx' hình ảnh docker
  • cổng: hiển thị cổng container 80 với cổng máy chủ 80
  • liên kết: liên kết container dịch vụ 'nginx' với container 'phpfpm'
  • khối lượng: gắn các thư mục cục bộ vào container. Gắn thư mục tệp nhật ký, gắn cấu hình máy chủ ảo Nginx và gắn thư mục gốc web.
- Định nghĩa dịch vụ PHP-fpm

Dán cấu hình bên dưới khối Nginx:
Mã:
phpfpm:
 image: 'bitnami/php-fpm'
 ports:
 - '9000:9000'
 volumes:
 - ./public:/myapps
Chúng tôi đã định nghĩa ở đây:
  • phpfpm: định nghĩa tên dịch vụ.
  • image: định nghĩa hình ảnh cơ sở cho dịch vụ phpfpm với hình ảnh 'bitnami/php-fpm'.
  • ports: Chúng tôi đang chạy PHP-fpm với cổng TCP 9000 và hiển thị cổng 9000 cho host.
  • volumes: gắn thư mục gốc web 'public' vào 'myapps' trên container.
- Xác định dịch vụ MySQL

Trong khối thứ ba, dán cấu hình bên dưới cho container dịch vụ MariaDB:
Mã:
mysql:
 image: 'mariadb'
 ports:
 - '3306:3306'
 volumes:
 - ./db-data:/var/lib/mysql
 environment:
 - MYSQL_ROOT_PASSWORD=hakase-labs123
Tại đây, bạn có thể thấy chúng tôi đang sử dụng:
  • mysql: làm tên dịch vụ.
  • image: container dựa trên docker 'mariadb' images.
  • ports: dịch vụ chứa sử dụng cổng 3306 để kết nối MySQL và hiển thị nó cho máy chủ trên cổng 3306.
  • volumes: thư mục db-data mysql
  • environment: đặt biến môi trường 'MYSQL_ROOT_PASSWORD' cho mật khẩu gốc mysql thành docker images, được thực thi khi xây dựng container.
- Cấu hình dịch vụ PHPMyAdmin

Khối cuối cùng, dán cấu hình bên dưới:
Mã:
phpmyadmin:
 image: 'phpmyadmin/phpmyadmin'
 restart: always
 ports:
 - '8080:80'
 links:
 - mysql:mysql
 environment:
 MYSQL_USERNAME: root
 MYSQL_ROOT_PASSWORD: hakase-labs123
 PMA_HOST: mysql
Chúng tôi đang sử dụng hình ảnh docker 'phpmyadmin', ánh xạ cổng container 80 thành 8080 trên máy chủ, liên kết container với container mariadb, đặt luôn khởi động lại và đặt một số biến môi trường của hình ảnh docker, bao gồm đặt 'PMA_HOST'.

Lưu tệp và thoát vim.

Bạn có thể xem ví dụ đầy đủ trên github.


Bước 5 - Chạy Docker-Compose​

Bây giờ chúng ta đã sẵn sàng để chạy docker-compose. Lưu ý: khi bạn muốn chạy docker-compose, bạn phải ở trong thư mục dự án docker-compose và đảm bảo có tệp yml với cấu hình compose.

Chạy lệnh bên dưới để khởi động ngăn xếp LEMP:
Mã:
docker-compose up -d
-d: chạy dưới dạng daemon hoặc nền

Bạn sẽ thấy kết quả là các container mới đã được tạo, hãy kiểm tra bằng lệnh bên dưới:
Mã:
docker-compose ps


Bây giờ chúng ta có bốn container đang chạy Nginx, PHP-fpm, MariaDB và PHPMyAdmin.


Bước 6 - Kiểm tra​

Kiểm tra các cổng được docker-proxy sử dụng trên máy chủ.
Mã:
netstat -plntu


Chúng ta có thể thấy cổng 80 cho container Nginx, cổng 3306 cho container MariaDB, cổng 9000 cho container php-fpm và cổng 8080 cho container PHPMyAdmin.

Truy cập cổng 80 từ trình duyệt web và bạn sẽ thấy tệp index.html của chúng ta.

http://serverip-address/



Đảm bảo PHP-fpm đang chạy, truy cập từ trình duyệt web.

http://serverip-address/info.php



Truy cập vùng chứa MySQL trong shell MySQL.
Mã:
docker-compose exec mysql bash
mysql -u root -p
TYPE MYSQL PASSWORD: hakase-labs123
Bây giờ hãy tạo một cơ sở dữ liệu mới:
Mã:
create database hakase_db;
exit
Có thể truy cập vùng chứa mysql shell MariaDB và chúng tôi đã tạo một cơ sở dữ liệu mới 'hakase_db'.



Tiếp theo, truy cập PHPMyAdmin trên cổng 8080: http://serverip-address:8080/.

Bạn sẽ thấy trang đăng nhập PHPMyAdmin, chỉ cần nhập tên người dùng 'root' và mật khẩu là 'hakase-labs123'.



Bạn sẽ tự động được kết nối với vùng chứa mysql đã được xác định trong biến môi trường PMA_HOST.

Nhấp vào 'Go' và bạn sẽ thấy bảng điều khiển phpmyadmin được kết nối với vùng chứa 'mysql'.



Thành công! LEMP Stack đang chạy dưới thiết lập docker-compose, bao gồm bốn container.

Tham khảo​

 
Back
Bên trên