Cách tạo nhanh và sử dụng một instance MySQL Server bằng Docker

Bài viết này hướng đến đối tượng là các bạn học sinh, sinh viên mới tiếp cận lập trình Web Backend (cũng như các mảng sản phẩm khác có sử dụng đến database).

Client vs Server

Một trong những lầm tưởng phổ biến khi sử dụng MySQL đó là việc các bạn đồng nhất MySQL Wordbench, MySQL Client, và MySQL Server lại làm một. Trước tiên, ta phân biệt client và server.

Server chứa tất cả các component cần thiết để có thể nhận các yêu cầu truy vấn từ client, và thực hiện thao tác đọc/ghi từ các tập tin database để trả lời các câu truy vấn đó. Server lắng nghe các request thông qua một cổng được đăng ký với OS. Nếu không có tùy chỉnh gì thêm, thông thường MySQL Server sẽ nghe tại cổng `3306`.

Trong khi đó, client là bên phát ra yêu cầu. Để làm được điều đó, mọi client đều cần biết đến các thông tin bao gồm server nằm ở đâu (IP, domain…), lắng nghe ở port nào, có thể được truy cập bằng credentials nào, database đích là gì …Client và server có thể nằm ở cùng một máy host hoặc không, nhưng điều đó không thực sự quan trọng và không ảnh hưởng đến sự hoạt động của mỗi bên còn lại.

Workbench vs MySQL CLI vs Programs

Các request không tự nhiên mà được phát đi. Chúng được điều khiển để bởi con người hoặc một chương trình nào đấy. Phổ biến nhất là được điều khiển bởi mã lệnh trong các chương trình. Phần còn lại là bởi các client do con người vận hành: câu lệnh mysql trong gói phần mềm mysql-client, hay phần mềm MySQL Workbench, hay Web App như PHP MyAdmin… Tất cả là các client khác nhau.

Thông thường, khi tải và cài đặt MySQL Workbench, người dùng thường sẽ có tùy chọn để cài đặt bổ sung một server. Đây là lý do tại sao có sự nhầm lẫn được nói đến ở đầu bài. Nếu bạn không thực sự có nhu cầu sử dụng đến Workbench (do đã có client khác thay thế chẳng hạn), bạn không nhất thiết phải cài đặt Workbench để có một server.

On Host vs Docker

Chúng ta hoàn toàn có thể cài đặt MySQL Server trên máy host bằng các package cài đặt (MSI, Deb…) hay qua repository như apt, yum… Tuy nhiên, cho lập trình viên, trên máy dev, việc này có một số nhược điểm:

  • Tốn công sức khi cài đặt, cấu hình, gỡ bỏ
  • Không cài đặt được nhiều server trên cùng một máy: đôi khi chúng ta phát triển nhiều dự án phần mềm cùng lúc, chúng sử dụng nhiều credential khác nhau, nhiều phiên bản khác nhau…

Khi đó, sử dụng MySQL chạy trong container, chẳng hạn bằng Docker, là một lợi thế.

Tạo và khởi động MySQL Container

Sau khi cài đặt thành công Docker, chúng ta có thể tạo ra các container mà có MySQL hoạt động ở trong đó. Trước tiên, tải ảnh docker chứa phiên bản MySQL mà bạn muốn sử dụng:

docker pull mysql:5.7

Bạn có thể thay thế 5.7 bằng tag khác, tham khảo danh mục các tag tại đây.

Một khi đã có ảnh, chúng ta có thể tạo lập một hay nhiều container thông qua câu lệnh docker run:

docker run --name mysql57 -p 6603:3306 -e MYSQL_ROOT_PASSWORD=secret -d mysql:5.7

Giải thích về các tham số:

  • --name mysql57: bạn có thể chọn tên cho container tùy ý, nên đặt dễ nhớ để lần sau bạn có thể khởi động lại container một cách nhanh chóng
  • -p 6603:3306:dùng để nối port của máy host với một port của container. bạn có thể thay thế 6603 thành port mà bạn muốn sử dụng, ta nối với port 3306 của container bởi đó là port màmà instance mysql-server ở trong container đang sử dụng để nghe các request
  • -e MYSQL_ROOT_PASSWORD=123456: tham số -e giúp đặt giá trị cho một biến môi trường trong container, ở đây image mysql được thiết kế để đọc giá trị biến môi trường đó và thực hiện setup mysql-server instance trong lần đầu tiên được khởi động, bạn có thể chọn mật khẩu root tùy ý
  • -d: tham số này là cần thiết để tiến trình bash của câu lệnh được ẩn giấu đi và cointainer sẽ hoạt động như một daemon (service). Nếu không làm thế thì container sẽ tắt ngay khi bạn tắt cửa sổ terminal hay khi nhấn Ctrl-C.

Bạn có thể kiểm tra xem container nào đang hoạt động:

$ docker ps

CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                               NAMES
ec884a808a43   mysql:5.7   "docker-entrypoint.s…"   26 seconds ago   Up 25 seconds   33060/tcp, 0.0.0.0:6603->3306/tcp   mysql57

Như vậy là một MySQL Server đã sẵn sàng chờ request tại cổng 6603 của máy host và bạn có thể sử dụng ngay được.

Container sẽ không bị mất đi chừng nào nó chưa bị xóa bỏ. Khi cần khởi động, chúng ta sử dụng câu lệnh:

docker start mysql57

Một số câu lệnh hữu ích khác:

docker stop mysql57 # Tắt container
docker rm mysql57 # Xóa bỏ

Một số tham số hữu ích khác cho câu lệnh docker run:

  • --network host: cắm thẳng container vào các network interface của máy host, không cần qua docker network và nhờ đó giảm số lượng các tầng abstract, tăng throughput
  • --rm: xóa container ngay sau khi stop
  • -v ${PWD}/mysql_data:/var/lib/mysql : khá hữu dụng để mount thư mục mysql data ở trong container ra ngoài, nếu không dữ liệu database sẽ mất đi sau khi container bị xóa bỏ
  • một số tham số environment khác có thể tham khảo tại https://hub.docker.com/_/mysql

Loading

Leave a Reply

Your email address will not be published. Required fields are marked *