Cách Cài đặt Wordpress và PhpMyAdmin với Docker Compose trên Ubuntu 14.04

2 năm trước

Giới Thiệu 

Docker Compose làm cho việc xử lý các quy trình phối hợp của các Docker containers (như khởi động, tắt, và thiết lập liên kết và volumes trong container) thực sự dễ dàng.

Bài viết này cung cấp một ví dụ thực tế về việc sử dụng Docker Compose để cài đặt một ứng dụng, trong trường hợp này WordPress với PHPMyAdmin là một phần bổ sung. WordPress thường chạy trên một LAMP stack, có nghĩa là Linux, Apache, MySQL / MariaDB và PHP. Hình ảnh WordPress Docker chính thức bao gồm Apache và PHP , vì vậy phần duy nhất chúng ta phải lo lắng là MariaDB.

 

Yêu Cầu 

Để làm theo hướng dẫn này , chúng ta cần :

  • Ubuntu 14.04 VPS
  • Một non-root user với quyền sudo 
  • Docker và Docker Compose đã được cài đặt
 

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 Docker .Nếu bạn tò mò, có nhiều thông tin hơn về những hình ảnh này và các tùy chọn cấu hình của chúng trên các trang GitHub và Docker Hub tương ứng của chúng.

Hãy bắt đầu bằng cách tạo một thư mục chứa dữ liệu  và tạo một tệp docker-compose.yml tối thiểu để chạy WordPress container :  

mkdir ~/wordpress && cd $_

Sau đó, tạo một~/wordpress/docker-compose.yml  với trình soạn thảo văn bản yêu thích của bạn (nano rất dễ dàng nếu bạn không có sở thích):

nano ~/wordpress/docker-compose.yml

và dán vào các mục sau:

~/wordpress/docker-compose.yml
wordpress:
image: wordpress

Điều này  nói với Docker Compose để bắt đầu một container mới gọi là wordpressvà tải xuống  wordpressimage từ Docker Hub.

Chúng ta có thể mang hình ảnh lên như vậy:

docker-compose up

Bạn sẽ thấy Docker tải xuống và trích xuất hình ảnh WordPress từ Docker Hub và 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ư dưới đây:

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 phàn nàn rằng nó không thể tìm thấy một cơ sở dữ liệu. Hãy thêm một hình ảnh MariaDB vào hỗn hợp và liên kết nó để sửa lỗi đó.

 

Bước 2 — Cài đặt MariaDB

Để thêm hình ảnh MariaDB vào nhóm, hãy mở lại docker-compose.yml bằng trình soạn thảo văn bản của bạn:

nano ~/wordpress/docker-compose.yml

Thay đổi docker-compose.yml để khớp với bên dưới (hãy cẩn thận với sự thụt đầu dòng, các tệp YAML là nhạy cảm với không gian trắng)

docker-compose.yml
wordpress:
image: wordpress
links:- wordpress_db:mysqlwordpress_db:image: mariadb

Những gì chúng ta đã làm ở đây là xác định một container mới gọi là wordpress_db và bảo nó sử dụng mariadb image từ Docker Hub. Chúng ta cũng nói với wordpress container  để liên kết wordpress_dbcontainer  vào wordpress container và gọi nó là mysql (bên trong wordpress container  hostname mysqlsẽ được chuyển tiếp đến wordpress_dbcontainer của chúng ta).

Nếu bạn chạy docker-compose up lên một lần nữa, bạn sẽ thấy nó tải về hình ảnh MariaDB, và bạn cũng sẽ thấy rằng chúng ta chưa ở đó :

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 còn phàn nàn về việc không thể tìm thấy một cơ sở dữ liệu, và bây giờ chúng ta có một khiếu nại mới từ MariaDB nói rằng không có mật khẩu gốc được thiết lập.

Có vẻ như việc liên kết hai container không đủ. Chúng ta hãy tiếp tục và đặt biến  MYSQL_ROOT_PASSWORD  để chúng ta có thể thực sự kích hoạt điều này.

Chỉnh sửa lại tệp Docker Compose:

nano ~/wordpress/docker-compose.yml

Thêm hai dòng này vào cuối phần wordpress_db, nhưng hãy chắc chắn thay đổi examplepass thành một mật khẩu an toàn hơn!

docker-compose.yml
wordpress_db:
...
environment:MYSQL_ROOT_PASSWORD: examplepass...

Điều này sẽ thiết lập một biến môi trường bên trong wordpress_dbcontainer được gọi là MYSQL_ROOT_PASSWORDvới mật khẩu mong muốn của bạn. Hình ảnh MariaDB Docker được cấu hình để kiểm tra biến môi trường này khi nó khởi động và sẽ chăm sóc thiết lập DB với một tài khoản root với mật khẩu được xấc định là MYSQL_ROOT_PASSWORD.

Trong khi chúng ta đang ở đó,  hãy thiết lập một cổng phía trước để kết nối với cài đặt WordPress khi nó thực sự tải lên. Trong phần wordpress, hãy thêm hai dòng sau:

docker-compose.yml
wordpress:
...
ports:- 8080:80...

Số cổng đầu tiên là số cổng trên máy chủ và số cổng thứ hai là cổng bên trong container. Vì vậy, cấu hình này chuyển tiếp các yêu cầu trên cổng 8080 của máy chủ đến cổng máy chủ web mặc định 80 bên trong container.

Nếu bạn muốn Wordpress chạy trên cổng máy chủ web mặc định 80 trên máy chủ, hãy thay đổi dòng trước thành 80:80 để yêu cầu tới cổng 80 trên máy chủ được chuyển tiếp đến cổng 80 bên trong thùng chứa Wordpress.

Chú ý: Nếu bạn muốn Wordpress chạy trên cổng máy chủ web mặc định 80 trên máy chủ , hãy thay đổi dòng trước thành 80:80 để yêu cầu tới cổng 80 trên máy chủ được chuyển tiếp đến cổng 80 bên trong Wordpress container.

Bây giờ, tệp docker-compose.yml hoàn chỉnh của bạn sẽ trông giống 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 này, chúng ta thực sự có thể tiếp tục và kích hoạt WordPress. Lần này, hãy chạy nó với tùy chọn  -d, nó sẽ cho docker-compose chạy các containers trong nền để bạn có thể tiếp tục sử dụng terminal:

docker-compose up -d

Bạn sẽ thấy toàn bộ chuỗi văn bản được di chuyển bằng màn hình của bạn. Khi nó đã ổn định, hãy mở trình duyệt web và duyệt đến IPcủa hộp VidCloud của bạn trên cổng 8080 (ví dụ: nếu địa chỉ IP của máy chủ của bạn là 123.456.789.123, bạn nên nhập http://123.456.789.123:8080 vào trình duyệt của mình.)

Bạn sẽ thấy một trang cài đặt WordPress mới và có thể hoàn thành việc cài đặt và blog như bình thường.

Bởi vì đó là cả hai hình ảnh Docker chính thức và tuân theo tất cả các thực tiễn tốt nhất của Docker, mỗi hình ảnh này đều được xác định trước, volumes liên tục cho bạn - nghĩa là nếu bạn khởi động lại container, các bài đăng trên blog sẽ vẫn ở đó. 

 

Bước 3 — Thêm một PhpMyAdmin Container

Tuyệt, điều đó tương đối không gây tổn thương. Hãy thử làm sự khác thường một chút 

Cho đến nay chúng ta chỉ sử dụng hình ảnh chính thức mà nhóm Docker chịu đựng rất nhiều để đảm bảo chính xác. Bạn có thể nhận thấy rằng chúng ta  không phải cung cấp cho WordPress container bất kỳ biến môi trường nào để cấu hình nó. Ngay sau khi liên kết nó với một MariaDB container được cấu hình đúng, mọi thứ đã hoạt động.

Điều này là do có một tập lệnh bên trong WordPress Docker container thực sự lấy biến MYSQL_ROOT_PASSWORD từ  wordpress_db container của chúng ta và sử dụng nó để kết nối với WordPress.

Hãy mạo hiểm ra khỏi khu vực hình ảnh chính thức một chút và sử dụng một cộng đồng đóng góp hình ảnh PhpMyAdmin. Tiếp tục và chỉnh sửa docker-compose.yml một lần nữa:

nano docker-compose.yml

Dán phần sau vào cuối tệp:

docker-compose.yml
phpmyadmin:
image: corbinu/docker-phpmyadmin
links:
- wordpress_db:mysql
ports:
- 8181:80
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: examplepass

Hãy chắc chắn để thay thế examplepass với cùng một mật khẩu root chính xác  từ  wordpress_db container bạn thiết lập trước đó.

Điều này lấy docker-phpmyadmin bởi thành viên cộng đồng corbinu, liên kết nó với wordpress_db container  của chúng ta với tên mysql (có nghĩa là từ bên trong tham chiếu phpmyadmin container đến tên máy chủ mysql sẽ được chuyển tiếp đến wordpress_dbcontainer ),hiển thị cổng 80 của nó trên cổng 8181 của máy chủ và cuối cùng đặt một vài biến môi trường với tên người dùng và mật khẩu MariaDB của chúng tôi. Hình ảnh này không tự động lấy biến môi trường MYSQL_ROOT_PASSWORD từ môi trường wordpress_db container theo cách mà hình ảnh wordpress thực hiện. Chúng ta thực sự phải sao chép dòng MYSQL_ROOT_PASSWORD: examplepass từ  wordpress_db container và đặt tên người dùng thành  root.

Tệp docker-compose.yml hoàn chỉnh sẽ trông giống như sau:

docker-compose.yml
wordpress:
image: wordpress
links:
- wordpress_db:mysql
ports:
- 8080:80
wordpress_db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: examplepassphpmyadmin:image: corbinu/docker-phpmyadminlinks:- wordpress_db:mysqlports:- 8181:80environment:MYSQL_USERNAME: rootMYSQL_ROOT_PASSWORD: examplepass

Bây giờ hãy khởi động lại nhóm ứng dụng:

docker-compose up -d

Bạn sẽ thấy PhpMyAdmin đang được cài đặt. Khi đã hoàn tất, hãy truy cập lại địa chỉ IP của máy chủ của bạn (lần này sử dụng cổng 8181, ví dụ: http://123.456.789.123:8181). Bạn sẽ được chào đón bởi màn hình đăng nhập PhpMyAdmin.

Hãy tiếp tục và đăng nhập bằng tên người dùng rootvà mật khẩu bạn đã đặt trong tệp YAML và bạn có thể duyệt qua cơ sở dữ liệu của mình. Bạn sẽ nhận thấy rằng máy chủ bao gồm một cơ sở dữ liệu wordpress, chứa tất cả dữ liệu từ cài đặt WordPress của bạn.

Bạn có thể thêm nhiều containers như bạn thích theo cách này và liên kết chúng theo bất kỳ cách nào bạn muốn. Như bạn  thấy, phương pháp tiếp cận khá mạnh mẽ - phục hồi cấu hình và điều kiện tiên quyết cho từng thành phần riêng lẻ và cài đặt chúng trên cùng một máy chủ, bạn có thể ghép các mảnh lại với nhau như khối Lego và thêm thành phần theo 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 qua nhiều máy chủ! Mặc dù đó là một bitoutside phạm vi của hướng dẫn này . 

 

Bước 4 - Tạo trang web WordPress

Vì tất cả các tệp cho trang web WordPress mới của bạn được lưu trữ bên trong  Docker container của bạn, điều gì xảy ra với tệp của bạn khi bạn dừng container và bắt đầu lại?

Theo mặc định, tài liệu gốc cho WordPress container là liên tục. Điều này là do hình ảnh WordPress từ Docker Hub được cấu hình theo cách này. Nếu bạn thực hiện thay đổi cho trang web WordPress của mình, hãy ngừng nhóm ứng dụng và bắt đầu lại, trang web của bạn sẽ vẫn có những thay đổi bạn đã thực hiện.

Hãy thử nó.

Truy cập WordPress của bạn từ trình duyệt web (ví dụ: http://123.456.789.123:8080). Chỉnh sửa Hello World! bài đăng đã tồn tại. Sau đó, dừng tất cả các Docker containers bằng lệnh sau:

docker-compose stop

Thử tải lại trang web WordPress. Bạn sẽ thấy rằng trang web bị hỏng. Bắt đầu lại các Docker containers:

docker-compose up -d

Một lần nữa, tải trang web WordPress. Bạn sẽ thấy trang blog của bạn và thay đổi bạn đã thực hiện trước đó. Điều này cho thấy rằng những thay đổi bạn thực hiện được lưu ngay cả khi các containers đã dừng.

 

Bước 5 - Lưu trữ tài liệu gốc trên hệ thống tập tin máy chủ (tùy chọn)

Có thể lưu trữ tài liệu gốc cho WordPress trên hệ thống tập tin lưu trữ bằng cách sử dụng volume dữ liệu Docker để chia sẻ tệp giữa máy chủ và container.

Hãy thử một lần . Mở tệp docker-compose.yml của bạn một lần nữa:

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 ...

Dừng phiên docker-compose hiện đang chạy của bạn: 

docker-compose stop

Loại bỏ container hiện có để chúng ta có thể  ánh xạ volume cho hệ thống tệp lưu trữ:

docker-compose rm wordpress

Khởi động lại  WordPress :

docker-compose -d

Khi dấu nhắc trở lại, WordPress nên được cập nhật và chạy lại - thời gian sử dụng tập tin hệ thống để lưu tài liệu gốc.

Nếu bạn nhìn vào thư mục ~/wordpress của bạn, bạn sẽ thấy rằng bây giờ có một thư mục wp_html trong đó:

ls ~/wordpress

Tất cả các tệp nguồn WordPress nằm bên trong nó. Những thay đổi bạn thực hiện sẽ được WordPress container thu thập trong thời gian thực.

Trải nghiệm này hơi mượt mà hơn bình thường -  WordPress Docker  container được định cấu hình để kiểm tra xem /var/www/html có trống hay không khi nó bắt đầu và sao chép các tệp ở đó một cách thích hợp. Thông thường bạn sẽ phải tự mình làm bước này.

 

Kết Luận 

Bạn nên có một  WordPress đầy đủ triển khai và đang chạy. Bạn sẽ có thể sử dụng cùng một phương pháp để triển khai khá nhiều hệ thống bằng cách sử dụng các hình ảnh có sẵn trên Docker Hub. Hãy chắc chắn tìm ra volumes nào là liên tục và  không phải là cho mỗi container bạn tạo nên.

Happy Dockering!