Container là chủ đề thảo luận nóng nhất trong ngành CNTT vì nhiều ưu điểm của chúng. Các tổ chức đang áp dụng các giải pháp dựa trên container cho doanh nghiệp của họ với tốc độ đáng kể. Theo 451 Research, thị trường container ứng dụng sẽ tăng gấp 4 lần trong những năm tới
Ngày nay, chúng ta thậm chí còn có các cơ sở dữ liệu như MySQL, MongoDB, PostgreSQL và nhiều cơ sở dữ liệu khác ở dạng được chứa. Tuy nhiên, bài viết này sẽ khám phá các tùy chọn để thiết lập và chạy bộ chứa MySQL. Để bắt đầu, chúng tôi sẽ sao lưu cơ sở dữ liệu MySQL hiện có của chúng tôi. Tiếp theo, chúng ta sẽ xây dựng cấu hình vùng chứa ở dạng YAML và chạy cấu hình đó bằng cách sử dụng docker-compose, một bộ công cụ mã nguồn mở để kết hợp một chồng các vùng chứa ứng dụng lại với nhau
Không có gì khó chịu nữa, chúng ta hãy đi vào chi tiết thực chất của nó
2. Xây dựng cấu hình vùng chứa MySQL
Trong phần này, chúng ta sẽ xây dựng bộ chứa MySQL bằng công cụ docker-compose. Tuy nhiên, YAML cũng sử dụng hình ảnh từ Dockerfile làm cấu hình cơ sở trong đường dẫn hiện tại
2. 1. Docker Soạn
Trước tiên, hãy tạo tệp YAML với các thẻ phiên bản và dịch vụ. Chúng tôi xác định phiên bản định dạng tệp trong thẻ phiên bản của tệp YAML. Các dịch vụ MySQL sử dụng thông tin hình ảnh từ Dockerfile mà chúng tôi xác định trong ngữ cảnh
Hơn nữa, chúng tôi cũng hướng dẫn công cụ sử dụng các đối số mặc định được xác định là biến môi trường trong. tập tin env. Cuối cùng, thẻ cổng sẽ liên kết bộ chứa và máy chủ cổng 3306. Hãy xem nội dung của tệp YAML soạn thảo docker mà chúng tôi đang sử dụng để hiển thị các dịch vụ MySQL
# cat docker-compose.yml
version: '3.3'
services:
### MySQL Container
mysql:
build:
context: /home/tools/bael/dung/B015
args:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
ports:
- "${MYSQL_PORT}:3306"
2. 2. Tạo Dockerfile
Trong nội bộ, docker-compose sử dụng Dockerfile trong đường dẫn đã chỉ định để xây dựng hình ảnh và đặt môi trường cho MySQL. Dockerfile của chúng tôi tải xuống hình ảnh từ DockerHub và quay vùng chứa với các biến đã xác định
# cat Dockerfile
FROM mysql:latest
MAINTAINER baeldung.com
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
Bây giờ, hãy xem qua tất cả các hướng dẫn được đưa ra trong đoạn mã Dockerfile bên dưới
- TỪ – Một Dockerfile hợp lệ bắt đầu bằng câu lệnh TỪ, mô tả tên hình ảnh và thẻ phiên bản. Trong trường hợp của chúng tôi, chúng tôi sử dụng hình ảnh mysql với thẻ mới nhất
- MAINTAINER – Đặt thông tin tác giả làm siêu dữ liệu của vùng chứa có thể nhìn thấy thông qua kiểm tra docker
- CHẠY – Thực thi lệnh trên hình ảnh mysql, sau đó tạo thành một lớp mới. Hình ảnh kết quả được cam kết và sử dụng cho các bước tiếp theo được xác định trong Dockerfile
- ARG – Truyền biến trong thời gian xây dựng. Ở đây, chúng tôi đang chuyển bốn biến người dùng làm đối số xây dựng
- ENV – Chúng tôi sử dụng ký hiệu $ để biểu thị các biến môi trường trong Dockerfile. Trong đoạn mã trên, chúng tôi sử dụng bốn biến
- THÊM – Trong thời gian xây dựng, nó sẽ thêm tệp vào vùng chứa để sử dụng trong tương lai
- EXPOSE – Cung cấp các dịch vụ bên ngoài Docker Container
2. 3. Đặt môi trường
Ngoài ra, chúng ta có thể tạo một tệp biến môi trường dưới dạng. env trong đường dẫn hiện tại. Tệp này chứa tất cả các biến liên quan đến tệp soạn thảo
# cat .env
MYSQL_DATABASE=my_db_name
MYSQL_USER=baeldung
MYSQL_PASSWORD=pass
MYSQL_ROOT_PASSWORD=pass
MYSQL_PORT=3306
2. 4. Tệp sao lưu MySQL
Để minh họa, hãy sao lưu từ bảng cơ sở dữ liệu hiện có. Ở đây, chúng tôi tự động nhập cùng một bảng Khách hàng vào vùng chứa MySQL của mình thông qua dữ liệu. tập tin sql
Dưới đây, chúng tôi đã hiển thị dữ liệu bảng bằng cách sử dụng truy vấn CHỌN, tìm nạp dữ liệu từ bảng được yêu cầu
mysql> select * from Customers;
+--------------+-----------------+---------------+-----------+------------+---------+
| CustomerName | ContactName | Address | City | PostalCode | Country |
+--------------+-----------------+---------------+-----------+------------+---------+
| Cardinal | Tom B. Erichsen | Skagen 21 | Stavanger | 4006 | Norway |
| Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
+--------------+-----------------+---------------+-----------+------------+---------+
2 rows in set [0.00 sec]
Là một phần của gói MySQL RDBMS, tiện ích mysqldump được sử dụng để sao lưu tất cả dữ liệu trong cơ sở dữ liệu vào tệp văn bản. Sử dụng một lệnh đơn giản với các đối số nội tuyến, chúng ta có thể nhanh chóng sao lưu các bảng MySQL
- -u. tên người dùng MySQL
- -P. mật khẩu mysql
# mysqldump -u [user name] –p [password] [database_name] > [dumpfilename.sql]
# mysqldump -u root -p my_db_name > data.sql
Enter password:
Ở cấp độ cao, tệp sao lưu sẽ loại bỏ bất kỳ bảng nào có tên Khách hàng trong cơ sở dữ liệu đã chọn và chèn tất cả dữ liệu đã sao lưu vào đó
# cat data.sql
-- MySQL dump 10.13 Distrib 8.0.26, for Linux [x86_64]
...
.. output truncated ...
...
DROP TABLE IF EXISTS `Customers`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `Customers` [
`CustomerName` varchar[255] DEFAULT NULL,
...
.. output truncated ...
...
INSERT INTO `Customers` VALUES ['Cardinal','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway'],['Wilman Kala','Matti Karttunen','Keskuskatu 45','Helsinki','21240','Finland'];
/*!40000 ALTER TABLE `Customers` ENABLE KEYS */;
UNLOCK TABLES;
...
.. output truncated ...
...
-- Dump completed on 2022-07-28 1:56:09
Tuy nhiên, việc tạo hoặc xóa cơ sở dữ liệu không được quản lý trong tệp kết xuất đã tạo. Chúng tôi sẽ thêm đoạn mã dưới đây vào dữ liệu. tệp sql, tạo cơ sở dữ liệu nếu chúng không tồn tại. Nó làm cho vòng kết nối hoàn chỉnh bằng cách quản lý cả cơ sở dữ liệu và bảng. Cuối cùng, nó cũng sử dụng cơ sở dữ liệu đã tạo bằng lệnh USE
--
-- Create a database using `MYSQL_DATABASE` placeholder
--
CREATE DATABASE IF NOT EXISTS `MYSQL_DATABASE`;
USE `MYSQL_DATABASE`;
Hiện tại, cấu trúc thư mục trông như thế này
# tree -a
.
├── data.sql
├── docker-compose.yml
├── Dockerfile
└── .env
3. Quay lên Bộ chứa máy chủ MySQL
Bây giờ, tất cả chúng ta đã sẵn sàng để tạo một thùng chứa thông qua docker-compose. Để hiển thị bộ chứa MySQL, chúng ta cần thực thi docker-compose up
Khi lướt qua các dòng đầu ra, chúng ta có thể thấy rằng chúng tạo thành các lớp mới trong mỗi bước ở trên cùng của hình ảnh MySQL
Sau đó, nó cũng tạo cơ sở dữ liệu và tải dữ liệu được chỉ định trong dữ liệu. tập tin sql
________số 8_______Chúng ta có thể sử dụng tùy chọn -d để chạy các container ở chế độ tách rời
# docker-compose up -d
Building mysql
Sending build context to Docker daemon 7.168kB
Step 1/15 : FROM mysql:latest
---> c60d96bd2b77
...
.. output truncated ...
...
Step 15/15 : EXPOSE 3306
---> Running in 958e1d4af340
Removing intermediate container 958e1d4af340
---> c3516657c4c8
Successfully built c3516657c4c8
Successfully tagged b015_mysql:latest
Creating b015_mysql_1 .. done
#
4. Sự sẵn sàng của ứng dụng khách MySQL
Bắt buộc phải cài đặt ứng dụng khách để dễ dàng truy cập vào máy chủ MySQL. Tùy thuộc vào nhu cầu của chúng tôi, chúng tôi có thể cài đặt ứng dụng khách trên máy chủ hoặc bất kỳ máy hoặc bộ chứa nào khác có khả năng truy cập IP với bộ chứa máy chủ
# cat Dockerfile
FROM mysql:latest
MAINTAINER baeldung.com
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
0Bây giờ, hãy giải nén đường dẫn cài đặt và phiên bản của máy khách MySQL
# cat Dockerfile
FROM mysql:latest
MAINTAINER baeldung.com
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
15. Giao tiếp máy chủ máy khách
Chúng tôi có thể truy cập máy chủ MySQL đã triển khai bằng ứng dụng khách. Trong phần này, chúng ta sẽ xem cách truy cập máy chủ MySQL thông qua máy khách
Hãy xem id và trạng thái vùng chứa đã tạo bằng lệnh docker ps
# cat Dockerfile
FROM mysql:latest
MAINTAINER baeldung.com
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
2Tiếp theo, hãy lấy địa chỉ IP vùng chứa để truy cập cơ sở dữ liệu bằng dịch vụ máy khách đã cài đặt. Nếu chúng tôi đưa ra lệnh kiểm tra docker, chúng tôi sẽ thấy thông tin chi tiết về vùng chứa ở định dạng JSON. Chúng tôi cũng có thể chọn bất kỳ trường nào từ JSON kết quả. Ở đây, chúng tôi đang lấy địa chỉ IP từ phạm vi. Thiết lạp mạng lưới. Mạng -> Địa chỉ IP
# cat Dockerfile
FROM mysql:latest
MAINTAINER baeldung.com
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
3Sau đó, chúng tôi có thể sử dụng ứng dụng khách để đăng nhập vào Máy chủ MySQL bằng thông tin cổng và máy chủ được định cấu hình
# cat Dockerfile
FROM mysql:latest
MAINTAINER baeldung.com
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
4Tại đây, chúng ta có thể thấy rằng dữ liệu được khôi phục tự động từ dữ liệu. tập tin sql
mysql> select * from Customers;
+--------------+-----------------+---------------+-----------+------------+---------+
| CustomerName | ContactName | Address | City | PostalCode | Country |
+--------------+-----------------+---------------+-----------+------------+---------+
| Cardinal | Tom B. Erichsen | Skagen 21 | Stavanger | 4006 | Norway |
| Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
+--------------+-----------------+---------------+-----------+------------+---------+
2 rows in set [0.00 sec]
Bây giờ, hãy thử thêm một vài hàng vào các bảng cơ sở dữ liệu hiện có. Chúng tôi sẽ sử dụng truy vấn INSERT để thêm dữ liệu vào bảng
# cat Dockerfile
FROM mysql:latest
MAINTAINER baeldung.com
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
6Chúng tôi cũng đã chèn thành công một hàng mới vào bảng đã khôi phục. chúc mừng. Hãy xem kết quả
# cat Dockerfile
FROM mysql:latest
MAINTAINER baeldung.com
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
7Ngoài ra, bộ chứa máy chủ MySQL đi kèm với cài đặt máy khách MySQL. Tuy nhiên, nó chỉ có thể được sử dụng trong vùng chứa cho bất kỳ mục đích thử nghiệm nào. Bây giờ, hãy đăng nhập vào bộ chứa Docker và thử truy cập máy chủ MySQL bằng ứng dụng khách MySQL mặc định
Lệnh docker exec giúp login vào container đang chạy bằng container id. Tùy chọn -i giữ STDIN mở và -t sẽ phân bổ TTY giả và cuối cùng, /bin/bash ở cuối đưa chúng ta vào dấu nhắc BASH
# cat Dockerfile
FROM mysql:latest
MAINTAINER baeldung.com
RUN chown -R mysql:root /var/lib/mysql/
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD
ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD
ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d
EXPOSE 3306
86. Phần kết luận
Tóm lại, chúng ta đã thảo luận về các bước để hiển thị bộ chứa máy chủ MySQL bằng cách sử dụng docker-compose. Nó cũng tự động khôi phục cơ sở dữ liệu và bảng từ các tệp sao lưu. Hơn nữa, chúng tôi cũng đã truy cập dữ liệu được khôi phục và thực hiện một số thao tác CRUD