tao docker compose file

Phần 2: Tạo Compose file

Như ở phần 1 mình đã chia sẻ, mình dùng docker và các image của nó để tạo nên blog này. Vậy cùng xem mình đã làm thế nào nhé! Mình sẽ bắt đầu bằng việc tạo một compose file.

Lưu ý: Nhớ xem qua docker là gì và tải về, cài đặt rồi hẳn xem tiếp nha các bạn.

Tạo file compose

Đầu tiên, mình tạo 1 file có tên là docker-compose.yml. Theo định nghĩa trên trang chủ của docker:

The Compose file is a YAML file defining services, networks, and volumes for a Docker application.

Nói nôm na thì file này là một file cấu hình. Nó đóng vai trò trong việc cho docker biết bạn muốn tạo ra các service nào (service đó có thể là server, database, framework, v.v…). Dựa vào file này, docker sẽ pull các image được dùng cho service đó về rồi khởi tạo các container tương ứng.

Nếu bạn thấy chỗ này rối rắm quá thì yên tâm, bạn cứ theo dõi tiếp, mình sẽ cố giải thích rõ ràng nhất ở bên dưới.

Và đây là chi tiết file docker-compose.yml của mình:

version: '3.8'

services:
  my_blog:
    image: wordpress
    container_name: my_blog
    restart: always
    ports:
      - ${WORDPRESS_PORT}:80
    environment:
      - WORDPRESS_DB_HOST=my_db
      - WORDPRESS_DB_USER=${MYSQL_USER}
      - WORDPRESS_DB_PASSWORD=${MYSQL_PASSWORD}
      - WORDPRESS_DB_NAME=${MYSQL_DATABASE}
    volumes:
      - ./my_blog:/var/www/html

  my_db:
    image: mysql:5.7
    container_name: my_db
    restart: always
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE} 
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_ROOT_HOST=%
    ports:
      - ${MYSQL_PORT}:3306
    volumes:
      - ./my_db:/var/lib/mysql

Ở đây mình muốn đảm bảo sẽ không có sai sót trong việc khai báo giá trị cho các biến environment và có thể dễ dàng tái sử dụng chúng nên thay vì truyền thẳng giá trị vào từng vị trí thì mình sẽ dùng ${}.

Vậy làm sao để docker biết được các giá trị này là gì để thực thi?

Để làm được việc đó, mình đã tạo thêm 1 file có tên là .env để khai báo giá trị cho các biến. Và dưới đây là file .env của mình:

WORDPRESS_PORT=1000
MYSQL_PORT=1001
MYSQL_DATABASE=my_database_name
MYSQL_ROOT_USER=root
MYSQL_ROOT_PASSWORD=root#toi_khong_co_dang_pass_len_day_dau
MYSQL_USER=mydb_user
MYSQL_PASSWORD=mydb_user#toi_khong_co_dang_pass_len_day_dau

Các bạn lưu ý đặt đúng tên biến các bạn đã sử dụng trong ${} bên file docker-compose.yml nha.

Giải thích nội dung

Và như đã hứa, mình sẽ giải thích kĩ hơn 1 chút về nội dung trong compose file để bạn hiểu hơn về mục đích của cái file này là gì.

  • version: ở đây chính là version của compose file. Mình dùng version 3.8.
  • services: đây là 1 trong 3 đối tượng được nhắc đến trong định nghĩa về file compose ở trên. Như các bạn thấy, mình tạo ra 2 services gồm có: my_blogmy_db.

Với service my_blog, mình mong muốn đây là một môi trường chạy wordpress nên mình khai báo wordpress ở biến image.

Và tương tự, mình muốn dùng database MySQL làm nơi lưu trữ dữ liệu nên mình sẽ tải image mysql:5.7 (mình thấy image này dùng ổn định nhất).

Với bác nào đang dùng Macbook M1 thì phải dùng mysql/mysql-server nha vì mysql:5.7 không hoạt động được.

Rồi, có thể ai đó sẽ hỏi: “Ơ, thế không có php, không có server thì blog chạy bằng răng à?”. Không, không. Không phải mình quên đâu, mà là trong image WordPress, người ta đã tích hợp sẵn php và nginx ở trong đó rồi.

Trong services

  • container_name không quan trọng lắm, bạn có thể bỏ qua nếu muốn docker container của mình tự generate ra một cái tên.
  • restart: always, mình mong muốn container của mình sẽ luôn restart lại khi có sự cố.
  • ports: đây là biến bạn dùng để khai báo port mà mình muốn dùng để chạy service này. Và nó được map với 1 port bên trong container.
  • environment: nơi bạn thiết lập các biến môi trường cho service của bạn. Ở đây mình khai báo các biến liên quan đến thiết lập kết nối tới database. Đây là những biến được những lập trình viên tạo ra image wordpress và mysql quy định.
  • volumes: mình dùng biến này để tạo ra một symbolic link từ một vị trí bên trong docker container và thư mục hiện tại mình đang đứng (cũng là nơi chứa file docker-compose.yml).

Vì mình biết bên trong docker container của service này, toàn bộ source code của wordpress sẽ nằm ở đường dẫn /var/www/html nên mình đã thiết lập như trên.

Sao mình lại làm vậy ta? Vì chắc chắn bạn sẽ không thích phải vào container ảo của service này, sau đó code toàn bộ project bằng vim, vi, cat v.v… đâu.

Khi bạn khai báo volumes như trên, bạn có thể xem, edit toàn bộ code của mình trong thư mục trên máy bạn bằng một IDE nào đó mà bạn yêu thích. Khi đó, bất cứ một thay đổi nào bạn tạo ra trên source code ở bên ngoài, cũng sẽ dẫn đến thay đổi tương tự bên trong container.

Tuyệt vời phải không nào?

Lưu ý về Volumes

Có một điểm mình phải lưu ý chỗ này. Để docker sinh ra thư mục tương ứng bên ngoài container, bạn phải thiết lập chính xác như mình. Bên trái là một dir path (./name:), chứ không phải name.

Khi bạn không khai báo bằng dir path, docker sẽ hiểu bạn muốn dùng 1 volume có tên là “name” và việc này đòi hỏi bạn sẽ phải khai báo thêm volumes nữa. Mình thấy hơi phiền nên mình triển khai mọi thứ như thế này. Các bạn có chia sẻ gì về điều này thì cứ comment bên dưới cho mình biết với nhé.

Vậy còn 2 đối tượng còn lại là networksvolumes thì sao?

Volumes thì như mình đã chia sẻ ở trên, còn về network thì mình sẽ để cho docker thực hiện mọi thức 1 cách mặc định.

OK, vậy là xong phần Compose file.

Để docker thực thi file này, bạn vào terminal (cmd với Window), trỏ đến thư mục chứa file Composer trên và gõ lệnh:
docker-compose up -d

với -d là Detached mode, container của bạn sẽ được chạy ngầm thay vì bạn cứ phải giữ terminal của mình hoạt động.

Khi bạn gõ lệnh trên, docker sẽ tiến hành pull các image bạn đã khai báo về và tạo các container ảo để khởi chạy các image đó.

Bạn có thể gõ lệnh docker ps để xem các container đã được khởi tạo trên máy nhé.

Và, còn chờ gì nữa. Mở trình duyệt lên và gõ localhost:port_ma_ban_khai_bao để cài đặt wordpress thôi.

Sau khi đọc xong bài viết, có chỗ nào các bạn chưa rõ hoặc mình có sai sót gì, các bạn cứ để lại bình luận bên dưới nhé. Vì biết đâu, nhờ đó mà mình được học thêm 1 kiến thức nào đó mà mình chưa biết.

Cuối cùng, mình sẽ dành phần tiếp theo để chia sẻ lại cách mình đã cài đặt và thiết lập cho blog của mình. Các bạn đón xem nhé.

2 Comments

Trả lời