Triển khai MySQL trên Docker: Thiết lập và Quản lý Cơ sở dữ liệu

Tìm kiếm Image MySQL

Để bắt đầu cài đặt MySQL bằng Docker, bước đầu tiên là xác định và tìm kiếm các image MySQL có sẵn trên Docker Hub. Sử dụng lệnh docker search để liệt kê các image liên quan đến MySQL:

root@host:~# docker search mysql
NAME                                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                                                  MySQL is a widely used, open-source relati...   5757      [OK]       
mariadb                                                MariaDB is a community-developed fork of M...   1846      [OK]       
mysql/mysql-server                                     Optimized MySQL Server Docker images. Crea...   397                  [OK]
... (Output có thể khác nhau)

Trong kết quả này, image "mysql" chính là image MySQL chính thức và được khuyến nghị sử dụng.

Tải Image MySQL

Sau khi xác định được image mong muốn, chúng ta sẽ tiến hành tải image MySQL về máy cục bộ. Lệnh docker pull sẽ tải phiên bản latest (mới nhất) nếu không có tag cụ thể nào được chỉ định:

root@host:~# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
2a72cbf407d6: Pull complete 
...
Status: Downloaded newer image for mysql:latest

Để kiểm tra xem image đã được tải thành công hay chưa, bạn có thể sử dụng lệnh docker images:

root@host:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              5195076672a7        11 days ago         371 MB

Chạy Container MySQL

Với image MySQL đã có, chúng ta có thể tạo và khởi động một container MySQL. Lệnh docker run cho phép chúng ta cấu hình các tham số quan trọng như cổng (port), mật khẩu root và vị trí lưu trữ dữ liệu (volumes).

root@host:~# docker run -d \
-p 3308:3306 \
--name my-mysql-db \
-e MYSQL_ROOT_PASSWORD=my_strong_password \
-v ~/docker_volumes/mysql_data:/var/lib/mysql \
-v ~/docker_volumes/mysql_config:/etc/mysql/conf.d \
mysql:latest

Dưới đây là giải thích chi tiết về các tham số được sử dụng:

Tham số Mô tả
-d Chạy container ở chế độ nền (detached mode).
-p 3308:3306 Ánh xạ cổng 3306 bên trong container ra cổng 3308 trên máy chủ. Bạn có thể thay đổi 3308 thành cổng mong muốn khác.
--name my-mysql-db Đặt tên cho container là my-mysql-db. Việc đặt tên giúp dễ dàng quản lý container hơn.
-e MYSQL_ROOT_PASSWORD=my_strong_password Thiết lập mật khẩu cho người dùng root của MySQL. Thay my_strong_password bằng mật khẩu mạnh của bạn.
-v ~/docker_volumes/mysql_data:/var/lib/mysql Gắn kết (mount) thư mục ~/docker_volumes/mysql_data trên máy chủ vào thư mục /var/lib/mysql bên trong container. Điều này đảm bảo dữ liệu MySQL được lưu trữ bền vững bên ngoài container.
-v ~/docker_volumes/mysql_config:/etc/mysql/conf.d Gắn kết thư mục ~/docker_volumes/mysql_config trên máy chủ vào thư mục /etc/mysql/conf.d bên trong container. Sử dụng để thêm các file cấu hình MySQL tùy chỉnh.
mysql:latest Chỉ định image MySQL cần sử dụng, trong trường hợp này là phiên bản mới nhất.

Để xác nhận rằng container MySQL đang chạy, sử dụng lệnh docker ps:

root@host:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
435efc72d00f        mysql:latest        "docker-entrypoint..."   About a minute ago  Up About a minute   0.0.0.0:3308->3306/tcp   my-mysql-db

Truy cập vào Container và Cơ sở dữ liệu MySQL

Bạn có thể truy cập vào môi trường shell bên trong container MySQL để thực hiện các thao tác quản lý hoặc kiểm tra cơ sở dữ liệu. Sử dụng lệnh docker exec:

root@host:~# docker exec -it my-mysql-db bash

Sau khi vào được shell của container, bạn có thể kết nối với server MySQL bằng tài khoản root và mật khẩu đã thiết lập:

root@container-id:/# mysql -u root -pmy_strong_password
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 8.0.28 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
mysql> 

Lệnh exit sẽ đưa bạn trở lại shell của máy chủ.

Khắc phục sự cố thường gặp

Lỗi xác thực MySQL 8

Nếu bạn đang sử dụng MySQL 8 trở lên trong Docker và gặp lỗi khi cố gắng kết nối từ các công cụ client cũ (như MySQL Workbench phiên bản cũ, hoặc các ứng dụng sử dụng driver JDBC cũ) với thông báo "Unable to load authentication plugin 'caching_sha2_password'", đó là do MySQL 8 đã thay đổi cơ chế xác thực mặc định sang caching_sha2_password trong khi các phiên bản trước sử dụng mysql_native_password.

Để khắc phục, bạn cần thay đổi cơ chế xác thực cho người dùng root (hoặc người dùng khác) về mysql_native_password. Thực hiện các lệnh SQL sau khi đã kết nối vào MySQL trong container:

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'my_strong_password';
mysql> FLUSH PRIVILEGES;

Hãy nhớ thay my_strong_password bằng mật khẩu hiện tại của bạn. Sau khi thực hiện, các công cụ client cũ hơn sẽ có thể kết nối.

Tham số kết nối JDBC cho Java Clients

Khi kết nối từ ứng dụng Java sử dụng JDBC driver, đặc biệt với các phiên bản MySQL và driver gần đây, bạn có thể gặp lỗi liên quan đến việc truy xuất khóa công khai (Public Key Retrieval is not allowed). Để giải quyết, hãy thêm tham số allowPublicKeyRetrieval=true vào chuỗi kết nối JDBC của bạn, ví dụ:

jdbc:mysql://localhost:3308/mydatabase?allowPublicKeyRetrieval=true&useSSL=false

Thẻ: docker mysql containerization Database linux

Đăng vào ngày 30 tháng 10 lúc 02:47