Một số câu hỏi phổ biến nhất mà người dùng của chúng tôi đặt ra liên quan đến hỗ trợ MariaDB trong Docker và đặc biệt là cách nó có thể được sử dụng trong các triển khai sản xuất hoặc phát triển cụ thể. Loạt bài viết này sẽ cố gắng đề cập đến một số trường hợp sử dụng Docker và MariaDB.
Tại sao chọn Docker cho MariaDB?
- Bộ chứa Docker có thể được sử dụng để kiểm tra, triển khai và phát hành ứng dụng trong bất kỳ môi trường nào.
- Việc triển khai Docker có thể được tự động hóa dễ dàng, tạo môi trường triển khai và tái tạo chúng dễ dàng trong quá trình dàn dựng và sản xuất.
- Docker là ảo hóa nhẹ. Người giám sát là không cần thiết và vùng chứa MariaDB Docker sẽ hoạt động tốt như cài đặt MariaDB bình thường mà không có bất kỳ chi phí đáng chú ý nào.
- Docker là bất khả tri - sau khi bạn đã cài đặt Docker trên hệ điều hành của mình, hướng dẫn chạy vùng chứa hoàn toàn giống nhau, cho dù bạn đang chạy CentOS, Debian hay Ubuntu hay thậm chí Mac OS X và Windows.
Một vài điểm quan trọng về vùng chứa Docker
- Vùng chứa Docker là bất biến. Bạn không thể dễ dàng sửa đổi chúng sau khi bắt đầu (trừ khi bạn gắn vào đó và phá vỡ mọi thứ).
- Theo mặc định và do các điều trên, dữ liệu không liên tục. Docker sử dụng khối lượng dữ liệu để khắc phục điều này. Vùng chứa MariaDB sử dụng một ổ đĩa để lưu giữ dữ liệu (sẽ nói thêm về điều này sau).
Trạng thái MariaDB trong Docker
MariaDB đã luôn được hỗ trợ rất tốt trong Docker trong một vài năm, nhờ nhiều nỗ lực của nhóm Docker và cộng đồng. Cho đến ngày nay, Docker hỗ trợ cả ba bản phát hành MariaDB:5.5, 10.0 và 10.1. Bộ chứa MariaDB docker có các đặc điểm sau:
- Mật khẩu gốc MariaDB có thể được đặt hoặc tạo thông qua các biến môi trường.
- Một người dùng mới và một cơ sở dữ liệu trống có thể được tạo thông qua quy trình tương tự như trên.
- Phiên bản có một khối lượng dữ liệu liên tục mặc định / var / lib / mysql, bạn có thể cho phép docker quản lý nội bộ hoặc gắn vào một thư mục mà bạn chọn.
- Phiên bản vùng chứa có thể được gắn trên một ổ dữ liệu hiện có (ví dụ:một bản sao lưu).
- Các cổng mạng có thể được liên kết với các cổng tùy ý ở phía máy chủ.
- Cơ sở kiến thức MariaDB có một bài viết tài liệu mở rộng về docker. Hãy đọc nó!
Trường hợp sử dụng Docker # 1:Thuê nhà nhiều lần
Một trường hợp sử dụng phổ biến cho MariaDB và Docker đang chạy một số phiên bản MariaDB trên cùng một máy chủ vật lý. Hiện đã có các giải pháp như MySQL Sandbox và các giải pháp khác, tuy nhiên không có giải pháp nào trong số chúng cung cấp tính linh hoạt, dễ sử dụng và sức mạnh mà Docker cung cấp.
Để minh họa quan điểm của chúng ta, hãy bắt đầu ba phiên bản khác nhau của MariaDB, mỗi phiên bản chạy một phiên bản chính khác nhau:
docker run -d -p 3301:3306 -v ~/mdbdata/mdb55:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 -v ~/mdbdata/mdb10:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb10 mariadb:10.0
docker run -d -p 3303:3306 -v ~/mdbdata/mdb11:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb11 mariadb:10.1
Docker sẽ tự động lấy các hình ảnh mariadb chính thức từ kho lưu trữ và khởi chạy chúng. Giờ đây, chúng tôi có thể chỉ cần kết nối với bất kỳ trường hợp nào trong số đó bằng cách sử dụng cổng và mật khẩu được cung cấp:
$ mysql -u root -padmin -h 127.0.0.1 -P3302 Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 2 Server version: 10.0.22-MariaDB-1~jessie mariadb.org binary distribution
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
Lưu ý rằng mỗi phiên bản của chúng tôi sẽ sử dụng một khối lượng dữ liệu liên tục nằm trong ~ / mdbdata thư mục - Docker sẽ tự động tạo cây thư mục này cho chúng tôi.
Bây giờ chúng ta đã hoàn thành việc đó, hãy đi sâu vào các tính năng nâng cao của Docker. Docker hỗ trợ các nhóm điều khiển Linux (cgroups), có thể được sử dụng để giới hạn, tính toán hoặc cô lập việc sử dụng tài nguyên. Giả sử chúng tôi muốn phiên bản MariaDB 10.1 (có tên là mdb11 ) để có mức ưu tiên CPU cao hơn hai trường hợp còn lại. Trong trường hợp này, chúng tôi có thể giảm chia sẻ CPU của mdb10 và mdb55 . Mỗi phiên bản có 1024 lượt chia sẻ CPU tối đa theo mặc định, vì vậy hãy tạo lại mdb55 của chúng tôi và mdb10 các thùng chứa có 512 CPU chia sẻ mỗi bộ.
Trong phần mở đầu, chúng tôi đã nói rằng các vùng chứa Docker là bất biến. Nếu chúng tôi muốn thay đổi các thông số của vùng chứa, chúng tôi cần xóa chúng. Đây không phải là vấn đề vì chúng tôi đã xác định khối lượng dữ liệu liên tục trong ~ / mdbdata, vì vậy nội dung thực tế của cơ sở dữ liệu của chúng tôi sẽ vẫn tồn tại khi chúng tôi tạo lại các vùng chứa.
docker rm -f mdb55 mdb10
docker run -d -p 3301:3306 --cpu-shares=512 -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --cpu-shares=512 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
Chúng tôi đã tạo lại hai phiên bản MariaDB với 512 CPU chia sẻ mỗi phiên bản. Tuy nhiên, đây là một giới hạn mềm và chỉ được thực thi khi các quy trình cạnh tranh về chu kỳ CPU. Nếu các phiên bản khác không hoạt động, thì bất kỳ phiên bản nào cũng có thể sử dụng tới 100% tất cả các CPU. Trong thực tế, điều này có nghĩa là nếu cả ba phiên bản sử dụng CPU đồng thời, mỗi phiên bản trong số hai bộ chứa đầu tiên, mỗi bộ chứa 512 chia sẻ, ( mdb55 và mdb10 ) sẽ có thể sử dụng tới 25% tất cả các CPU, trong khi vùng chứa thứ ba, có 1024 lượt chia sẻ, sẽ có thể sử dụng tới 50% tất cả các CPU.
Một tùy chọn khác là liên kết phiên bản với một lõi CPU cụ thể, vì vậy hãy tạo lại các vùng chứa và thực hiện điều đó:
docker rm -f mdb55 mdb10 mdb11
docker run -d -p 3301:3306 --cpuset-cpus=0 -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --cpuset-cpus=1 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
docker run -d -p 3303:3306 --cpuset-cpus=2-3 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb11 mariadb:10.1
Trong ví dụ trên, với hệ thống 4 CPU Core, các vùng chứa của tôi mdb55 và mdb10 mỗi lõi sẽ chạy trên một lõi CPU riêng biệt, trong khi mdb11 cả hai lõi còn lại.
Chúng tôi cũng có thể kiểm soát cách vùng chứa của chúng tôi truy cập vào tài nguyên đĩa và bộ nhớ, điều này chắc chắn hữu ích trên một hệ thống bận rộn - ví dụ:bạn không muốn truy vấn phát triển chạy bằng cách sử dụng tất cả đĩa của các phiên bản thử nghiệm tải của bạn. Trong khi giới hạn bộ nhớ là đơn giản, chia sẻ IO khối hoạt động theo cách tương tự như chia sẻ CPU, ngoại trừ chia sẻ IO khối mặc định là 500 trong phạm vi 10 đến 1000.
Hãy giới hạn hai vùng chứa đầu tiên của chúng ta ở 512M bộ nhớ và 250 lượt chia sẻ IO khối:
docker rm -f mdb55 mdb10
docker run -d -p 3301:3306 --blkio-weight=250 --memory=512M -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --blkio-weight=250 --memory=512M -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
Tương tự như những gì chúng ta đã thấy trong ví dụ về chia sẻ CPU, nếu ba trường hợp cạnh tranh cho IO, mỗi trong số hai vùng chứa đầu tiên sẽ bị giới hạn ở 25% dung lượng IO khả dụng, vùng chứa thứ ba bị giới hạn ở dung lượng còn lại, ví dụ:50%.
Còn nhiều điều khác nữa về các ràng buộc thời gian chạy Docker mà chúng ta đã đề cập ở đây trong bài viết này. Vui lòng đọc tài liệu tham khảo về chạy Docker mở rộng để biết về tất cả các tùy chọn có thể có.