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
Cập nhật kho lưu trữ Ubuntu và nâng cấp:
Cài đặt Docker mới nhất từ kho lưu trữ Ubuntu.
Khởi động docker và cho phép nó khởi động khi khởi động:
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:
Xin chào thế giới từ docker.
Chúng ta cần python-pip để cài đặt compose, hãy cài python và python-pip bằng apt:
Khi quá trình cài đặt hoàn tất, hãy cài đặt docker-compose bằng lệnh pip.
Bây giờ hãy kiểm tra phiên bản docker-compose:
Docker-compose đã được cài đặt.
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):
Tiếp theo, thêm người dùng mới vào nhóm 'docker' và khởi động lại 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.
Tạo một thư mục mới cho môi trường 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:
Tạo tệp cấu hình máy chủ ảo nginx mới trong thư mục 'nginx':
Dán cấu hình bên dưới:
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'.
Bây giờ bạn có thể thấy thư mục môi trường như hiển thị bên dưới:
Đăng nhập vào người dùng 'hakase' và chỉnh sửa tệp docker-compose.yml bằng vim:
- Định nghĩa các dịch vụ Nginx
Dán cấu hình thenginx bên dưới:
Trong cấu hình đó, chúng tôi đã định nghĩa:
Dán cấu hình bên dưới khối Nginx:
Chúng tôi đã định nghĩa ở đây:
Trong khối thứ ba, dán cấu hình bên dưới cho container dịch vụ MariaDB:
Tại đây, bạn có thể thấy chúng tôi đang sử dụng:
Khối cuối cùng, dán cấu hình bên dưới:
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.
Chạy lệnh bên dưới để khởi động ngăn xếp LEMP:
-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:
Bây giờ chúng ta có bốn container đang chạy Nginx, PHP-fpm, MariaDB và PHPMyAdmin.
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.
Bây giờ hãy tạo một cơ sở dữ liệu mới:
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.
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
Mã:
sudo apt-get install -y docker.io
Mã:
systemctl start docker
systemctl enable docker
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
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
Mã:
pip install docker-compose
Mã:
docker-compose --version
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
Mã:
usermod -a -G docker hakase
sudo systemctl restart docker
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
Mã:
mkdir lemp-compose/
cd lemp-compose/
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.
Mã:
touch logs/{error,access}.log
Mã:
vim nginx/app.conf
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;
}
}
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
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
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
- 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.
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
- 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.
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
- 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.
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
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
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
Mã:
create database hakase_db;
exit
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
- https://hub.docker.com/r/bitnami/nginx/
- https://hub.docker.com/r/bitnami/php-fpm/
- https://hub.docker.com/_/mariadb/
- https://hub.docker.com/r/phpmyadmin/phpmyadmin/
- https://docs.docker.com/compose/
- https://github.com/yuzukiseo/hakase-labs/tree/master/lemp-compose
- https://www.howtoforge.com/tutorial/how-to-create-docker-images-with-dockerfile/