Kết nối mysql với php bằng docker và workbench

Thực hiện quá trình chuyển đổi sang lập trình phía máy chủ với hướng dẫn thực tế này về PHP và MySQL, Phiên bản thứ 7, Phần 4 Cài đặt, nguyên tắc cơ bản về thiết kế cơ sở dữ liệu, lập trình hướng đối tượng, kiểm soát truy cập và xuất bản đều sẽ được đề cập
PHP & MySQL. Novice to Ninja, 7th Edition - Phần 4 - Thực hiện bước nhảy vọt trong lập trình phía máy chủ với hướng dẫn thực hành này về PHP. Chúng tôi sẽ đề cập đến cài đặt, nguyên tắc thiết kế cơ sở dữ liệu, lập trình hướng đối tượng, kiểm soát truy cập, xuất bản

Gần đây, tôi đã làm một số công việc với container. Đối với những người chưa quen, một thùng chứa giống như một máy ảo vì ứng dụng của bạn được chạy trong một môi trường nhất quán, biệt lập. Tuy nhiên, môi trường này nhẹ hơn một máy ảo. Nó sử dụng hệ điều hành cơ bản thay vì chạy toàn bộ hệ điều hành cho từng ứng dụng. Do đó, các thùng chứa rất rẻ để quay lên và dễ dàng chia sẻ

Nền tảng phổ biến nhất để tạo vùng chứa là Docker nên đó là thứ tôi sẽ sử dụng ở đây. Bạn có thể cài đặt Docker từ liên kết này. cảnh báo mặc dù. Nếu bạn có Windows Home Edition, bạn sẽ cần Hệ thống con Windows cho Linux Phiên bản 2 để chạy phiên bản Docker mới nhất. Những người sử dụng hệ thống *nix chỉ có thể cài đặt phần mềm

Thiết lập cơ sở dữ liệu

Hãy bắt đầu bằng cách thiết lập cơ sở dữ liệu. Đối với phần này của hướng dẫn, tôi cho rằng bạn đã có một số kiến ​​thức về SQL ; . Tôi đang đặt tất cả công việc của mình vào một thư mục có tên là hướng dẫn. Ngoài ra, bạn sẽ phải tạo thêm một số thư mục và tệp để theo dõi đến cùng—chỉ là cảnh báo trước.

Để bắt đầu, chúng ta sẽ cần một hình ảnh để tạo cơ sở cho vùng chứa của chúng ta. Trong Docker, một hình ảnh về cơ bản là một hệ thống tệp và một số cài đặt. Mỗi vùng chứa sẽ có hệ thống tệp ảo riêng biệt với hệ thống tệp thực của bạn và nó được làm mới mỗi khi vùng chứa được tách ra. Nếu bạn muốn vùng chứa của mình truy cập bộ lưu trữ liên tục hoặc gắn vào hệ thống tệp thực tế của mình, bạn sẽ phải xem xét các ổ đĩa. Tôi sẽ không sử dụng âm lượng ở đây, nhưng đó là điều bạn nên biết

Giờ đây, Docker quản lý vòng đời của một container, nhưng nó cũng hoạt động như một trình quản lý gói cho hình ảnh. Vì vậy, chúng ta không phải tự làm từ đầu. Thay vào đó, chúng ta có thể sử dụng và mở rộng hình ảnh hiện có. Đối với nhu cầu của chúng tôi ở đây, chúng tôi sẽ mở rộng một hình ảnh MySQL cơ bản, có thể tìm thấy trên trang web Docker Hub. Trang web sẽ cung cấp một số thông tin cơ bản về hình ảnh;

Để tạo một hình ảnh mới, chúng ta cần tạo một tệp YAML , thường được gọi là tệp Docker. Tệp này chứa các lệnh khác nhau để tạo vùng chứa. Đừng lo—Tôi sẽ cung cấp các tệp cần thiết cho cuộc phiêu lưu của chúng ta, bao gồm tệp Dockerfile này, cùng với một số nhận xét giải thích. Ngoài ra, trang web Docker cung cấp một tài liệu tham khảo nếu bạn muốn đi vào chi tiết hơn. Hướng dẫn này chỉ cung cấp tổng quan ở mức độ tương đối cao về Docker.

Đây là chính Dockerfile

FROM mysql:8.0

# Set an insecure password
ENV MYSQL_ROOT_PASSWORD=example

# Copy over our SQL queries
COPY ./mysql/init.sql /init.sql

# Startup MySQL and run the queries
CMD ["mysqld", "--init-file=/init.sql"]

Và bạn sẽ cần tệp SQL cần thiết. Tôi đã đặt cả hai tệp này vào một thư mục có tên là mysql trong thư mục hướng dẫn của chúng tôi.

CREATE DATABASE app;
USE app;

CREATE TABLE message (
id INT NOT NULL AUTO_INCREMENT,
message VARCHAR(50) NOT NULL,
PRIMARY KEY(id)
);

INSERT INTO message (message)
VALUES
("Hello World"),
("A second message"),
("J.Cole went double platinum with no features");

Một số lệnh Dockerfile

Tôi sẽ tiếp tục và giải thích một số lệnh Dockerfile phổ biến

Lệnh FROM cho Docker biết hình ảnh nào sẽ mở rộng. Ở đây, chúng tôi đang xây dựng trên hình ảnh MySQL với thẻ 8. 0. Nếu bạn thích mạo hiểm, hãy thử thay đổi thẻ; .

Bộ lệnh ENV —hành động gây sốc—một biến môi trường. Nói chung, các biến môi trường là các giá trị được đặt động ảnh hưởng đến hành vi của các quy trình đang chạy. Trong trường hợp này, chúng tôi đang đặt mật khẩu cho cơ sở dữ liệu. Như vậy, nếu bạn muốn đăng nhập bằng một công cụ bên ngoài như MySQL Workbench, hãy sử dụng ví dụ về mật khẩu và tên người dùng mặc định của root. Bạn sẽ không cần bất kỳ chương trình nào ngoài Docker để hoàn thành hướng dẫn này, nhưng công cụ cơ sở dữ liệu sẽ hoạt động với cơ sở dữ liệu được chứa.

Lệnh COPY di chuyển tệp từ hệ thống tệp thực của bạn sang hệ thống tệp ảo của bộ chứa. Lưu ý rằng các thùng chứa là bất biến nên chúng ta phải sao chép qua các tệp hoặc gắn các khối lượng trong bước tạo. Vì vậy, những gì chúng ta đang sao chép ở đây? . Rõ ràng, ra khỏi hộp, cơ sở dữ liệu sẽ là một bảng trống. Tôi đã tiếp tục và thêm một số bản ghi như một phần của quá trình khởi tạo cơ sở dữ liệu. Kỹ thuật này có thể không phải là cách bạn thực sự làm điều này trong môi trường thực, nhưng nó giữ cho hướng dẫn đơn giản. SQL file to pop­u­late a table. Obviously, out of the box, the data­base will be a blank slate. I went ahead and added some records as part of the data­base ini­tial­iza­tion process. This tech­nique is prob­a­bly not how you ac­tu­ally do this in a real en­vi­ron­ment, but it keeps the tu­to­r­ial sim­ple.

Cuối cùng, lệnh CMD cho vùng chứa biết nội dung sẽ chạy sau khi vùng chứa khởi động. Ở đây, tôi đang ghi đè hành vi mặc định hình ảnh của mysql vì chúng ta cần thêm một flag vào lệnh. –init-file flag cho phép chúng tôi chạy một tệp chứa các truy vấn SQL sau khi khởi tạo cơ sở dữ liệu, đó chính xác là những gì chúng tôi muốn.

Bản thân tập tin này không làm gì cả. Chúng ta sẽ phải xây dựng Dockerfile thành một hình ảnh và chạy nó—nhưng điều đó sẽ đến sau

Cài đặt PHP

Thật tuyệt—chúng tôi có một Dockerfile cơ sở dữ liệu. Hãy làm điều gì đó với nó bằng cách tạo một trang PHP đơn giản, sẽ liên quan đến việc quay vùng chứa thứ hai. Mô hình này sẽ trở nên quen thuộc. Bạn sẽ dành một khoảng thời gian để định cấu hình bộ chứa Docker cho tất cả các thành phần trong ứng dụng của mình.

Tệp PHP tự tạo một bảng html hiển thị nội dung của bảng cơ sở dữ liệu—gần như theo kiểu một đối một. Hầu hết các tập tin này là html. Bạn không cần phải hiểu tất cả các chi tiết của phần PHP mà chỉ cần truy vấn cơ sở dữ liệu của chúng tôi.

<!doctype html>
<html lang="en">

<head>
<meta charset="utf-8">
<title>Docker Tutorial</title>
<meta name="description" content="Learn how to use Docker with PHP">
<meta name="author" content="Matthew Parris">
</head>

<body>
<h1>Docker Tutorial</h1>
<div class=".db-table">
<table>
<tr>
<th>Id</th>
<th>Message</th>
</tr>
<?php
$user = 'root';
$pass = 'example';

try {
$dbh = new PDO('mysql:host=db;port=3306;dbname=app', $user, $pass);
foreach ($dbh->query('SELECT * from message') as $row) {
$html = "<tr><td>${row['id']}</td><td>${row['message']}</td></tr>";
echo $html;
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>

</table>
</div>
</body>

</html>

Một điều thú vị cần chỉ ra ở đây là tên máy chủ của bộ chứa cơ sở dữ liệu. Nó cùng tên với container. Do đó, bạn không cần phải tìm ra IP vùng chứa đã được chỉ định. Một số DNS ma thuật đang giúp cuộc sống của chúng ta dễ dàng hơn ở hậu trường.

Bây giờ, hãy xem tệp Docker. Nó tương tự như cú pháp trước đó—vì vậy tôi sẽ không xem lại cú pháp nữa. Chúng tôi sẽ xây dựng từ hình ảnh cơ sở được tìm thấy tại liên kết này. Một điều cần lưu ý là chúng ta phải cài đặt tiện ích mở rộng PHP cho PDO to es­tab­lish a con­nec­tion to our MySQL data­base. Luckily, the base PHP cung cấp một số tập lệnh tiện ích để hoạt động với các tiện ích mở rộng này. Đó là một điều dễ thực hiện nhưng có thể dễ dàng bị bỏ qua.

FROM php:7.4-cli

# Move our PHP file into the container
COPY ./php/index.php /usr/src/app/index.php

# Make things easier if you shell in
WORKDIR /usr/src/app

# Our PHP will be running on port 8000
EXPOSE 8000

# Install the PDO MySQL extension so we can database
RUN docker-php-ext-install pdo_mysql

# Set up a web server
CMD ["php", "-S", "0.0.0.0:8000"]

Để lưu ý, tôi đã đặt cả tệp Docker này cũng như tệp PHP trong một thư mục có tên php. Bạn sẽ cần cẩn thận về cấu trúc thư mục vì nó sẽ quan trọng cho bước tiếp theo. Mọi thứ sẽ sụp đổ nếu bạn làm hỏng việc 🙃

Docker Soạn

Phù—chúng ta gần đến nơi rồi. Chúng tôi có hình ảnh của mình và bắt buộc phải sử dụng Docker CLI để chạy các vùng chứa và kết nối chúng lại với nhau. Nhưng đó không phải là niềm vui và là một nỗi đau để quản lý. Thay vào đó, tôi sẽ viết nguệch ngoạc một tệp Docker Compose.

Docker Compose là một bản tóm tắt trên Docker để kích hoạt một tập hợp các thùng chứa, ổ đĩa, mạng và các công cụ môi trường khác. Nói cách khác, về cơ bản, đây là một cách khai báo để giao tiếp với Docker. Chúng ta có thể tạo một tệp YAML duy nhất để quay lên và xuống một môi trường.

version: '3.7'
services:
db:
build:
context: .
dockerfile: ./mysql/Dockerfile.yaml
image: tutorial-db
restart: always
ports:
- 3306:3306
app:
build:
context: .
dockerfile: ./php/Dockerfile.yaml
image: tutorial-php
restart: always
ports:
- 8000:8000

Chạy các Container

Đáng kinh ngạc. Bây giờ chúng tôi có mọi thứ chúng tôi cần. Hãy chạy thứ này bằng cách yêu cầu Docker Compose quay vòng các thùng chứa của chúng ta

docker-compose up -d

Sau đó, bạn sẽ có thể điều hướng đến localhost. 8080 và xem trang. Nó không vinh quang, nhưng phải có một bảng html với một số hàng được điền

Làm cách nào để kết nối MySQL Docker với MySQL Workbench?

Vui lòng làm theo các bước sau. .
Chỉ định khối cấu hình mysql trong docker-compose của bạn. yml. .
Restart docker container and run following commands to get to the bash shell in the mysql container docker ps docker exec -it /bin/bash. .. .
Trong MySQL Workbench của bạn cung cấp các chi tiết kết nối

Làm cách nào để kết nối PHP với MySQL Workbench?

Để tạo mã PHP cho kết nối, trước tiên hãy cài đặt plugin như sau. .
Sao chép mã plugin vào một tệp mới. .
Bắt đầu bàn làm việc của MySQL. .
Khi được nhắc, hãy khởi động lại MySQL Workbench. .
Sau khi khởi động lại MySQL Workbench, hãy tải kết nối MySQL để sử dụng để tạo mã PHP

Làm cách nào để kết nối với cơ sở dữ liệu MySQL Docker?

Mục lục .
Bước 1. Kéo hình ảnh Docker cho MySQL
Bước 2. Triển khai và khởi động MySQL Container
Bước 3. Kết nối với Docker MySQL Container

Tôi có thể sử dụng MySQL với Docker khô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.