Hướng dẫn using docker for php development - sử dụng docker để phát triển php

Trong hướng dẫn này, tôi sẽ đặt ra cách bắt đầu tốt nhất với việc thiết lập môi trường phát triển PHP, hướng dẫn bạn cách thiết lập với Docker. Có rất nhiều cách để thiết lập môi trường PHP Dev của bạn, nhưng sử dụng Docker là cách thực hành tốt nhất hiện tại.

Tôi sẽ bắt đầu với một lịch sử ngắn gọn về cách mọi người đã thiết lập môi trường phát triển PHP của họ trong những năm qua, dẫn đến nơi chúng ta đang ở. Nhưng nếu bạn thay vì bỏ qua tất cả những điều đó và chỉ cần chạy máy chủ của mình, bạn có thể bỏ qua các bước cấu hình.

Hướng dẫn using docker for php development - sử dụng docker để phát triển php

Một chút nền

Một trong những vấn đề với phát triển web là mọi thứ thay đổi với tốc độ nhanh chóng. CSS thực tiễn tốt nhất thay đổi khi các thuộc tính mới được thêm vào đặc điểm kỹ thuật. . Kết quả là, rất nhiều hướng dẫn đã lỗi thời khá nhanh.

Cho đến một vài năm trước, tôi đã gửi tất cả mọi người mà tôi đang dạy cho bài viết xuất sắc của Bruno Skvorc, giới thiệu lại Vagrant: cách bắt đầu với PHP. Vào thời điểm đó, đó là một giới thiệu tuyệt vời về cách (sau đó) tốt nhất để thiết lập một môi trường phát triển địa phương.

Bài báo đó chỉ từ năm 2015, nhưng năm hoặc sáu năm là EON trong thời gian phát triển web luôn di chuyển. Cách thức đúng đắn của người Viking đã di chuyển khá đáng kể kể từ đó.

Tôi sẽ nhanh chóng tóm tắt lại cách mọi thứ đã thay đổi trong những năm qua.

1. Cài đặt thủ công PHP, MySQL và Apache

Nếu, giống như tôi, bạn đã đủ tuổi để phát triển các trang web vào những năm 90, bạn sẽ nhớ trải nghiệm bực bội như thế nào. Trước đó, nếu bạn thuộc thiểu số, người đã không phát triển trên máy chủ web trực tiếp (vâng, chúng tôi thực sự đã làm điều này, vâng, đó là một ý tưởng khủng khiếp), bạn sẽ cài đặt thủ công Apache, PHP và MySQL trên máy phát triển của bạn.

Nhận được một môi trường phát triển được thiết lập yêu cầu chuyên môn quan trọng. Bạn cần biết cách định cấu hình máy chủ web, cách định cấu hình PHP và bạn phải trải qua quá trình cài đặt thủ công và định cấu hình tất cả các phần mềm bạn đã sử dụng. Đây là một nhiệm vụ tốn thời gian và khó khăn theo cách riêng của nó đối với các nhà phát triển mới làm quen.

2. Các gói được cấu hình sẵn như XAMPP

Đến đầu những năm 2000, mọi người đã bắt đầu tập hợp tất cả các phần mềm cần thiết trong một gói duy nhất được cài đặt và cấu hình tất cả các phần mềm bạn cần. Các gói này là những thứ như XAMPP và WAMP, và chỉ bằng một nút bấm, họ đã cho bạn một môi trường phát triển có thể sử dụng.

Nếu bạn quanh quẩn với các nhóm Facebook PHP khác nhau, bạn sẽ thấy rằng một phần đáng kể các nhà phát triển mới vẫn theo hướng dẫn từ thời đại này và một số lượng lớn các nhà phát triển hiện tại không bao giờ tiếp tục, vì vậy XAMPP vẫn được sử dụng khá rộng rãi. Nếu điều này mô tả bạn, thì đó là thời gian để tiếp tục.

Sử dụng XAMPP làm cho nó rất dễ dàng để có được một môi trường phát triển web và chạy trên máy của bạn. Bài viết của Bruno, phác thảo các vấn đề với phương pháp này, nhưng vấn đề chính xảy ra khi bạn muốn đưa trang web của mình trực tiếp lên web. Các phiên bản của PHP, MySQL và Apache (hoặc NGINX) có thể khác với các phiên bản bạn đã cài đặt như một phần của gói XAMPP của bạn. Ngoài ra, có một vài sự khác biệt nhỏ, nhưng bực bội, giữa Windows và Linux. Nếu bạn đang phát triển trang web của mình trên máy Windows và tải nó lên máy chủ Linux, một số mã của bạn có thể không hoạt động khi nó được tải lên.

3. Máy ảo và Vagrant

Vào cuối những năm 2000 và đầu năm 2010, xu hướng của các nhà phát triển là chuyển sang một máy ảo. Ý tưởng là bạn có thể chạy một bản sao của hệ điều hành máy chủ web thực sự với tất cả các chương trình đã cài đặt - cùng cấu hình và thiết lập chính xác như máy chủ web thực tế mà bạn sẽ cuối cùng triển khai trang web của mình. Bằng cách đó, khi bạn làm cho trang web trực tiếp, không có cơ hội để nó không hoạt động.

Trong khi nhiều lập trình viên nhìn thấy lợi ích của một môi trường như vậy, thì khó khăn và thời gian cần thiết để thiết lập điều này có nghĩa là ít người đã làm. Đó là cho đến khi những công cụ mơ hồ (và các công cụ liên quan như Puphpet) xuất hiện và lấy tất cả những rắc rối ra khỏi làm như vậy.

Hãy xem bài viết mà tôi đã liên kết với trước đó để mô tả tuyệt vời về các máy ảo, Vagrant và lợi ích của việc thiết lập môi trường phát triển theo cách này.

4. Docker

Tất cả nền tảng này đưa chúng ta đến ngày hôm nay và lý do cho bài viết này. Nếu Vagrant là rất lớn, tại sao lại sử dụng thứ khác?

Những lợi ích chính của môi trường ảo được thiết lập bằng cách sử dụng Vagrant là:

  1. PC phát triển của bạn không được gắn vào một môi trường cụ thể. Bạn có thể lưu trữ nhiều trang web: một cách sử dụng Apache, một sử dụng NGINX, một sử dụng Php 7 và một sử dụng PHP 8.

  2. Khi trang web được thực hiện trực tiếp, trang web đang được tải lên chính xác cùng một môi trường mà nó được phát triển.

Thật dễ dàng để biết lý do tại sao các nhà phát triển muốn điều này. Thực hiện bước tiếp theo để Docker giữ những lợi ích này trong khi tránh một số nhược điểm của môi trường máy móc/ảo.

Điều gì sai với Vagrant?

Mặc dù có những lợi ích, một môi trường phát triển dựa trên tầm thường giới thiệu các hạn chế và vấn đề của riêng mình.

  1. Tài nguyên hệ thống. Vagrant yêu cầu chạy một hệ điều hành hoàn toàn khác. Bạn cần tải xuống và cài đặt hệ điều hành mà chạy trên máy chủ web của bạn và tất cả các gói đã cài đặt. Điều này sử dụng một lượng đáng kể không gian đĩa và bộ nhớ. Một máy ảo thường sẽ cần ít nhất 512 MB RAM. Đó không phải là nhiều cho các máy tính ngày nay, nhưng nó nhanh chóng tăng lên. Nếu bạn muốn lưu trữ một trang web trên Php 7 và một trên Php 8, bạn cần hai phiên bản máy ảo khác nhau được cài đặt và cấu hình trên máy tính của bạn.

  2. Bạn phải đảm bảo máy ảo và máy chủ được đồng bộ hóa. Bất cứ khi nào bạn cập nhật máy chủ hoặc thay đổi cấu hình máy chủ, bạn phải nhớ cập nhật môi trường phát triển cục bộ của mình với các thay đổi tương tự.

  3. Nó khóa chặt bạn vào một hệ điều hành máy chủ và cấu hình. Di chuyển một trang web từ máy chủ này sang máy chủ khác là một nhiệm vụ khó khăn. Một trang web không chỉ là các tập lệnh PHP, hình ảnh và CSS làm cho nó tăng lên. Một cấu hình máy chủ cụ thể (chẳng hạn như các tiện ích mở rộng PHP đã cài đặt và ________ 15/________ 16) cũng được yêu cầu để trang web hoạt động chính xác.

  4. Có một sự lựa chọn rất hạn chế của các gói có sẵn. Tùy thuộc vào phân phối Linux mà máy chủ web của bạn đang chạy, bạn có thể không có bất kỳ lựa chọn nào trong phiên bản PHP bạn chạy. Trừ khi bạn cài đặt các gói từ các kho lưu trữ của bên thứ ba, bạn đã giành chiến thắng có thể sử dụng phiên bản PHP mới nhất và lớn nhất. Tại thời điểm viết bài, Php 8 gần đây đã trở nên có sẵn. Nếu bạn sử dụng Centos 8/Rhel 8, bạn sẽ bị mắc kẹt với Php 7.3 cho đến khi bạn nhận được phiên bản mới của hệ điều hành. Nếu bạn sử dụng Debian, phiên bản mới nhất có sẵn là 7.3. Các phân phối khác sẽ có các phiên bản khác nhau có sẵn.

  5. Cấu hình máy chủ là toàn cầu. PHP có một tệp cài đặt có tên

    version: '3'
    
    7. Thay đổi điều này áp dụng cấu hình được cập nhật cho mỗi trang web được lưu trữ trên máy chủ. Điều tương tự cũng xảy ra với
    version: '3'
    
    5 cho Nginx hoặc
    version: '3'
    
    6 cho Apache. Trường hợp cơ sở dữ liệu MySQL có cơ sở dữ liệu cho tất cả các trang web được lưu trữ trên máy chủ. Việc thực hiện bất kỳ thay đổi cấu hình cơ sở dữ liệu quy mô lớn nào đang tiếp cận xa. Cập nhật cài đặt MySQL sẽ ảnh hưởng đến mọi trang web bằng máy chủ MySQL đó!

  6. Các phiên bản gói là toàn cầu trên máy chủ thực. Mặc dù có thể chạy nhiều phiên bản PHP trên cùng một máy chủ web, nhưng rất khó để định cấu hình và có thể có tác dụng phụ kỳ quái tùy thuộc vào tập lệnh của bạn đang làm gì (chẳng hạn như khi bạn có tập lệnh bạn muốn chạy trong một đơn vị Systemd/cronjob và Hãy quên rằng bạn nên sử dụng

    version: '3'
    services:
        web:
            image: nginx:1.18.0
            ports:
                - "80:80"
    
    0 chứ không phải
    version: '3'
    services:
        web:
            image: nginx:1.18.0
            ports:
                - "80:80"
    
    1).

Mặc dù các điểm 5 và 6 có thể được khắc phục trên máy phát triển bằng cách chạy các máy ảo Vagrant khác nhau, nhưng bạn sẽ cần một máy chủ web thực sự phản ánh mỗi cấu hình mà bạn đang chạy để các trang web hoạt động khi bạn tải lên chúng.

Giới thiệu Docker

Docker giải quyết tất cả các vấn đề được liệt kê ở trên. Nhưng Docker là gì và nó hoạt động như thế nào?

Hãy bắt đầu với phần giới thiệu từ Wikipedia:

Docker là một bộ nền tảng như một sản phẩm dịch vụ (PAAS) sử dụng ảo hóa cấp độ OS để cung cấp phần mềm trong các gói gọi là container. Các container được phân lập với nhau và gói các tệp phần mềm, thư viện và cấu hình của riêng chúng; Họ có thể giao tiếp với nhau thông qua các kênh được xác định rõ.

Trước khi quá kỹ thuật, lợi ích thực tế đối với chúng tôi vì các nhà phát triển web là Docker cho phép chúng tôi đóng gói mọi thứ mà trang web cần, tất cả mã PHP cùng với Php Executable, MySQL Server và Nginx Server ngoài các tệp cấu hình được sử dụng bởi các tệp được sử dụng bởi các tệp được sử dụng bởi các tệp được sử dụng bởi chương trình.

Tất cả các mã trang web và các phiên bản chính xác của các chương trình cần thiết để chạy mã đó, được đóng gói cùng nhau, một cách hiệu quả như một ứng dụng duy nhất. Toàn bộ ứng dụng này sau đó có thể được chạy trên bất kỳ hệ điều hành. Khi ai đó chạy ứng dụng được đóng gói, PHP, MySQL, NGINX và tất cả các tệp PHP bạn đã viết đều được nhúng trong chính ứng dụng. Thậm chí tốt hơn, các phiên bản MySQL, NGINX và PHP chính xác là một phần của gói. Khi bạn chạy ứng dụng, các phiên bản chính xác của các công cụ mà ứng dụng được phát triển được tải xuống được tải xuống và cài đặt.

Đây là một máy ảo đã làm gì? Tôi nghe bạn hỏi. Đúng vậy, nhưng có một sự khác biệt lớn giữa cách cài đặt phần mềm Vagrant và Docker xử lý.

Với Vagrant, chạy một máy ảo, hệ điều hành hoàn chỉnh với phiên bản PHP cụ thể, phiên bản MySQL và cấu hình máy chủ (thường là) được nhân bản từ máy chủ web thực. Khi máy chủ được cập nhật, máy ảo cũng phải được cập nhật.

Tuy nhiên, khi sử dụng Docker, phiên bản PHP/MySQL/NGINX được cung cấp dưới dạng một gói duy nhất được gọi là hình ảnh và máy chủ có thể chạy nhiều hình ảnh khác nhau như bạn muốn.

Lợi ích ở đây là máy chủ web và máy phát triển của bạn đều chạy cùng một hình ảnh. Bạn chỉ cần tải hình ảnh của mình lên máy chủ web, chạy toàn bộ ứng dụng ở đó và trang web của bạn không cần bất kỳ cấu hình máy chủ web nào.

Ngoài ra, mỗi hình ảnh hoàn toàn tách biệt với hình ảnh khác trên máy chủ. Mỗi hình ảnh (một trên mỗi trang web trong ví dụ đơn giản hóa này) tách biệt với nhau. Mỗi trang web sẽ có cấu hình NGINX của riêng mình,

version: '3'
7 riêng và cài đặt của riêng PHP và MySQL. Mỗi trang web có thể chạy hoàn toàn các phiên bản PHP khác nhau. Bạn thậm chí có thể có một trang web chạy trên Apache và một trang web đang chạy trên Nginx, trên cùng một máy. Ngay cả khi bạn đang chạy hai trang web NGINX khác nhau, bạn sẽ có hai quy trình NGINX khác nhau, với cấu hình riêng của chúng, chạy cùng một lúc.

Điều này có một bộ nhớ nhỏ trên đầu, nhưng tính linh hoạt mà nó cấp cho điều này làm cho sự đánh đổi rất đáng giá:

  1. Toàn bộ trang web, với các phiên bản PHP/MySQL cần thiết, tất cả các cấu hình và tất cả các mã có thể được di chuyển xung quanh một cách dễ dàng. Di chuyển trang web đến một máy chủ mới chỉ cần sao chép một thư mục duy nhất. Bạn không cần phải thực hiện bất kỳ thay đổi nào đối với cấu hình PHP hoặc NGINX trên máy chủ mới. Bạn không cần phải cài đặt PHP hoặc NGINX trên chính máy chủ. Chúng sẽ được Docker cài đặt tự động khi bạn khởi chạy ứng dụng.

  2. Bạn có thể chạy cùng một hình ảnh trên máy phát triển của bạn. Sử dụng Vagrant, bạn đã chạy một cách hiệu quả một bản sao của cấu hình máy chủ/các gói được cài đặt trên cùng một máy. Với Docker, cùng một hình ảnh chính xác được chạy trên PC của bạn để phát triển như đang được chạy trên máy chủ.

  3. version: '3'
    
    7 Điều chỉnh,
    version: '3'
    
    5 Thay đổi cấu hình hoặc cập nhật PHP lên phiên bản mới nhất được xử lý giống như tải mã PHP được cập nhật lên máy chủ. Bạn cập nhật ứng dụng và không quan trọng cho dù đó là thay đổi một số mã PHP hay cập nhật
    version: '3'
    
    7.

  4. Mỗi hình ảnh được khép kín trong một thứ gọi là container của người Hồi giáo. Một tập lệnh PHP chạy trong một hình ảnh có thể truy cập các tệp đang chạy trong một tập tin khác. Hãy nghĩ

    version: '3'
    services:
        web:
            image: nginx:1.18.0
            ports:
                - "80:80"
    
    6 nhưng nghiêm ngặt hơn nhiều. Một thùng chứa giống như một máy ảo rất nhẹ. Nó hoạt động giống như hệ điều hành của chính nó và mã chạy trong một container thậm chí không biết nó được chạy bên trong một trong khi không thể nhìn thấy bất cứ thứ gì bên ngoài container. Nếu một trong các tập lệnh PHP của bạn không an toàn và cho phép ai đó truy cập shell hiệu quả, họ chỉ có thể truy cập các tệp trên máy chủ mà bạn đã cho phép truy cập container.

  5. Không giống như một máy ảo, nếu hai trang web khác nhau ở các thùng chứa hoàn toàn khác nhau nhưng sử dụng cùng một phiên bản NGINX hoặc PHP, không gian đĩa và RAM được chia sẻ giữa hai container.

  6. Bởi vì mỗi hình ảnh được khép kín, việc di chuyển trang web đến một máy chủ khác nhau là dễ dàng. Ứng dụng này không dựa vào phiên bản PHP đã cài đặt máy chủ và nó không quan tâm đến những gói nào được cài đặt trên máy chủ. Nếu bạn muốn chuyển một ứng dụng dockerized sang một máy chủ khác, thì nó cũng đơn giản như sao chép tất cả các tệp trang web và khởi chạy ứng dụng.

  7. Bạn có thể chạy nhiều hình ảnh Docker trên máy chủ tùy thích, mỗi hình có phiên bản PHP, phần mềm máy chủ web, cơ sở dữ liệu và các tệp được liên kết của riêng họ.

Thiết lập mọi thứ lên

Đó là lý thuyết ra khỏi đường đi. Bây giờ, hãy để nhảy vào và tạo một máy chủ bằng Docker.

Điều kiện tiên quyết

Trước khi chúng tôi bắt đầu, bạn sẽ cần tải xuống và cài đặt Docker. Truy cập trang web Docker, sau đó tải xuống và cài đặt nó cho hệ điều hành của bạn.

Nếu bạn sử dụng Linux, bạn nên cài đặt các gói

version: '3'
services:
    web:
        image: nginx:1.18.0
        ports:
            - "80:80"
7 và
version: '3'
services:
    web:
        image: nginx:1.18.0
        ports:
            - "80:80"
8 thông qua trình quản lý gói phân phối của bạn. Tùy thuộc vào phân phối của bạn, bạn có thể cần:

  1. Thêm người dùng của bạn vào nhóm

    version: '3'
    services:
        web:
            image: nginx:1.18.0
            ports:
                - "80:80"
    
    7 như được nêu trong hướng dẫn sử dụng Docker tại đây.

  2. Bắt đầu dịch vụ

    version: '3'
    services:
        web:
            image: nginx:1.18.0
            ports:
                - "80:80"
    
    7
    version: '3'
    services:
        web:
            image: nginx:latest
            ports:
                - "80:80"
            volumes:
                - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
                - ./app:/app
    
    1 và bật nó bằng
    version: '3'
    services:
        web:
            image: nginx:latest
            ports:
                - "80:80"
            volumes:
                - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
                - ./app:/app
    
    2.

Nếu bạn trên Windows hoặc MacOS, trình cài đặt sẽ làm điều này cho bạn.

Thứ hai, vì chúng tôi sẽ chạy một máy chủ web bên trong Docker và chuyển tiếp một số cổng nếu bạn đã có máy chủ web (Apache, Nginx, XAMPP, IIS, v.v.) hoặc MySQL chạy trên máy của bạn, hãy dừng chúng trước khi tiếp tục.

Bắt đầu

Một máy chủ web thường bao gồm nhiều chương trình khác nhau - chẳng hạn như NGINX, PHP và MySQL. Trong thuật ngữ Docker, mỗi chương trình bạn muốn cài đặt là một dịch vụ.service.

Có một số cách tạo ra các dịch vụ này trong Docker. Tôi sẽ bao gồm những người dùng thân thiện nhất. Docker hỗ trợ tạo tệp cấu hình bằng YAML (còn là một ngôn ngữ đánh dấu khác).

Mặc dù bạn có thể nhập tất cả các tùy chọn trên dòng lệnh, tôi khuyên bạn nên sử dụng tệp cấu hình YAML vì nhiều lý do:

  1. Nó dễ đọc/hiểu dễ dàng hơn rất nhiều.

  2. Bạn không cần phải loại lại một số lệnh dài mỗi khi bạn muốn chạy máy chủ.

  3. Bạn có thể theo dõi các thay đổi cho tệp với Git.

version: '3' services: web: image: nginx:latest ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/nginx.conf - ./app:/app 3 cho nginx

Docker cung cấp một công cụ có tên

version: '3'
services:
    web:
        image: nginx:1.18.0
        ports:
            - "80:80"
8 lấy tệp cấu hình có tên
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 và khởi chạy các dịch vụ được liệt kê bên trong nó. Hãy bắt đầu bằng cách thêm một máy chủ web, nginx.

Đầu tiên, tạo một thư mục ở đâu đó trên máy tính của bạn sẽ lưu trữ trang web của bạn. Bạn cần phải quay lại thư mục này thường xuyên để nhớ nó ở đâu. Tạo

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 với các nội dung sau:

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"

Chúng ta hãy xem qua cấu hình một dòng tại một thời điểm:

version: '3'

Điều này cho

version: '3'
services:
    web:
        image: nginx:1.18.0
        ports:
            - "80:80"
8 phiên bản của đặc tả YAML nào sẽ sử dụng.
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
8 là phiên bản mới nhất và các phiên bản khác nhau có thông số kỹ thuật, từ khóa và cấu trúc hơi khác nhau.

Dòng tiếp theo,

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
9, sẽ được theo sau bởi một danh sách tất cả các dịch vụ bạn muốn chạy.

Trong ví dụ của chúng tôi cho đến nay, chỉ có một dịch vụ gọi là

server {
    listen 80 default_server;
    root /app/public;
} 
0 (bạn có thể gọi đây là bất cứ thứ gì bạn thích) bằng cách sử dụng hình ảnh nginx chính thức
server {
    listen 80 default_server;
    root /app/public;
} 
1. Lưu ý rằng các thụt lề sử dụng các không gian (không phải tab!) Vấn đề. YAML dựa vào cấp độ lồng để xác định cấu trúc của tệp.

Nếu bạn muốn chỉ định một phiên bản NGINX khác, bạn có thể chỉ định rằng ở đây như vậy:

version: '3'
services:
    web:
        image: nginx:1.18.0
        ports:
            - "80:80"

Tôi khuyên bạn nên sử dụng

server {
    listen 80 default_server;
    root /app/public;
} 
2 trừ khi bạn có lý do chính đáng để sử dụng phiên bản trước đó.

Khối

server {
    listen 80 default_server;
    root /app/public;
} 
3 thiết lập chuyển tiếp cổng. Nó chuyển tiếp
server {
    listen 80 default_server;
    root /app/public;
} 
4 trên máy cục bộ đến
server {
    listen 80 default_server;
    root /app/public;
} 
4 trên hình ảnh. Bất kỳ yêu cầu nào trên máy chủ để
server {
    listen 80 default_server;
    root /app/public;
} 
6 sẽ được chuyển tiếp đến máy chủ Nginx đang chạy trong container.

Chạy dịch vụ

Để khởi động máy chủ, bạn sẽ cần mở một thiết bị đầu cuối trong hệ điều hành của mình và trỏ nó vào thư mục chứa tệp

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 của bạn. Trên Windows 10, phương pháp đơn giản nhất là sử dụng File Explorer (trước đây được gọi là Windows Explorer và không bị nhầm lẫn với Internet Explorer). Điều hướng đến thư mục chứa
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 của bạn, sau đó nhấp vào Tệp và sau đó mở Windows PowerShell. Trên Linux, hầu hết các trình quản lý tệp đều có thiết bị đầu cuối mở ở đây hoặc nút tương tự. Trên macOS, bạn sẽ cần bật tùy chọn này trước.

Khi bạn có thiết bị đầu cuối của bạn mở tại đúng vị trí, hãy nhập

server {
    listen 80 default_server;
    root /app/public;
} 
9. Bạn sẽ thấy đầu ra tương tự như hình ảnh dưới đây.

Hướng dẫn using docker for php development - sử dụng docker để phát triển php

Nếu bạn nhận được bất kỳ thông báo lỗi nào, hãy kiểm tra xem Docker có được cài đặt và chạy chính xác không. Nếu bạn thấy đầu ra như trên, bạn có thể kết nối với máy chủ bằng cách truy cập http://127.0.0.1 trong trình duyệt của bạn. Nếu nó hoạt động, bạn sẽ thấy trang thử nghiệm Nginx, như hình dưới đây.

Hướng dẫn using docker for php development - sử dụng docker để phát triển php

Tại sao không phải Apache?

Trước khi chúng tôi tiếp tục, bạn có thể tự hỏi tại sao tôi không sử dụng Apache ở đây. Nếu bạn đã sử dụng XAMPP hoặc gói tương tự, máy chủ web mà bạn sử dụng là Apache. Máy chủ web là một phần của máy chủ lắng nghe các yêu cầu từ trình duyệt web và gửi các tệp.

Apache vẫn ổn, và nó hoạt động, nhưng nó đã tồn tại mãi mãi. Khi Apache được tạo, web là một nơi rất khác. Apache là lớn, và có rất nhiều tính năng khác nhau đã đến và biến mất - nhưng Apache vẫn hỗ trợ. Web đã thay đổi rất nhiều kể từ khi Apache được tạo và mặc dù nó là một máy chủ có khả năng và sẽ hoạt động tốt, hầu hết các trang web ngày nay có xu hướng sử dụng nginx. Nó dễ dàng hơn để định cấu hình, nhẹ hơn và được điều chỉnh tốt hơn cho các loại nhiệm vụ mà rất nhiều trang web hiện đại sử dụng (như phát trực tuyến video) và do đó, thị phần của nó đang phát triển nhanh chóng với chi phí của Apache.

Lời khuyên chung của tôi là: Nếu bạn đã có một trang web chạy Apache, thì không có lý do gì để trải qua rắc rối khi thay đổi nó, nhưng nếu bạn bắt đầu một dự án mới từ đầu, hãy sử dụng Nginx.

Đặt tệp trên máy chủ

Bây giờ máy chủ đã được cài đặt và chạy qua Docker, chúng tôi có thể hiển thị các tệp của chúng tôi trên máy chủ. Nếu bạn đã từng sử dụng Apache, bạn sẽ đặt chúng vào thư mục

<h2>Hello, World!</h2>
0,
<h2>Hello, World!</h2>
1 hoặc
<h2>Hello, World!</h2>
2 ở đâu đó trên máy tính của bạn.

Khi máy chủ đang chạy trong một thùng chứa, nó không có quyền truy cập vào bất kỳ tệp nào trên máy tính của bạn. Tuy nhiên, Docker cho phép bạn chỉ định một âm lượng - một tệp hoặc thư mục trên máy tính của bạn mà chia sẻ với container. Bạn sẽ cần hai tập: tệp cấu hình

version: '3'
5 (mà chúng tôi đã tạo ra) và một thư mục sẽ lưu trữ các tệp trang web của bạn. Sửa đổi
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 của bạn để bao gồm hai
<h2>Hello, World!</h2>
5:

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app

Điều này làm cho tệp

version: '3'
5 và
<h2>Hello, World!</h2>
7 từ cùng một thư mục với
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 của bạn có sẵn trong container. Bất kỳ thay đổi nào bạn thực hiện đối với các tệp trong tập đều được thay đổi ngay lập tức trong thùng chứa và các tệp được chia sẻ giữa chúng.

Tệp

version: '3'
5 từ máy chủ được đặt tại
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app
0 bên trong container. Đây là thư mục trong đó Nginx đọc các tệp cấu hình từ. Thư mục
<h2>Hello, World!</h2>
7 được tạo ở gốc của container trong
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app
2 và là nơi bạn sẽ đặt tất cả các tập lệnh, hình ảnh và tệp JavaScript của trang web của bạn.

Trước khi khởi động lại máy chủ, hãy tạo tệp

version: '3'
5 trong cùng thư mục với
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 của bạn với các nội dung sau:

server {
    listen 80 default_server;
    root /app/public;
} 

Điều này nói với Nginx rằng đây là cấu hình mà nó nên sử dụng cho máy chủ mặc định và nó sẽ phục vụ các tệp từ thư mục

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app
5. Chúng tôi chỉ có thể phục vụ các tệp từ thư mục
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app
2, nhưng đó là cách thực hành tốt để giữ cho hầu hết các tệp PHP ra khỏi thư mục có thể truy cập công khai. Vì các tập lệnh PHP sẽ cần tải các tệp bằng
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app
7, chúng tôi sẽ đặt thư mục công khai của chúng tôi xuống một cấp.

Để kiểm tra nó hoạt động, hãy tạo một trang Hello Hello, thế giới tại

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app
8, tạo các thư mục khi bạn đi. Nội dung có thể như vậy:

<h2>Hello, World!</h2>

Khởi động lại máy chủ bằng cách quay lại thiết bị đầu cuối của bạn và nhấn

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app
9 để dừng máy chủ, sau đó chạy lệnh
server {
    listen 80 default_server;
    root /app/public;
} 
9 một lần nữa để khởi động lại nó. (Bạn có thể nhấn mũi tên lên và sau đó nhập thay vì gõ lại.)

Tải lại http://127.0.0.1 trong trình duyệt của bạn và bạn sẽ thấy lời chào, thế giới của bạn! trang thử nghiệm. Bây giờ bạn có một máy chủ web hoạt động với các tệp của bạn đang được phục vụ trên http://127.0.0.1 từ thư mục

server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
1 của bạn.

PHP

Nếu bạn muốn chạy các tập lệnh PHP, bạn sẽ cần thêm một dịch vụ khác cho PHP trong

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 của bạn và liên kết nó với
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
3:

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app

Có một dịch vụ mới,

server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
4, đang sử dụng hình ảnh
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
5. Đối với Nginx, bạn sẽ cần sử dụng gói
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
6 (Trình quản lý quy trình FASTCGI), nhưng bạn có thể chọn bất kỳ phiên bản PHP nào bạn thích - chẳng hạn như
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
7,
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
8,
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
9. Nếu bạn không chỉ định một phiên bản và chỉ sử dụng
<?php
phpinfo();
0, nó sẽ sử dụng phiên bản mới nhất - tại thời điểm viết, là
<?php
phpinfo();
1.

Vì PHP sẽ cần truy cập các tệp

<?php
phpinfo();
2 của bạn từ thư mục
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app
2, bạn sẽ cần gắn âm lượng trong hình ảnh PHP giống như cách bạn đã làm cho hình ảnh nginx. PHP không cần truy cập vào tệp cấu hình
version: '3'
5, do đó, không cần phải cung cấp cho nó quyền truy cập vào nó.

Thư mục

<h2>Hello, World!</h2>
7 hiện có thể truy cập trên máy chủ và trong các thùng chứa
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
3 và
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
4.

Trước khi khởi động lại máy chủ với

server {
    listen 80 default_server;
    root /app/public;
} 
9, chúng tôi cần định cấu hình Nginx để chạy các tệp
<?php
phpinfo();
2 thông qua dịch vụ PHP. Mở
version: '3'
5 của bạn và thay đổi nó thành phần sau:

server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 

Dòng

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        build:
            context: .
            dockerfile: PHP.Dockerfile
        volumes:
            - ./app:/app
1 bảo máy chủ tìm kiếm
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        build:
            context: .
            dockerfile: PHP.Dockerfile
        volumes:
            - ./app:/app
2 thay vì
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        build:
            context: .
            dockerfile: PHP.Dockerfile
        volumes:
            - ./app:/app
3 làm trang mặc định. Khối
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        build:
            context: .
            dockerfile: PHP.Dockerfile
        volumes:
            - ./app:/app
4 hướng dẫn Nginx chạy bất kỳ tệp nào với tiện ích mở rộng
<?php
phpinfo();
2 thông qua dịch vụ PHP (
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        build:
            context: .
            dockerfile: PHP.Dockerfile
        volumes:
            - ./app:/app
6, trong đó
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
4 là tên của dịch vụ được cấu hình trong
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3).

Tạo tệp

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        build:
            context: .
            dockerfile: PHP.Dockerfile
        volumes:
            - ./app:/app
9 tại
version: '3'
00:

<?php
phpinfo();

Khởi động lại máy chủ bằng cách nhấn

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        image: php:fpm
        volumes:
            - ./app:/app
9 trong thiết bị đầu cuối của bạn và chạy lại lệnh
server {
    listen 80 default_server;
    root /app/public;
} 
9. Nếu mọi thứ được thiết lập chính xác, khi bạn truy cập http://127.0.0.1, bạn sẽ thấy đầu ra
version: '3'
03:

Hướng dẫn using docker for php development - sử dụng docker để phát triển php

Giả sử trang web của bạn đang sử dụng MySQL, nếu bạn xem qua trang

version: '3'
03, bạn sẽ nhận thấy rằng không có trình điều khiển PHP MYSQL nào được cài đặt. Chúng tôi sẽ muốn cài đặt gói PDO trong PHP.

Điều này phức tạp hơn một chút, vì chúng ta cần cài đặt các gói trong hình ảnh. May mắn thay, hình ảnh PHP chính thức chứa một kịch bản để làm điều đó.

Chúng tôi sẽ sử dụng hình ảnh

<?php
phpinfo();
0 chính thức làm cơ sở và cài đặt trình điều khiển PDO MySQL vào đó. Điều này đòi hỏi phải xây dựng hình ảnh của chúng ta, nhưng điều đó không khó như nó.

Đầu tiên, sửa đổi

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 của bạn để hướng dẫn nó xây dựng hình ảnh cho PHP thay vì sử dụng hình ảnh
<?php
phpinfo();
0 hiện có:

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
    php:
        build:
            context: .
            dockerfile: PHP.Dockerfile
        volumes:
            - ./app:/app

Thay vì một mục

version: '3'
08, hiện tại có một dòng
version: '3'
09 theo
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
4. Chỉ thị
version: '3'
11 là thư mục mà tệp cấu hình nằm trong trường hợp của chúng tôi là
version: '3'
12, thư mục hiện tại (cùng thư mục với
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 của chúng tôi) và
version: '3'
14 là tên của tệp chúng tôi sẽ sử dụng để xây dựng hình ảnh của chúng tôi.

Tạo

version: '3'
15 trong cùng một thư mục với
version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 của bạn và thêm các mục sau:

version: '3'
0

Điều này sẽ cài đặt tiện ích mở rộng

version: '3'
17 cho PHP. Chỉ thị
version: '3'
18 nói với Docker rằng nó nên sử dụng
<?php
phpinfo();
0 làm hình ảnh cơ sở và chỉ thị
version: '3'
20 được sử dụng để chạy các lệnh bên trong hình ảnh. Bạn có thể chạy bất kỳ lệnh Linux ở đây. Trong trường hợp này, chúng tôi đang chạy tập lệnh
version: '3'
21, được cung cấp thuận tiện như một phần của gói PHP chính thức và cho phép chúng tôi cài đặt các tiện ích mở rộng PHP.

Nếu bạn muốn sử dụng thư viện MySQLI (mặc dù bạn có thể nên sử dụng PDO), bạn có thể cài đặt nó thay vì hoặc bên cạnh PDO:

version: '3'
1

Khởi động lại máy chủ của bạn bằng lệnh

server {
    listen 80 default_server;
    root /app/public;
} 
9. Lần này, bạn sẽ thấy đầu ra nhiều hơn khi nó xây dựng hình ảnh. Nó sẽ chỉ làm điều này trong lần đầu tiên bạn chạy
server {
    listen 80 default_server;
    root /app/public;
} 
9. Tuy nhiên, nếu bạn thực hiện bất kỳ thay đổi nào đối với
version: '3'
15 trong tương lai, bạn sẽ cần phải xây dựng lại nó theo cách thủ công bằng cách chạy lệnh
version: '3'
25.

Bạn có thể xác minh rằng tiện ích mở rộng

version: '3'
17 đã được cài đặt bằng cách xem đầu ra
version: '3'
03 trên http://127.0.0.1.

Trong khi chúng tôi cài đặt các tiện ích mở rộng, hãy để thêm tiện ích mở rộng

version: '3'
28 cho các thông báo lỗi đẹp hơn trên máy chủ phát triển của chúng tôi:

version: '3'
2

version: '3'
28 được cài đặt qua
version: '3'
30, được cung cấp như một phần của hình ảnh PHP chính thức. Xây dựng lại hình ảnh với
version: '3'
25, sau đó khởi động lại máy chủ bằng
server {
    listen 80 default_server;
    root /app/public;
} 
9. Đầu ra của
version: '3'
03 sẽ cho thấy cả
version: '3'
17 và
version: '3'
28 đều được cài đặt.

Mysql

Bây giờ chúng tôi đã sẵn sàng để cài đặt MySQL. Một lần nữa, chúng tôi sẽ thêm nó dưới dạng dịch vụ trong

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3. Tuy nhiên, thay vì cài đặt hình ảnh MySQL chính thức, chúng tôi sẽ sử dụng Mariadb, một sự thay thế thả vào với các điều khoản cấp phép trong tương lai có khả năng tốt hơn hiện tại mà MySQL thuộc sở hữu của Oracle. Nếu bạn đã sử dụng MySQL trước đây, Mariadb sẽ hoạt động giống nhau:

version: '3'
3

Hình ảnh chúng tôi sử dụng là

version: '3'
37. Như với NGINX và PHP, nếu bạn muốn bạn có thể chỉ định một phiên bản cụ thể của Mariadb tại đây.

Lần này, có một khối

version: '3'
38, được sử dụng để truyền một số biến cho container khi nó tạo ra. Chúng được sử dụng để định cấu hình cơ sở dữ liệu với các tùy chọn sau. Đặt các giá trị của riêng bạn cho các biến sau:

  • version: '3'
    
    39: Mật khẩu gốc cho cơ sở dữ liệu. Bạn có thể sử dụng điều này để đăng nhập dưới dạng
    version: '3'
    
    40 và quản lý cơ sở dữ liệu.

  • version: '3'
    
    41 và
    version: '3'
    
    42: Tên và mật khẩu cho người dùng MySQL được tạo với các quyền hạn chế. Bạn sẽ muốn sử dụng điều này từ các tập lệnh PHP của mình.

  • version: '3'
    
    43: Tên của lược đồ, được tạo tự động, mà người dùng xác định ở trên có quyền truy cập.

Ví dụ trên tạo cơ sở dữ liệu có tên

version: '3'
44, có thể truy cập bằng cách sử dụng người dùng
version: '3'
44 và mật khẩu
version: '3'
46.

Bạn cũng sẽ nhận thấy rằng có một mục

<h2>Hello, World!</h2>
5 ở phía dưới. Điều này tạo ra một loại âm lượng đặc biệt được ánh xạ vào hệ thống tập tin cục bộ. Đây sẽ là nơi lưu trữ dữ liệu cho MySQL - tất cả các bảng, bản ghi của bạn, v.v.

Lý do chúng tôi không muốn sử dụng một thư mục trong hệ thống tệp cục bộ là khi ứng dụng được tải lên một máy chủ web thực, bạn không muốn ghi đè lên cơ sở dữ liệu thực với bản thử nghiệm của bạn. Tất cả các hồ sơ môi trường thử nghiệm/phát triển của bạn sẽ được lưu trữ ở đây. Điều này cho phép bạn có một cơ sở dữ liệu khác trên máy chủ trực tiếp và máy chủ phát triển khi bạn đến tải lên trang web của mình.

Cuối cùng, khối

server {
    listen 80 default_server;
    root /app/public;
} 
3 hiển thị cổng 3306 để chúng tôi có thể kết nối với nó với một máy khách như MySQL Workbench để quản lý cơ sở dữ liệu. Tôi thực sự khuyên bạn nên sử dụng điều này qua phpmyadmin nếu đó là những gì bạn đã từng sử dụng, mặc dù bạn có thể đặt phpmyadmin vào thư mục
server {
    listen 80 default_server;
    root /app/public;

    index index.php index.html index.htm;

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;     
    }
} 
1 và chạy nó từ đó nếu bạn muốn.

Khởi động lại máy chủ của bạn. Sẽ mất một hoặc hai phút để tải xuống và định cấu hình Mariadb lần đầu tiên. Sau đó, trong tập lệnh PHP, hãy thử kết nối với MySQL với PDO và tên người dùng, mật khẩu và cơ sở dữ liệu đã chọn của bạn:

version: '3'
4

Chạy tập lệnh này trên máy chủ. Nếu bạn thấy phiên bản MySQL và không có thông báo lỗi nào, bạn sẽ kết nối với máy chủ MySQL của mình và tất cả đều được thiết lập chính xác.

Done!

Như bạn vừa khám phá ra, Docker có một chút thiết lập nếu bạn tự làm. Nếu bạn sử dụng các tệp cấu hình

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3 và cấu hình hiện có, nó có thể chỉ là một vài lệnh.

Khi bạn trực tiếp trang web của mình, bạn sẽ chỉ tải lên toàn bộ dự án, bao gồm

version: '3'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./nginx.conf:/etc/nginx/conf.d/nginx.conf
            - ./app:/app
3,
version: '3'
5 và
version: '3'
15, chạy
version: '3'
54 trên máy chủ (cờ
version: '3'
55 chạy nó làm dịch vụ trong nền) và nó sẽ chạy chính xác trang web bạn 'Nhìn lại trên máy phát triển của bạn! Bạn đã giành chiến thắng cần thiết lập thủ công và cài đặt PHP, Mariadb và Nginx trên máy chủ web.

Một khi bạn hiểu được nó, bạn sẽ không bao giờ nhìn lại. Docker làm cho quá trình phát triển một trang web đơn giản hơn rất nhiều vì mọi thứ đều được khép kín.

Tl; dr! Chỉ cần cho tôi các tập tin!

Nếu bạn chỉ muốn khởi động một máy chủ với cấu hình được hiển thị ở đây, hãy làm theo các bước sau:

  1. Cài đặt Docker.
  2. Mở một thiết bị đầu cuối trong thư mục bạn muốn lưu trữ trang web của mình trong (Sử dụng Tệp> Mở PowerShell trên Windows để mở PowerShell trong thư mục hiện đã mở).
  3. Chạy lệnh
    version: '3'
    
    56 (chấm cuối cùng đó rất quan trọng!).
  4. Chạy
    server {
        listen 80 default_server;
        root /app/public;
    } 
    
    9.
  5. Điều hướng đến http://127.0.0.1.
  6. Tạo tập lệnh và tệp PHP của bạn trong
    server {
        listen 80 default_server;
        root /app/public;
    
        index index.php index.html index.htm;
    
        location ~ \.php$ {
            fastcgi_pass php:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;     
        }
    } 
    
    1.

Chúng ta có thể sử dụng Docker cho PHP không?

Sử dụng Docker với PHP (và hơn thế nữa!), Trình khởi chạy mã PHP được cấu hình để sử dụng Docker. Docker là phần mềm container hóa có thể giúp bạn đóng gói và triển khai các ứng dụng của mình trong môi trường nhà phát triển nhất quán.The DocuSign PHP code example launcher is configured to use Docker. Docker is containerization software that can help you package and deploy your applications in a consistent developer environment.

Docker có thể được sử dụng để phát triển không?

Docker là một dự án nguồn mở tự động hóa sự phát triển, triển khai và chạy các ứng dụng bên trong các thùng chứa bị cô lập.Các container cho phép các nhà phát triển gói một ứng dụng với tất cả các bộ phận cần thiết, chẳng hạn như thư viện và các phụ thuộc khác, và gửi nó như một gói.. Containers allow developers to bundle up an application with all of the parts it needs, such as libraries and other dependencies, and ship it as one package.

Tôi có nên sử dụng Docker cho Laravel không?

Docker hoàn toàn không bắt buộc để chạy Laravel!Mọi người đã chạy Laravel trong nhiều năm mà không có Docker, và tiếp tục làm như vậy.Docker chỉ là một tùy chọn bổ sung để có được một nhà phát triển và chạy cho những người không muốn cài đặt thủ công và định cấu hình PHP, Apache, v.v.! People have been running Laravel for years without Docker, and continue to do so. Docker is just an extra option to get a dev env up and running for people who don't want to manually install and configure PHP, Apache and so on.

Docker có tốt cho các ứng dụng web không?

Docker cho phép bạn có được nhiều ứng dụng riêng lẻ chạy trên cùng số lượng máy chủ như các công nghệ khác.Nó làm cho việc phát triển các ứng dụng được đóng gói, sẵn sàng để chạy trở nên dễ dàng-cung cấp mọi thứ trong 'Container' chứa tất cả các thư viện và phụ thuộc cho một ứng dụng.. It makes developing encapsulated, ready-to-run applications a breeze – delivering everything in 'containers' that hold all libraries and dependencies for an app.