Docker là một trong những nền tảng phổ biến hơn để phát triển và triển khai các ứng dụng được đóng gói. Bộ chứa là môi trường biệt lập chứa ứng dụng cùng với tất cả các gói phần mềm cần thiết. Với Docker, bạn có thể chạy hoặc mở rộng quy mô ứng dụng của mình trong mọi môi trường
MySQL là một trong những cơ sở dữ liệu quan hệ tương thích với SQL phổ biến nhất. Chạy MySQL bên trong bộ chứa Docker cho phép bạn tách cơ sở dữ liệu khỏi mã của mình. Bạn cũng có thể sử dụng bộ điều phối vùng chứa như Kubernetes để mở rộng quy mô MySQL độc lập với phiên bản máy chủ API của bạn
Sử dụng vùng chứa mang lại cho bạn lợi ích về tính nhất quán. Sau khi xây dựng xong hệ thống của mình, bạn có thể triển khai các bộ chứa của mình lên đám mây mà không cần cài đặt và định cấu hình MySQL theo cách thủ công trên phần cứng kim loại thô
Trong bài viết này, bạn sẽ tìm hiểu cách Dockerize cơ sở dữ liệu của mình, những điều bạn cần biết trước tiên và lý do bạn nên thử nó
Lập kế hoạch triển khai của bạn
Mặc dù sử dụng Docker với MySQL giúp đơn giản hóa nhiều khía cạnh trong quá trình triển khai của bạn, chẳng hạn như cài đặt máy chủ và tạo cơ sở dữ liệu, nhưng nó có một số vấn đề kỹ thuật. Đáng kể nhất là lưu trữ dữ liệu. Docker được thiết kế chủ yếu xung quanh các thùng chứa không trạng thái, trong khi cơ sở dữ liệu MySQL vốn có trạng thái
Bạn cần sử dụng Docker volume khi triển khai MySQL container. Các ổ đĩa cung cấp một cơ chế để duy trì các tệp sau khi vùng chứa dừng lại. Bạn sẽ mất cơ sở dữ liệu nếu khởi động lại bộ chứa MySQL không sử dụng ổ đĩa
Khối lưu trữ dữ liệu bên ngoài bất kỳ vùng chứa nào. Sau khi bộ chứa MySQL của bạn dừng, các tệp được lưu trữ trong ổ đĩa được gắn của nó sẽ vẫn có thể truy cập được trên máy chủ của bạn. Bạn có thể gắn ổ đĩa trở lại vào vùng chứa mới, tránh mất dữ liệu sau khi bạn thay thế phiên bản MySQL của mình bằng phiên bản hình ảnh mới
Các trường hợp sử dụng cho MySQL trong Docker
Dockerized MySQL hoạt động tốt trong các môi trường phát triển và dàn dựng nơi bạn muốn nhanh chóng hiển thị các phiên bản cơ sở dữ liệu bị cô lập. Việc khởi động cơ sở dữ liệu trong Docker nhanh hơn và dễ dàng hơn nhiều so với việc định cấu hình cài đặt MySQL thông thường trong một máy ảo đầy đủ
Mặc dù bạn có thể chạy MySQL cục bộ trên máy chủ của mình, nhưng điều này trở nên hạn chế khi bạn đang làm việc trên nhiều ứng dụng cùng lúc. Việc sử dụng các thùng chứa cung cấp sự phân tách hoàn toàn dữ liệu của từng hệ thống và khả năng cung cấp cấu hình máy chủ MySQL duy nhất cho từng hệ thống
Có một số trường hợp việc chọn Dockerize cơ sở dữ liệu của bạn có thể ít ảnh hưởng hơn. Yêu cầu môi trường sản xuất có thể tốt hơn với máy chủ MySQL chuyên dụng. Tổng chi phí hoạt động của Docker rất khiêm tốn nhưng có thể chồng chất lên nhau trong các khối lượng công việc nặng về I/O như khối lượng công việc của cơ sở dữ liệu nặng về ghi. Một máy chủ sản xuất kim loại trần cũng giúp những người có vai trò bảo trì cơ sở dữ liệu không quen thuộc với Docker có thể truy cập phiên bản của bạn
Tuy nhiên, Docker hoàn toàn có khả năng hỗ trợ triển khai cơ sở dữ liệu MySQL, từ môi trường phát triển cục bộ cho đến sản xuất. Sử dụng nó cho toàn bộ chu kỳ của bạn đảm bảo tính nhất quán. Nếu phiên bản sản xuất của bạn sử dụng cùng một hình ảnh Docker khi phát triển, thì bạn có thể chắc chắn rằng hệ thống trực tiếp của mình sẽ hoạt động như dự đoán. Đây là cách để máy chủ MySQL chạy trong bộ chứa Docker
Bắt đầu vùng chứa MySQL của bạn
MySQL có hình ảnh Docker chính thức có sẵn trên Docker Hub. Trước tiên hãy xác định thẻ hình ảnh bạn nên sử dụng. Phiên bản MySQL 5. 6, 5. 7 và 8. 0 có sẵn
Thẻ
docker exec -it mysql mysql -p
3 trỏ đến bản phát hành mới nhất, hiện tại là 8. 0. Tránh sử dụng thẻ này, vì điều đó có nghĩa là bạn có thể vô tình nhận được bản nâng cấp phiên bản MySQL chính trong tương lai. Tham chiếu cụ thể phiên bản bạn muốn cho phép tiếp cận các bản cập nhật được kiểm soát nhiều hơnBắt đầu một bộ chứa MySQL lần đầu tiên sẽ tự động tạo một người dùng
docker exec -it mysql mysql -p
4 ban đầu. Bạn cần cung cấp mật khẩu cho người dùng này hoặc yêu cầu MySQL tạo một mật khẩu. Đây là một ví dụ về việc chạy bộ chứa MySQL cơ bản với mật khẩu gốc được chỉ địnhdocker run --name mysql -d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=change-me \
--restart unless-stopped \
mysql:8
Lệnh này bắt đầu một vùng chứa với MySQL 8. Mật khẩu cho người dùng
docker exec -it mysql mysql -p
4 được đặt thủ công. Cờ docker exec -it mysql mysql -p
6 có nghĩa là vùng chứa sẽ chạy ở chế độ nền cho đến khi dừng, độc lập với phiên cuối của bạn. Bạn có thể xem nhật ký khởi động của vùng chứa bằng docker exec -it mysql mysql -p
7. Khi “sẵn sàng kết nối” xuất hiện, cơ sở dữ liệu MySQL của bạn có thể truy cập đượcTham số
docker exec -it mysql mysql -p
8 hướng dẫn Docker luôn khởi động lại container. Điều này có nghĩa là cơ sở dữ liệu MySQL của bạn sẽ chạy mà không cần can thiệp sau khi máy chủ khởi động lại hoặc cập nhật daemon Docker. Chính sách docker exec -it mysql mysql -p
9 được sử dụng ở đây sẽ không khởi động vùng chứa nếu bạn dừng thủ công vùng chứa bằng docker stop mysql
docker rm mysql
0Cờ
docker stop mysql
docker rm mysql
1 của Docker cho phép chuyển tiếp cổng vào vùng chứa để bạn có thể truy cập cơ sở dữ liệu của mình trên docker stop mysql
docker rm mysql
2. Đây là cổng MySQL mặc định; . Sử dụng ứng dụng khách MySQL yêu thích của bạn để kết nối qua cổng này với docker exec -it mysql mysql -p
4 và mật khẩu bạn đã chọn làm thông tin đăng nhập người dùngNếu không bật chuyển tiếp cổng, bạn chỉ có thể truy cập cơ sở dữ liệu của mình từ bên trong vùng chứa. Bạn có thể làm điều này bất cứ lúc nào bằng cách sử dụng
docker stop mysql
docker rm mysql
4 để lấy vỏ bên trong thùng chứadocker exec -it mysql mysql -p
Lệnh này chạy
docker stop mysql
docker rm mysql
5 bên trong vùng chứa docker stop mysql
docker rm mysql
6. Cờ docker stop mysql
docker rm mysql
7 có nghĩa là luồng đầu vào của thiết bị đầu cuối của bạn sẽ được chuyển tiếp đến vùng chứa dưới dạng TTY tương tácDữ liệu liên tục với khối lượng
Mặc dù vùng chứa được tạo ở trên là một máy chủ MySQL hoạt động đầy đủ, nhưng bạn cần thiết lập các ổ đĩa để dữ liệu của bạn không bị mất khi vùng chứa dừng lại. Hình ảnh Docker của MySQL được định cấu hình để lưu trữ tất cả dữ liệu của nó trong thư mục
docker stop mysql
docker rm mysql
8. Việc gắn một ổ đĩa vào thư mục này sẽ cho phép lưu trữ dữ liệu liên tục tồn tại lâu hơn bất kỳ phiên bản vùng chứa nàoDừng và xóa vùng chứa trước đó của bạn để tránh xung đột về tên
________số 8
Sau đó bắt đầu một vùng chứa mới với cấu hình đã sửa đổi
docker exec -it mysql mysql -p
9Sử dụng lệnh này để khởi động bộ chứa MySQL của bạn sẽ tạo một khối Docker mới có tên là
docker stop mysql
docker rm mysql
6. Nó sẽ được gắn vào vùng chứa tại docker stop mysql
docker rm mysql
8, nơi MySQL lưu trữ các tệp dữ liệu của nó. Mọi dữ liệu được ghi vào thư mục này giờ đây sẽ được lưu trữ trong suốt trong ổ đĩa do Docker quản lý trên máy chủ của bạnLặp lại các bước để dừng và xóa vùng chứa của bạn
________số 8
Lặp lại lệnh
docker exec -it mysql mysql -p
91 với các đối số tương tự. Vì ổ đĩa có tên docker stop mysql
docker rm mysql
6 đã tồn tại, vùng chứa mới sẽ giữ lại dữ liệu được tạo bởi vùng chứa cũ. Nếu bạn muốn hủy tập đĩa, hãy sử dụng docker exec -it mysql mysql -p
93Sử dụng mạng vùng chứa
Trong các ví dụ trên, chuyển tiếp cổng được sử dụng để hiển thị máy chủ MySQL trên mạng máy chủ lưu trữ của bạn. Nếu bạn chỉ kết nối với MySQL từ bên trong một bộ chứa Docker khác, chẳng hạn như máy chủ API của bạn, thì cách tiếp cận tốt hơn là tạo một mạng Docker chuyên dụng. Điều này cải thiện bảo mật bằng cách hạn chế tiếp xúc với cơ sở dữ liệu của bạn
Đầu tiên tạo một mạng Docker cho ứng dụng của bạn
docker run --name mysql -d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=change-me \
--restart unless-stopped \
mysql:8
6Chỉ định mạng này khi bắt đầu bộ chứa MySQL của bạn
docker run --name mysql -d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=change-me \
--restart unless-stopped \
mysql:8
7Kết nối một vùng chứa khác với cùng một mạng
docker run --name mysql -d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=change-me \
--restart unless-stopped \
mysql:8
8Bộ chứa API và MySQL của bạn hiện chia sẻ một mạng. Bạn có thể kết nối với MySQL từ bộ chứa API của mình bằng cách tham khảo tên máy chủ của bộ chứa MySQL. Tên này khớp với tên của vùng chứa theo mặc định. Tại đây, ứng dụng của bạn sẽ kết nối với cổng 3306 trên máy chủ
docker stop mysql
docker rm mysql
6Cấu hình MySQL
Hình ảnh MySQL chính thức hỗ trợ một số biến môi trường mà bạn có thể sử dụng để định cấu hình trạng thái ban đầu của bộ chứa. Bạn đã thấy một cái,
docker exec -it mysql mysql -p
95. Sử dụng cờ docker exec -it mysql mysql -p
96 với docker exec -it mysql mysql -p
91 để đặt từng biến này. Chúng chỉ được tôn trọng khi vùng chứa khởi động lần đầu tiên, khi thư mục dữ liệu MySQL trống
98 - Tên của lược đồ cơ sở dữ liệu sẽ được tạo khi vùng chứa khởi độngdocker exec -it mysql mysql -p
99 vàdocker exec -it mysql mysql -p
0 - Tạo người dùng thông thường mới khi vùng chứa bắt đầudocker stop mysql docker rm mysql
1 - Đặt cái này thay vìdocker stop mysql docker rm mysql
95 nếu bạn muốn MySQL tạo mật khẩudocker exec -it mysql mysql -p
4 an toàn cho bạn. Nếu bạn bật cài đặt này, mật khẩu sẽ được gửi vào nhật ký của bộ chứa [có thể truy cập qua lệnhdocker exec -it mysql mysql -p
4] trong lần khởi động đầu tiên. Sẽ không thể lấy lại mật khẩu sau đódocker stop mysql docker rm mysql
5 - Cài đặt này sẽ tạo người dùngdocker stop mysql docker rm mysql
4 với mật khẩu trống. Chỉ sử dụng tùy chọn này cho các phiên bản cơ sở dữ liệu tạm thời. Nó không an toàn và sẽ cho phép bất kỳ ai kết nối với MySQL với các đặc quyền siêu người dùngdocker exec -it mysql mysql -p
Sử dụng các biến môi trường này có nghĩa là giá trị của chúng sẽ hiển thị với bất kỳ ai có thể
docker stop mysql
docker rm mysql
7 vùng chứa của bạn. Một cách tiếp cận an toàn hơn là sử dụng các bí mật hoặc khối lượng của Docker để thêm các giá trị dưới dạng tệpHình ảnh MySQL hỗ trợ một biến thể bổ sung của từng biến trên. Hậu tố tên của một biến với
docker stop mysql
docker rm mysql
8 để giá trị của nó được hiểu là đường dẫn đến tệp chứa giá trị thực. Ví dụ này đặt mật khẩu của người dùng docker exec -it mysql mysql -p
4 một cách an toàn theo cách không thể kiểm tra được từ bên ngoài vùng chứadocker exec -it mysql mysql -p
5Mật khẩu được ghi vào một tệp được gắn vào vùng chứa bằng cách sử dụng ổ đĩa Docker. MySQL hướng dẫn rằng mật khẩu được lấy từ tệp được gắn kết đó bằng biến môi trường
docker run --name mysql -d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=change-me \
--restart unless-stopped \
mysql:8
60. Bất kỳ ai đang xem các biến môi trường của vùng chứa sẽ thấy đường dẫn tệp thay vì mật khẩu văn bản thuần túyTạo một hình ảnh tùy chỉnh
Có thể hữu ích khi tạo hình ảnh Docker của riêng bạn nếu ứng dụng của bạn yêu cầu cấu hình MySQL tùy chỉnh. Thêm các lớp bổ sung trên hình ảnh cơ sở chính thức của MySQL sẽ cung cấp cho bạn một hình ảnh sẵn sàng sử dụng, nơi bạn có thể bỏ qua việc tiêm tệp cấu hình MySQL theo cách thủ công
Đây là một ví dụ
docker run --name mysql -d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=change-me \
--restart unless-stopped \
mysql:8
61 thay đổi một số cài đặt MySQLdocker exec -it mysql mysql -p
8Hình ảnh MySQL tải các tệp cấu hình được lưu trữ trong thư mục
docker run --name mysql -d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=change-me \
--restart unless-stopped \
mysql:8
62. Các tệp sẽ chỉ được đọc khi máy chủ MySQL khởi động, đó là khi bạn khởi động bộ chứa Docker của mình. Để đưa cấu hình của bạn vào vùng chứa của bạn, hãy sử dụng một ổ đĩa Docker khác để liên kết gắn tệp của bạn hoặc sử dụng Dockerfile để đưa các thay đổi của bạn vào một hình ảnh mớidocker exec -it mysql mysql -p
0Xây dựng hình ảnh của bạn
docker exec -it mysql mysql -p
1Bây giờ bạn có thể chạy hình ảnh của mình để bắt đầu phiên bản MySQL tự động sử dụng tệp cấu hình của bạn
docker exec -it mysql mysql -p
2Vì hình ảnh tùy chỉnh của bạn dựa trên phiên bản Docker Hub chính thức, nên bạn có thể sử dụng tất cả các biến môi trường hiện có được mô tả ở trên
Sự kết luận
Chạy MySQL trong bộ chứa Docker cung cấp tính nhất quán và cách ly giữa các môi trường cho việc triển khai cơ sở dữ liệu của bạn. Bạn có thể sử dụng hình ảnh MySQL chính thức hoặc tạo hình ảnh tùy chỉnh
Khi bạn đã sẵn sàng chuyển sang sản xuất, bạn có thể sử dụng lại quy trình phát triển của mình để đưa cơ sở dữ liệu của bạn vào hoạt động. Tự động hóa quy trình bằng cách khởi chạy các bộ chứa trong quy trình CI/CD của bạn, nơi các công cụ như Earthly có thể cung cấp các bản dựng lặp lại và thông tin chi tiết về bất kỳ lỗi nào. Earthly cung cấp daemon Docker theo yêu cầu và khả năng tái tạo cao để giúp bạn tự động hóa các bản dựng của mình nhanh hơn
Trong khi bạn ở đây
Earthly là khung CI/CD dễ dàng.
Phát triển đường dẫn CI/CD cục bộ và chạy chúng ở mọi nơi.
James Walker
James Walker là người sáng lập Heron Web, một studio phát triển phần mềm có trụ sở tại Vương quốc Anh cung cấp các giải pháp riêng biệt cho các doanh nghiệp vừa và nhỏ. Anh ấy có kinh nghiệm trong việc cung cấp phần mềm tùy chỉnh bằng quy trình công việc kỹ thuật được xây dựng dựa trên các phương pháp DevOps hiện đại. James cũng là một nhà văn kỹ thuật tự do và đã viết nhiều về vòng đời phát triển phần mềm, xu hướng hiện tại của ngành cũng như các khái niệm và công nghệ DevOps