Làm cách nào để sử dụng cơ sở dữ liệu MySQL trong bộ chứa Docker?

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
0

Bâ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
1

5. 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
2

Tiế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
3

Sau đó, 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
4

Tạ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
6

Chú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
7

Ngoà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
8

6. 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

Làm cách nào để truy cập cơ sở dữ liệu MySQL trong bộ chứa Docker?

Chạy bộ chứa docker với tùy chọn gắn ổ đĩa docker run -it -v /host. / đã chia sẻ .
Bạn có thể chuyển cờ -d để chạy vùng chứa mysql/mariadb ở chế độ tách rời/nền
Mật khẩu là "wp" được xác định trong docker-compose. tập tin yml
Lời khuyên tương tự như maniekq nhưng ví dụ đầy đủ với docker-compose

Bạn có thể đặt cơ sở dữ liệu trong bộ chứa Docker không?

Nếu bạn đang làm việc trên một dự án nhỏ và đang triển khai trên một máy duy nhất, bạn hoàn toàn có thể chạy cơ sở dữ liệu của mình trong bộ chứa Docker. Be sure to mount a volume to make the data persistent, and have backup processes in place. Try to restore them every once in a while to make sure your backups are any good.

Làm cách nào để tạo cơ sở dữ liệu trong bộ chứa MySQL Docker?

Cần cài đặt Docker phiên bản mới nhất trong máy của bạn. .
bước đầu tiên. Tải xuống hình ảnh MySQL
bước thứ 2. thực hiện vùng chứa
bước thứ 3. Lấy IP của container
bước thứ 4. Truy cập cơ sở dữ liệu từ vùng chứa
Phần kết luận

Làm cách nào để sử dụng cơ sở dữ liệu trong Docker?

Các bước cấp cao .
Tải xuống ứng dụng Docker
Thiết lập tài khoản trên Docker Hub
Chạy Docker và tải xuống hình ảnh cơ sở dữ liệu
Chạy hình ảnh
Kết nối với cơ sở dữ liệu và chạy một số SQL