Docker Compose là công cụ mạnh mẽ giúp việc quản lý và điều phối các container Docker trở nên dễ dàng, bao gồm các tác vụ như khởi động, tắt, cấu hình liên kết giữa các container và volumes. Trong bài viết này, chúng tôi sẽ trình bày một ví dụ thực tế về cách sử dụng Docker Compose để cài đặt một ứng dụng phổ biến – WordPress, kèm theo PHPMyAdmin như một phần bổ sung. Thông thường, WordPress được triển khai trên LAMP stack, bao gồm Linux, Apache, MySQL/MariaDB và PHP.
Để triển khai WordPress hiệu quả với Docker Compose trên Ubuntu 14.04, bạn cần một môi trường máy chủ ổn định. Khám phá ngay các gói VPS giá rẻ tại danh mục dịch vụ của chúng tôi để tối ưu chi phí và đảm bảo hiệu suất cao cho website của bạn.
Yêu Cầu
Để theo dõi bài viết này, bạn sẽ cần:
-
Một Droplet Ubuntu 14.04
-
Một người dùng không phải root với quyền sudo (tham khảo bài Thiết lập máy chủ ban đầu với Ubuntu 14.04 để biết cách thiết lập.)
-
Docker và Docker Compose đã được cài đặt theo hướng dẫn trong bài Cách cài đặt và sử dụng Docker Compose trên Ubuntu 14.04
Bước 1 – Cài đặt WordPress
Chúng ta sẽ sử dụng hình ảnh chính thức của WordPress và MariaDB trên Docker. Nếu bạn tò mò, có rất nhiều thông tin về các hình ảnh này và các tùy chọn cấu hình của chúng trên GitHub và Docker Hub.
Hãy bắt đầu bằng cách tạo một thư mục nơi dữ liệu của chúng ta sẽ được lưu trữ và tạo một file docker-compose.yml
tối giản để chạy container WordPress:
mkdir ~/wordpress && cd $_
Sau đó, tạo file ~/wordpress/docker-compose.yml
bằng trình soạn thảo văn bản ưa thích của bạn (nano rất dễ sử dụng nếu bạn không có lựa chọn khác):
nano ~/wordpress/docker-compose.yml
Sao chép và dán nội dung sau vào file:
~/wordpress/docker-compose.yml wordpress: image: wordpress
File trên chỉ báo cho Docker Compose khởi chạy một container mới có tên wordpress
và tải hình ảnh wordpress
từ Docker Hub.
Chúng ta có thể khởi chạy hình ảnh bằng cách:
docker-compose up
Khi chạy lệnh trên, Docker sẽ tải xuống và giải nén hình ảnh WordPress từ Docker Hub. Sau một thời gian, bạn sẽ nhận được một số thông báo lỗi tương tự như sau:
Output wordpress_1 | error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables wordpress_1 | Did you forget to --link some_mysql_container:mysql or set an external db wordpress_1 | with -e WORDPRESS_DB_HOST=hostname:port? dockercompose_wordpress_1 exited with code 1
Đây là WordPress báo lỗi vì không tìm thấy cơ sở dữ liệu. Hãy thêm hình ảnh MariaDB vào để liên kết và khắc phục lỗi.
Bước 2 – Cài đặt MariaDB
Để thêm hình ảnh MariaDB vào nhóm container, mở lại file docker-compose.yml
bằng trình soạn thảo:
nano ~/wordpress/docker-compose.yml
Thay đổi nội dung file docker-compose.yml
thành như bên dưới (chú ý khoảng trắng, vì file YAML nhạy cảm với thụt lề):
docker-compose.yml wordpress: image: wordpress links: - wordpress_db:mysql wordpress_db: image: mariadb
Ở đây, chúng ta đã định nghĩa một container mới có tên wordpress_db
và chỉ định sử dụng hình ảnh mariadb
từ Docker Hub. Đồng thời, container wordpress
được liên kết với container wordpress_db
và đặt tên là mysql
(trong container WordPress, hostname mysql
sẽ trỏ tới container wordpress_db
).
Nếu bạn chạy lại docker-compose up
, bạn sẽ thấy Docker tải hình ảnh MariaDB xuống, nhưng vẫn có lỗi:
Output wordpress_db_1 | error: database is uninitialized and MYSQL_ROOT_PASSWORD not set wordpress_db_1 | Did you forget to add -e MYSQL_ROOT_PASSWORD=... ? wordpress_1 | error: missing required WORDPRESS_DB_PASSWORD environment variable wordpress_1 | Did you forget to -e WORDPRESS_DB_PASSWORD=... ? wordpress_1 | wordpress_1 | (Also of interest might be WORDPRESS_DB_USER and WORDPRESS_DB_NAME.) wordpress_wordpress_db_1 exited with code 1 wordpress_wordpress_1 exited with code 1 Gracefully stopping... (press Ctrl+C again to force)
WordPress vẫn báo lỗi không tìm thấy cơ sở dữ liệu, và MariaDB cũng phàn nàn rằng chưa có mật khẩu root được đặt.
Chỉ liên kết hai container thôi chưa đủ. Hãy đặt biến môi trường MYSQL_ROOT_PASSWORD
để khởi động thành công.
Mở lại file Docker Compose:
nano ~/wordpress/docker-compose.yml
Thêm 2 dòng sau vào cuối phần wordpress_db (đừng quên thay đổi examplepass
bằng mật khẩu an toàn của bạn!):
docker-compose.yml wordpress_db: ... environment: MYSQL_ROOT_PASSWORD: examplepass ...
Dòng lệnh trên sẽ thiết lập biến môi trường MYSQL_ROOT_PASSWORD
bên trong container wordpress_db
với mật khẩu bạn chọn. Hình ảnh MariaDB được cấu hình để kiểm tra biến môi trường này khi khởi động và tự động thiết lập tài khoản root với mật khẩu đã định nghĩa.
Trong khi đó, hãy cấu hình chuyển tiếp cổng để có thể truy cập WordPress sau khi khởi động. Trong phần wordpress
, thêm 2 dòng sau:
docker-compose.yml wordpress: ... ports: - 8080:80 ...
Ở đây, số cổng đầu tiên là cổng trên máy chủ host, và số cổng thứ hai là cổng bên trong container. Cấu hình này chuyển tiếp các yêu cầu trên cổng 8080 của host đến cổng 80 mặc định của container.
Lưu ý: Nếu bạn muốn WordPress chạy trên cổng 80 mặc định của host, thay đổi dòng trên thành
80:80
để chuyển tiếp yêu cầu từ cổng 80 của host đến cổng 80 bên trong container.
File docker-compose.yml
hoàn chỉnh hiện nay sẽ như sau:
docker-compose.yml wordpress: image: wordpress links: - wordpress_db:mysql ports: - 8080:80 wordpress_db: image: mariadb environment: MYSQL_ROOT_PASSWORD: examplepass
Với cấu hình trên, giờ chúng ta có thể khởi chạy WordPress. Lần này, chạy container với tuỳ chọn -d
để chạy các container ở chế độ nền, cho phép bạn tiếp tục sử dụng terminal:
docker-compose up -d
Khi chạy lệnh, bạn sẽ thấy nhiều dòng thông báo xuất hiện. Sau khi quá trình khởi động ổn định, hãy mở trình duyệt web và truy cập địa chỉ IP của máy chủ DataOnline của bạn qua cổng 8080
(ví dụ: nếu IP của server là 123.456.789.123
thì truy cập http://123.456.789.123:8080
).
Bạn sẽ thấy trang cài đặt WordPress mới và có thể tiến hành cài đặt như thông thường.
Bởi vì đây đều là những hình ảnh chính thức của Docker và tuân thủ các best practices, nên mỗi hình ảnh đều có các volume định sẵn để lưu trữ dữ liệu – nghĩa là nếu bạn khởi động lại container, các bài đăng blog của bạn vẫn được giữ nguyên.
Bước 3 – Thêm Container PhpMyAdmin
Tuyệt, quá trình cài đặt đến đây khá suôn sẻ. Hãy thử nâng cao một chút.
Cho đến nay, chúng ta chỉ sử dụng các hình ảnh chính thức, mà đội ngũ Docker đã rất cẩn trọng đảm bảo tính chính xác. Có thể bạn đã nhận thấy rằng chúng ta không cần thiết đặt các biến môi trường cho container WordPress. Ngay khi liên kết với container MariaDB được cấu hình đúng, mọi thứ đã hoạt động.
Điều này là nhờ có một script bên trong container WordPress, script này lấy biến MYSQL_ROOT_PASSWORD
từ container wordpress_db
và sử dụng nó để kết nối với WordPress.
Bây giờ, hãy mở rộng ngoài phạm vi hình ảnh chính thức một chút và sử dụng hình ảnh PhpMyAdmin do cộng đồng đóng góp. Mở lại file docker-compose.yml
:
nano docker-compose.yml
Thêm nội dung sau vào cuối file:
docker-compose.yml phpmyadmin: image: corbinu/docker-phpmyadmin links: - wordpress_db:mysql ports: - 8181:80 environment: MYSQL_USERNAME: root MYSQL_ROOT_PASSWORD: examplepass
Chú ý: Hãy thay examplepass
bằng đúng mật khẩu root bạn đã thiết lập cho container wordpress_db.
Cấu hình trên tải hình ảnh docker-phpmyadmin
của thành viên cộng đồng corbinu
, liên kết nó với container wordpress_db
với tên là mysql
(tức là từ bên trong container phpmyadmin
, các tham chiếu đến hostname mysql
sẽ trỏ tới container wordpress_db
), chuyển tiếp cổng 80 của container ra cổng 8181 của host, và cuối cùng thiết lập một số biến môi trường với tên đăng nhập và mật khẩu của MariaDB.
Lưu ý: Hình ảnh này không tự động lấy biến môi trường MYSQL_ROOT_PASSWORD
từ container wordpress_db
như hình ảnh WordPress làm, do đó ta cần sao chép dòng MYSQL_ROOT_PASSWORD: examplepass
từ container wordpress_db và đặt tên đăng nhập là root.
File docker-compose.yml
hoàn chỉnh sau bước này sẽ như sau:
docker-compose.yml wordpress: image: wordpress links: - wordpress_db:mysql ports: - 8080:80 wordpress_db: image: mariadb environment: MYSQL_ROOT_PASSWORD: examplepass phpmyadmin: image: corbinu/docker-phpmyadmin links: - wordpress_db:mysql ports: - 8181:80 environment: MYSQL_USERNAME: root MYSQL_ROOT_PASSWORD: examplepass
Bây giờ, khởi động lại nhóm ứng dụng:
docker-compose up -d
Khi chạy lệnh, bạn sẽ thấy quá trình cài đặt PhpMyAdmin diễn ra. Sau khi quá trình hoàn tất, hãy truy cập địa chỉ IP của server qua cổng 8181 (ví dụ: http://123.456.789.123:8181
). Bạn sẽ thấy màn hình đăng nhập PhpMyAdmin.
Đăng nhập với username root
và mật khẩu đã được thiết lập trong file YAML, bạn sẽ có thể duyệt cơ sở dữ liệu. Bạn sẽ nhận thấy rằng server chứa một cơ sở dữ liệu wordpress
, chứa toàn bộ dữ liệu từ cài đặt WordPress của bạn.
Bạn có thể thêm bao nhiêu container tùy thích theo cách này và liên kết chúng theo ý muốn. Phương pháp này thật mạnh mẽ – thay vì phải cấu hình và thiết lập các thành phần riêng lẻ trên cùng một server, bạn có thể lắp ráp các khối giống như Lego và bổ sung từng phần. Sử dụng các công cụ như Docker Swarm, bạn thậm chí có thể chạy các container này một cách minh bạch trên nhiều server! (Tuy nhiên, điều này nằm ngoài phạm vi của bài viết này.) Nếu bạn quan tâm, Docker có sẵn tài liệu về chủ đề này.
Bước 4 – Tạo Site WordPress
Vì tất cả các file cho site WordPress mới của bạn được lưu trữ bên trong container Docker, vậy điều gì sẽ xảy ra với các file đó khi bạn dừng container và khởi động lại?
Theo mặc định, thư mục gốc (document root) của container WordPress là persistent. Điều này là nhờ cấu hình của hình ảnh WordPress trên Docker Hub. Nếu bạn thay đổi site WordPress, sau đó dừng nhóm ứng dụng và khởi động lại, website của bạn vẫn sẽ giữ nguyên các thay đổi.
Hãy thử nó.
-
Truy cập vào WordPress qua trình duyệt (ví dụ:
http://123.456.789.123:8080
), chỉnh sửa bài đăng Hello World! đã có sẵn. -
Sau đó, dừng tất cả các container Docker bằng lệnh:
docker-compose stop
Sau khi dừng, truy cập lại trang WordPress, bạn sẽ thấy trang web không hoạt động.
Khởi động lại các container:
docker-compose up -d
Truy cập lại trang WordPress, bạn sẽ thấy site blog và các thay đổi mà bạn đã thực hiện được duy trì.
Điều này chứng tỏ rằng các thay đổi của bạn được lưu giữ ngay cả khi container bị dừng.
Bước 5 -Lưu trữ Document Root trên hệ thống File của Host
Bạn có thể lưu trữ document root của WordPress trên hệ thống file của host bằng cách sử dụng Docker data volume để chia sẻ file giữa host và container.
Hãy cùng thử. Mở lại file docker-compose.yml
:
nano ~/wordpress/docker-compose.yml
Trong phần wordpress:, thêm các dòng sau:
~/wordpress/docker-compose.yml wordpress: ... volumes: - ~/wordpress/wp_html:/var/www/html ...
Tiếp theo, dừng phiên làm việc của docker-compose hiện tại:
docker-compose stop
Sau đó, xóa container hiện tại để có thể ánh xạ volume tới hệ thống file của host:
docker-compose rm wordpress
Khởi động lại WordPress:
docker-compose -d
Khi lệnh chạy xong, WordPress sẽ được khởi động lại – lần này sử dụng hệ thống file của host để lưu trữ document root.
Nếu bạn kiểm tra trong thư mục ~/wordpress
, bạn sẽ thấy có một thư mục wp_html
chứa toàn bộ các file nguồn của WordPress.
ls ~/wordpress
Mọi thay đổi bạn thực hiện sẽ được container WordPress cập nhật ngay tức thời.
Trải nghiệm này trơn tru hơn so với bình thường – container WordPress được cấu hình kiểm tra xem /var/www/html
có trống hay không khi khởi động và tự động sao chép các file vào đó nếu cần. Thông thường, bạn sẽ phải thực hiện bước này một cách thủ công.