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