MySQL trong Docker là một giải pháp mạnh mẽ và linh hoạt để quản lý cơ sở dữ liệu trong môi trường container hóa. Docker cung cấp một công cụ hiệu quả để triển khai MySQL, giúp bạn dễ dàng cấu hình, mở rộng và bảo trì hệ thống cơ sở dữ liệu của mình.

Đọc bài viết này để hiểu rõ hơn về:

  • Docker MySQL Container là gì?
  • Cách cài đặt Docker MySQL Container
  • Cách cấu hình Docker MySQL Container
  • Cách nâng cấp Docker MySQL Container
  • Một số thao tác cơ bản

MySQL là gì?

MySQL là một hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) phổ biến, được phát triển bởi công ty MySQL AB và hiện tại thuộc sở hữu của Oracle Corporation. MySQL được biết đến với tính hiệu quả, khả năng mở rộng và tính tương thích cao với nhiều hệ điều hành khác nhau như Windows, Linux và macOS. MySQL là một trong những hệ quản trị cơ sở dữ liệu phổ biến nhất trên thế giới và được sử dụng rộng rãi bởi các tổ chức lớn nhỏ.

Đặc điểm chính của MySQL

  • Mã nguồn mở: MySQL là một dự án mã nguồn mở, cho phép người dùng tự do tải về, sử dụng, và thay đổi mã nguồn. Điều này giúp cộng đồng phát triển và tối ưu hóa hệ thống liên tục.
  • Dễ sử dụng: MySQL có giao diện thân thiện và dễ sử dụng, cùng với tài liệu hướng dẫn chi tiết, giúp người dùng dễ dàng cài đặt, cấu hình và quản lý cơ sở dữ liệu.
  • Độ tin cậy: MySQL được thiết kế để cung cấp độ tin cậy cao và tính ổn định cho các ứng dụng quan trọng. Nhiều công ty lớn tin tưởng và sử dụng MySQL cho các hệ thống sản xuất của họ.
  • Khả năng mở rộng: MySQL hỗ trợ nhiều tính năng mở rộng như replication (sao chép dữ liệu) và clustering (tạo cụm) để tăng cường hiệu suất và khả năng mở rộng theo nhu cầu của người dùng.
  • Tính bảo mật: MySQL cung cấp nhiều tính năng bảo mật mạnh mẽ như xác thực người dùng, mã hóa dữ liệu, và quyền truy cập cụ thể cho từng người dùng, giúp bảo vệ dữ liệu khỏi các truy cập trái phép.
  • Tính sẵn sàng: MySQL không chỉ hỗ trợ các giải pháp sao lưu và phục hồi dữ liệu toàn diện mà còn bao gồm các tính năng như replication để đồng bộ hóa dữ liệu giữa nhiều máy chủ và clustering giúp phân tán tải và tăng tính khả dụng của hệ thống. Nhờ đó giúp đảm bảo tính sẵn sàng cao của dữ liệu và giảm thiểu thời gian ngừng hoạt động.

Docker MySQL Container là gì?

Docker là một nền tảng phần mềm mã nguồn mở cho phép tạo, triển khai và quản lý các ứng dụng bên trong các container. Container là các đơn vị độc lập chứa đựng mọi thứ cần thiết để chạy một ứng dụng, bao gồm mã nguồn, runtime, thư viện hệ thống và cài đặt hệ thống. Docker giúp đảm bảo rằng ứng dụng sẽ hoạt động giống nhau trong mọi môi trường, từ máy tính cá nhân của lập trình viên đến các máy chủ trong trung tâm dữ liệu.

Bạn có thể tìm hiểu thêm về Docker là gì.

Docker MySQL là việc sử dụng Docker để triển khai và quản lý MySQL. Sử dụng Docker, bạn có thể dễ dàng tạo và quản lý các instance MySQL, giúp đơn giản hóa quá trình cài đặt, cấu hình, và duy trì MySQL. Việc này giúp đảm bảo tính di động và tính nhất quán của các ứng dụng MySQL trong các môi trường phát triển, thử nghiệm và sản xuất.

Docker Image là một tệp bất biến (immutable), chứa tất cả những gì cần thiết để chạy một ứng dụng bao gồm mã nguồn, thư viện, biến môi trường và các công cụ cần thiết khác. Nó đóng vai trò như một bản mẫu (template) để tạo ra các Docker Container – các phiên bản hoạt động của Image đó.

Docker MySQL Container là một container Docker cụ thể được cấu hình để chạy MySQL. Container này bao gồm tất cả các thành phần cần thiết để chạy MySQL, bao gồm hệ điều hành, MySQL server và các thư viện cần thiết. 

Phân biệt giữa Docker Image và Docker Container

  • Docker Image: Là một tệp template tĩnh. Nó không thay đổi, không chạy và không tiêu thụ tài nguyên hệ thống. Docker Image giống như một kế hoạch (blueprint) cho việc xây dựng Docker Container. Mỗi Docker Image có thể được sử dụng để tạo ra nhiều Docker Containers khác nhau.
  • Docker Container: Là một thực thể động được tạo ra từ Docker Image. Khi bạn khởi chạy một Docker Image, nó sẽ trở thành một Docker Container – một phiên bản hoạt động, độc lập của ứng dụng mà Image mô tả. Container là môi trường runtime (chạy) độc lập, có thể tương tác với hệ thống bên ngoài qua các cổng (ports) đã ánh xạ. Mỗi Docker Container tiêu thụ tài nguyên hệ thống như CPU, bộ nhớ và lưu trữ.

Những lợi ích của việc dùng Docker MySQL Container

  • Isolation (cách ly): Mỗi container chạy độc lập, đảm bảo rằng MySQL instance trong container không bị ảnh hưởng bởi các ứng dụng khác trên cùng máy chủ.
  • Khả năng mở rộng: Docker giúp dễ dàng mở rộng cơ sở dữ liệu MySQL theo chiều ngang hoặc chiều dọc tùy theo nhu cầu của ứng dụng.
  • Tính di động cao: Container MySQL có thể chạy trên bất kỳ môi trường nào hỗ trợ Docker, bao gồm máy tính cá nhân, máy chủ, và các nền tảng đám mây.
  • Quản lý dễ dàng: Docker cung cấp khả năng kiểm soát tài nguyên phân bổ cho container MySQL, giúp tối ưu hóa hiệu suất và đảm bảo hệ thống hoạt động hiệu quả.
  • Kiểm soát phiên bản: Docker cho phép quản lý các phiên bản khác nhau của MySQL và cấu hình của chúng dưới dạng các container riêng biệt, giúp dễ dàng chuyển đổi và thử nghiệm.
  • Đơn giản hóa việc cài đặt và cấu hình: Docker giúp việc cài đặt và cấu hình MySQL trở nên nhanh chóng và dễ dàng hơn nhờ khả năng sử dụng các image đã được cấu hình sẵn.
  • Giảm bớt sự phụ thuộc giữa hệ điều hành và phiên bản MySQL: Sử dụng Docker MySQL Container giúp loại bỏ sự phụ thuộc giữa hệ điều hành của máy chủ và phiên bản MySQL, đảm bảo tính nhất quán và giảm thiểu xung đột phiên bản.

Những trường hợp sử dụng Docker MySQL Container

  • Môi trường phát triển và thử nghiệm (staging environment): Sử dụng Docker để triển khai MySQL trong các môi trường phát triển và thử nghiệm rất hiệu quả, vì nó cho phép nhanh chóng khởi động các cơ sở dữ liệu độc lập. Việc này nhanh hơn và dễ dàng hơn nhiều so với cài đặt MySQL trên một máy ảo đầy đủ.
  • Làm việc với nhiều ứng dụng: Khi bạn làm việc với nhiều ứng dụng cùng lúc, việc sử dụng Docker để chạy MySQL sẽ mang lại sự tách biệt hoàn toàn giữa dữ liệu của mỗi hệ thống. Điều này cho phép mỗi ứng dụng có một cấu hình MySQL server riêng biệt mà không lo xung đột.
  • Đảm bảo tính nhất quán: Docker giúp đảm bảo tính nhất quán trong suốt quá trình phát triển đến triển khai. Nếu phiên bản sản xuất sử dụng cùng một Docker image như trong phát triển, bạn có thể chắc chắn rằng hệ thống sẽ hoạt động như mong đợi.
  • Dễ dàng bảo trì: Khi sử dụng Docker, bạn có thể dễ dàng triển khai các bản cập nhật, phục hồi từ các bản sao lưu và quản lý các phiên bản khác nhau của MySQL một cách dễ dàng mà không cần lo lắng về sự khác biệt trong cấu hình hoặc môi trường hệ điều hành.

Trường hợp không nên sử dụng Docker MySQL

Môi trường sản xuất yêu cầu cao: Trong các môi trường sản xuất đòi hỏi cao, một máy chủ MySQL chuyên dụng có thể là lựa chọn tốt hơn.

Mặc dù Docker có chi phí hiệu năng (overhead) không đáng kể, nhưng đối với các tác vụ cần nhiều I/O (Input/Output performance) như cơ sở dữ liệu có nhiều thao tác ghi, những chi phí này có thể tích lũy và ảnh hưởng đến hiệu suất tổng thể. Trong những trường hợp này, sử dụng một máy chủ MySQL trực tiếp trên bare-metal (*) có thể mang lại hiệu suất tốt hơn.

* Bare-metal server là một hình thức dịch vụ đám mây trong đó người dùng thuê một máy vật lý từ nhà cung cấp và không chia sẻ tài nguyên với bất kỳ bên thuê nào khác. Điểm đặc biệt là bare-metal không có lớp ảo hóa như máy ảo hoặc container, giúp tránh những chi phí xử lý thêm và sự chậm trễ liên quan đến việc chạy trên phần mềm ảo hóa.

Cài đặt Docker MySQL Container

Bước 1: Cài đặt Docker

Trước khi tiến hành cài đặt MySQL Container, bạn cần đảm bảo rằng Docker đã được cài đặt trên hệ thống của mình. Nếu chưa cài đặt, bạn có thể tải và cài đặt Docker tại đây.

Bước 2: Cài đặt Docker Image cho MySQL

Bắt đầu bằng cách tải Docker Image phù hợp cho MySQL. Bạn có thể chọn tải phiên bản cụ thể hoặc phiên bản mới nhất bằng cách sử dụng lệnh sau:

sudo docker pull mysql/mysql-server:latest

mysql docker - itviec blog

Nếu bạn cần một phiên bản MySQL cụ thể, thay thế latest bằng số phiên bản mong muốn như sau:

sudo docker pull mysql/mysql-server:5.7

Để kiểm tra xem image đã được lưu trữ cục bộ chưa bằng cách hãy liệt kê các Docker images đã tải về với cú pháp sau:

sudo docker images | grep mysqlsudo docker images

Kết quả trả về sẽ bao gồm mysql/mysql-server trong danh sách các images đã tải như sau:

mysql docker - itviec blog

Bước 3: Triển khai và khởi động MySQL Container

Sau khi tải image từ Docker repository, bạn có thể triển khai một MySQL Container mới bằng cú pháp sau:

sudo docker run --name=[container_name] -d [image_tag_name]

Trong đó:

  • Thay [container_name] bằng tên mong muốn của bạn. Nếu không đặt tên, Docker sẽ tự động chọn một tên mặc định.
  • -d: là một tùy chọn trong lệnh Docker. Khi sử dụng -d, Docker sẽ chạy container dưới dạng một dịch vụ (service) và đặt nó ở chế độ nền (background). Điều này có nghĩa là sau khi bạn khởi chạy container, bạn sẽ không thấy đầu ra của nó trực tiếp trên terminal. Thay vào đó, container sẽ chạy ngầm và bạn có thể tiếp tục sử dụng terminal cho các lệnh khác.

Tiếp theo, thay thế [image_tag_name] bằng tên của image đã tải ở bước trước. Ví dụ, bạn có thể tạo một container tên mysql_docker với tag phiên bản mới nhất với cú pháp như sau:

sudo docker run --name=[container_name] -d mysql/mysql-server:latest

Để kiểm tra xem Docker MySQL Container đã chạy hay chưa, ta sử dụng cú pháp sau:

docker ps

Cú pháp trên sẽ hiển thị thông tin của container mới tạo, bao gồm trạng thái của môi trường ảo. Thông thường khi container mới khởi động, trạng thái của nó sẽ là health: starting, cho thấy quá trình khởi động và thiết lập đang diễn ra.

Sau khi hoàn tất quá trình này, trạng thái sẽ chuyển thành healthy, cho thấy container đã sẵn sàng và hoạt động bình thường.

mysql docker - itviec blog

Bước 4: Tìm mật khẩu root đã được tạo

Tiếp theo, mở file log của Docker MySQL Container để tìm mật khẩu root đã được tạo: 

docker logs [container_name]

Sau khi chạy lệnh trên, bạn sẽ thấy các dòng log được hiển thị. Tìm dòng chứa GENERATED ROOT PASSWORD:. Dòng này sẽ cho bạn biết mật khẩu root đã được tạo tự động. Mật khẩu này được tạo tự động bởi Docker khi container MySQL được khởi chạy lần đầu tiên.

mysql docker - itviec blog

Bước 5: Kết nối với Docker MySQL Container

Có ba cách để kết nối với MySQL Server chạy trong Docker:

Cách 1: Kết nối từ máy chính (Host Machine):

Để kết nối với MySQL Container, bạn cần ánh xạ (map) port của container với port trên máy chủ bằng lệnh sau khi khởi động container:

docker run --name=mysql_docker -d -p 3306:3306 mysql/mysql-server:latest

Sau đó, bạn cần đảm bảo rằng gói MySQL Client đã được cài đặt với cú pháp sau:

apt-get install mysql-client

Sau đó, sử dụng lệnh sau để kết nối với MySQL Container từ máy chính:

mysql -u root -p -h 0.0.0.0 -P 3306

Cách 2: Kết nối từ bên trong Docker Container:

Sau khi khởi động container, bạn có thể kết nối vào shell bash của MySQL Container bằng cú pháp sau:

docker exec -it [container_name] bash

Sau khi vào được bash shell, bạn cần chạy lệnh sau để kết nối vào MySQL:

mysql -u root -p

Cách 3: Kết nối bằng IDE (MySQL Workbench):

Bạn cũng có thể kết nối với MySQL Container bằng một công cụ IDE như MySQL Workbench hoặc một IDE khác có hỗ trợ MySQL. Các bước thiết lập như sau:

  • Mở MySQL Workbench hoặc IDE bạn muốn sử dụng.
  • Thiết lập một kết nối mới với các thông tin sau:
    • Hostname: 127.0.0.1 (localhost).
    • Port: 3306.
    • Username: root.
    • Password: Nhập mật khẩu đã thiết lập ở bước 3.
  • Test Connection: Kiểm tra kết nối để đảm bảo rằng bạn có thể truy cập vào MySQL Server.

Sau khi kết nối thành công, bạn có thể sử dụng giao diện đồ họa của IDE để quản lý cơ sở dữ liệu, thực hiện các truy vấn SQL, và thao tác với dữ liệu dễ dàng hơn.

Bước 6: Thay đổi mật khẩu root

Sau khi kết nối thành công, hãy thay đổi mật khẩu máy chủ gốc để bảo vệ thông tin của bạn với cú pháp sau:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '[newpassword]';

Thay [newpassword] bằng mật khẩu mạnh mong muốn.

mysql docker - itviec blog

Cách cấu hình Docker MySQL Container

Nếu bạn muốn xem trước cấu hình Docker MySQL Container của mình, bạn có thể tìm thấy nó trong mục ‘/etc/mysql/my.cnf=’. Nếu bạn muốn sửa đổi cấu hình, bạn cần tạo một tệp cấu hình thay thế trên máy chủ và gắn chúng vào Docker MySQL Container.

Bước 1: Tạo thư mục mới trên máy chủ với cú pháp sau:

sudo mkdir -p /root/docker/[container_name]/conf.d

=> Thay thế [container_name] bằng tên của container bạn muốn tạo.

Bước 2: Tạo một file cấu hình MySQL tùy chỉnh trong thư mục vừa tạo bằng lệnh sau:

sudo nano /root/docker/[container_name]/conf.d/my-custom.cnf

Bước 3: Mở file và thêm các dòng cấu hình bạn mong muốn. Ví dụ, để tăng số lượng kết nối tối đa lên 250 ta sử dụng cú pháp sau:

[mysqld] 

max_connections=250

mysql docker - itviec blog

Bước 4: Lưu tệp và thoát khỏi trình chỉnh sửa. Sau đó, để thay đổi có hiệu lực, bạn cần xóa và khởi động lại container MySQL và ánh xạ đường dẫn thư mục cấu hình theo cú pháp sau:

docker run 
--detach 
--name=[container_name] --env="MYSQL_ROOT_PASSWORD=[my_password]" 
--publish 6603:3306 --volume=/root/docker/[container_name]/conf.d:/etc/mysql/conf.d mysql

=> Thay [container_name] bằng tên container của bạn và [my_password] bằng mật khẩu bạn muốn đặt cho tài khoản root.

Bước 5: Để kiểm tra xem Docker MySQL Container đã tải cấu hình từ máy chủ hay chưa, ta sử dụng lệnh sau:

mysql -uroot -pmypassword -h127.0.0.1 -P6603 -e 'show global variables like "max_connections"';

=> Thay [my_password] bằng mật khẩu bạn đã đặt cho tài khoản root.

Bước 6: Kiểm tra lại số lượng kết nối tối đa cho Docker MySQL Container, nếu cấu hình đúng, số lượng kết nối sẽ là 250.

Cách nâng cấp Dockerised MySQL Container

Bước 1: Trước khi nâng cấp, bạn cần sao lưu dữ liệu hiện có để đảm bảo có thể khôi phục nếu quá trình nâng cấp gặp sự cố với lệnh sau:

docker exec [container_name] mysqldump -u root -p[password] --all-databases > /path/to/backup.sql

Thay thế [container_name] bằng tên của container MySQL hiện tại, [password] bằng mật khẩu root của bạn và đường dẫn /path/to/backup.sql chỉ định nơi bạn muốn lưu tệp sao lưu.

Bước 2: Trước tiên, bạn cần dừng MySQL Server hiện tại để đảm bảo không có giao dịch đang xử lý bị gián đoạn bằng lệnh sau:

docker stop [container_name]

Ví dụ: để dừng một container có tên là mysql57, ta thực hiện lệnh sau:

docker stop mysql57

Bước 3: Tải MySQL 8.0 Server Docker image và đảm bảo bạn có đúng thẻ (tag) cho MySQL 8.0.

docker pull mysql/mysql-server:8.0

Bước 4: Khởi động một Docker Container MySQL 8.0 mới với cấu hình cũ và dữ liệu máy chủ đã được áp dụng trên máy chủ với lệnh sau:

docker run --name=mysql80
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf --mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql 
-d mysql/mysql-server:8.0

Thay thế /path-on-host-machine/my.cnf/path-on-host-machine/datadir bằng đường dẫn thực tế đến tệp cấu hình và thư mục dữ liệu trên máy chủ của bạn.

Bước 5: Chờ cho máy chủ hoàn tất khởi động. Bạn có thể kiểm tra trạng thái của máy chủ bằng lệnh sau:

docker ps

Bước 6: Sau khi nâng cấp, bạn cần chạy tiện ích mysql_upgrade để đảm bảo cơ sở dữ liệu tương thích với phiên bản mới bằng lệnh sau:

docker exec -it mysql80 mysql_upgrade -uroot -p

Bước 7: Nhập mật khẩu root cho MySQL Server cũ và hoàn tất nâng cấp bằng cách khởi động lại MySQL Server Container với cú pháp:

docker restart mysql80

Với các bước như trên, bạn đã nâng cấp thành công Docker MySQL Container từ phiên bản cũ lên MySQL 8.0. Hãy đảm bảo bạn đã sao lưu dữ liệu trước khi tiến hành các bước để bảo vệ dữ liệu của bạn trong trường hợp có sự cố.

Một số thao tác cơ bản lên MySQL Container 

Khởi động MySQL Container

Để khởi động MySQL container, sử dụng lệnh sau:

sudo docker start [container_name]

Dừng MySQL Container

Để dừng MySQL container, sử dụng lệnh sau:

sudo docker stop [container_name]

Khởi động lại MySQL Container

Để khởi động lại MySQL container, sử dụng lệnh sau:

sudo docker restart [container_name]

Xóa MySQL Container

Trước khi xóa một MySQL container, hãy đảm bảo rằng bạn đã dừng nó trước. Sử dụng lệnh sau để dừng container:

sudo docker stop [container_name]

Sau đó, để xóa container, sử dụng lệnh sau:

sudo docker rm [container_name]

=> Thay [container_name] bằng tên của container bạn muốn khởi động.

Câu hỏi thường gặp

Những tùy chọn chính nào tôi nên cấu hình khi thiết lập container MySQL trên Docker?

Khi cấu hình container MySQL trên Docker, bạn nên chú ý đến các tùy chọn sau để tối ưu hóa hiệu suất, bảo mật và sử dụng tài nguyên:

Hiệu suất:

  • innodb_buffer_pool_size: Quy định bộ nhớ dành cho buffer pool của InnoDB, giúp tăng tốc độ truy cập dữ liệu.
  • query_cache_size: Điều chỉnh kích thước bộ nhớ cache cho các truy vấn, cải thiện hiệu suất cho các truy vấn lặp lại.
  • thread_pool_size: Xác định số kết nối đồng thời tối đa mà máy chủ có thể xử lý.

Bảo mật:

  • bind-address: Giới hạn máy chủ MySQL chỉ lắng nghe trên các giao diện mạng cụ thể.
  • mysql_bind_host: Cho phép gán máy chủ MySQL vào các địa chỉ IP cụ thể.
  • validate_password_policy: Kích hoạt yêu cầu mật khẩu nghiêm ngặt hơn.

Sử dụng tài nguyên:

  • max_connections: Quy định số kết nối đồng thời tối đa cho phép.
  • innodb_file_per_table: Lưu trữ mỗi bảng InnoDB trong một tập tin riêng biệt.
  • innodb_io_capacity: Đặt IOPS (Input/Output Operations Per Second) cho hệ thống lưu trữ.

Làm thế nào để bảo vệ dữ liệu trong container MySQL Docker?

Để bảo vệ dữ liệu trong container MySQL Docker, bạn cần tạo và sử dụng volumes để lưu trữ dữ liệu một cách bền vững. Dưới đây là các bước cơ bản:

Bước 1: Tạo Volume mới với cú pháp sau:

docker volume create my-mysql-data

Lệnh này tạo một khu vực lưu trữ trên hệ thống tệp của bạn cho volume, đảm bảo dữ liệu container được lưu trữ một cách độc lập.

Bước 2: Khởi Động lại Container với Volume đã Gán với lệnh sau:

docker stop my-mysql; docker rm my-mysql
docker run \
   --name my-mysql \
   -v my-mysql-data:/var/lib/mysql \
   -e MYSQL_ROOT_PASSWORD=strong_password \
   -d mysql

Câu lệnh -v volume_name:/var/lib/mysql gán volume đã tạo vào thư mục lưu trữ dữ liệu trong container. Bằng cách này, dữ liệu sẽ được lưu trữ trên volume và vẫn còn sau khi container bị dừng hoặc xóa.

Việc sử dụng volumes giúp dữ liệu luôn khả dụng, chia sẻ dữ liệu giữa các container, sao lưu dễ dàng, và cải thiện hiệu suất.

Tổng kết

Việc triển khai MySQL trong Docker cung cấp một cách tiếp cận linh hoạt và hiệu quả cho việc quản lý cơ sở dữ liệu. Docker không chỉ giúp tối ưu hóa việc quản lý dữ liệu mà còn hỗ trợ việc bảo trì và mở rộng hệ thống một cách dễ dàng. Với khả năng bảo mật và hiệu suất cao, MySQL trong Docker là giải pháp lý tưởng cho môi trường phát triển và sản xuất.

ITviec hy vọng bài viết trên đã giúp bạn có cái nhìn tổng quan hơn về MySQL Docker và MySQL Docker Container.