Làm cách nào để chạy PHP MySQL trong Docker?

Tiếp tục với Containerize This. loạt bài này, chúng tôi đang xem xét các công nghệ ứng dụng web phổ biến và cách sử dụng chúng trong bộ chứa Docker một cách hiệu quả

PHP, Apache và MySQL có thị phần rất lớn trên các hệ thống quản lý nội dung và ứng dụng web trên internet và với rất nhiều nhà phát triển sử dụng các công nghệ này, có rất nhiều mối quan tâm để hiện đại hóa cách họ sử dụng chúng từ các nhà phát triển địa phương. . Hôm nay chúng ta sẽ xem xét một số cách để chứa và liên kết PHP, Apache và MySQL với nhau đồng thời trình bày một số mẹo, thủ thuật và các phương pháp hay nhất sẽ giúp bạn có cách tiếp cận hiện đại khi phát triển và triển khai các ứng dụng PHP của mình

Có 5 tệp đơn giản cho bản trình diễn này mà bạn có thể sao chép từ https. //github. com/mzazon/php-apache-mysql-containerized hoặc chỉ cần sao chép và dán từ bài đăng này để sao chép cấu trúc thư mục sau. Xin lưu ý rằng một số Docker và nguyên tắc bảo mật đã bị bỏ qua ở đây vì mục đích trình diễn và đơn giản. Cụ thể là PHP sử dụng thông tin đăng nhập gốc, mật khẩu MySQL được mã hóa cứng/yếu, thiếu SSL, v.v. Không chạy mã này trong sản xuất

/php-apache-mysql/
├── apache
│   ├── Dockerfile
│   └── demo.apache.conf
├── docker-compose.yml
├── php
│   └── Dockerfile
└── public_html
    └── index.php

Sau khi cấu trúc này được sao chép hoặc sao chép với các tệp này và Docker được cài đặt cục bộ, bạn chỉ cần chạy “docker-compose up” từ thư mục gốc của dự án và trỏ trình duyệt của bạn [hoặc curl] tới http. //máy chủ cục bộ. 8080 để xem demo. Chúng ta sẽ tìm hiểu “docker-compose” là gì và điều gì tạo nên trình diễn cơ bản này trong các phần sau

Chúng tôi sẽ sử dụng ứng dụng PHP đơn giản sau đây để chứng minh mọi thứ

mục lục. php

Hello Cloudreach!

Attempting MySQL connection from php...

Mã này cố gắng kết nối với cơ sở dữ liệu MySQL bằng giao diện mysqli từ PHP. Nếu thành công, nó in một thành công. Nếu không, nó sẽ in một thông báo không thành công

Docker Soạn

Định dạng này đã xuất hiện được một thời gian ở Dockerland và hiện đang ở phiên bản 3. 6 tại thời điểm viết bài này. Chúng tôi sẽ sử dụng 3. 2 ở đây để đảm bảo khả năng tương thích rộng rãi với những người có thể không chạy phiên bản Docker mới nhất và tốt nhất [tuy nhiên, bạn phải luôn nâng cấp. ]

Định dạng này cho phép xác định các bộ dịch vụ tạo nên toàn bộ ứng dụng. Nó cho phép bạn xác định các phụ thuộc cho các dịch vụ, mạng, khối lượng, v.v. dưới dạng mã. Khi đưa vào sản xuất, bạn thậm chí có thể chỉ định các tham số triển khai trên các dịch vụ cho phép bạn sao chép, thay đổi quy mô, cập nhật và tự phục hồi trên Docker Swarm hoặc thậm chí Kubernetes trên Docker cho Mac hoặc Docker Enterprise Edition mới nhất

soạn thảo docker. yml

version: "3.2"
services:
  php:
    build: './php/'
    networks:
      - backend
    volumes:
      - ./public_html/:/var/www/html/
  apache:
    build: './apache/'
    depends_on:
      - php
      - mysql
    networks:
      - frontend
      - backend
    ports:
      - "8080:80"
    volumes:
      - ./public_html/:/var/www/html/
  mysql:
    image: mysql:5.6.40
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
networks:
  frontend:
  backend:

Tách phụ thuộc, chạy một quy trình trên mỗi vùng chứa [PID 1]

Các bộ chứa ở lõi chỉ đơn giản là quá trình đóng gói trong nhân Linux dùng chung, để cho phép nhiều quá trình chạy bên trong không gian riêng của chúng mà không can thiệp hoặc tương tác trừ khi chúng tôi nói rõ ràng với chúng rằng chúng có thể. Do đó, cách tốt nhất là chạy dịch vụ chính của bạn trong một vùng chứa dưới dạng PID 1 trong thời gian dài. Điều này có nghĩa là không có quy trình nào khác được chạy bên trong vùng chứa của bạn. Nó cho phép các bộ chứa duy trì vòng đời của quy trình linux gốc, tôn trọng các tín hiệu quy trình linux, cho phép bảo mật cao hơn và sẽ giúp cuộc sống của bạn dễ dàng hơn khi bạn lên lịch cho các bộ chứa này trên các bộ điều phối như Docker Swarm hoặc Kubernetes trong quá trình sản xuất

Một ví dụ hoàn hảo là tách riêng Apache và PHP bằng cách xây dựng chúng thành các vùng chứa riêng biệt. Chúng tôi thấy khách hàng của mình thường bắt đầu kết hợp Apache và PHP với nhau ngay từ đầu trong hành trình Docker bằng cách xây dựng các hình ảnh tùy chỉnh bao gồm cả Apache và PHP trong hình ảnh. Điều này dễ dàng hoạt động trong các kịch bản phát triển và là một cách nhanh chóng để bắt đầu, nhưng vì chúng tôi muốn theo một cách tiếp cận tách rời hiện đại hơn, chúng tôi muốn tách chúng ra

Các Dockerfile đơn giản sau đây là những gì chúng tôi đang sử dụng trong ví dụ này để xây dựng môi trường Apache và PHP tách rời

apache/Dockerfile

FROM httpd:2.4.33-alpine
RUN apk update; \
    apk upgrade;
# Copy apache vhost file to proxy php requests to php-fpm container
COPY demo.apache.conf /usr/local/apache2/conf/demo.apache.conf
RUN echo "Include /usr/local/apache2/conf/demo.apache.conf" \
    >> /usr/local/apache2/conf/httpd.conf

php/Dockerfile

FROM php:7.2.7-fpm-alpine3.7
RUN apk update; \
    apk upgrade;
RUN docker-php-ext-install mysqli

Lưu ý rằng chúng tôi chạy các vùng chứa tối thiểu bất cứ khi nào có thể, trong ví dụ này, chúng tôi đang sử dụng hình ảnh chính thức dựa trên dãy núi cao

mạng

Bây giờ chúng ta có các hình ảnh vùng chứa cho Apache và PHP được tách rời, làm cách nào để chúng ta tương tác với nhau? . Chúng ta sẽ để Apache lắng nghe trên cổng 80 và các kết nối proxy yêu cầu PHP đến cổng 9000 của bộ chứa PHP của chúng ta, sau đó bộ chứa PHP phân phát chúng dưới dạng HTML được hiển thị. Nghe có vẻ phức tạp? . Điều này rất phổ biến trong các ứng dụng hiện đại, Apache và NGINX rất giỏi trong việc ủy ​​quyền này và có rất nhiều tài liệu hỗ trợ hành vi này

Lưu ý trong ví dụ về Docker Compose ở trên, chúng tôi liên kết các vùng chứa cùng với các mạng lớp phủ mà chúng tôi xác định là “giao diện người dùng” và “phụ trợ”. Bằng cách chỉ định các mạng này trong các dịch vụ của mình, chúng tôi có thể tận dụng một số tính năng Docker thực sự thú vị. Cụ thể, chúng ta có thể tham chiếu đến các bộ chứa/dịch vụ theo tên dịch vụ của chúng trong mã, vì vậy chúng ta không phải lo lắng về việc mã hóa địa chỉ IP lộn xộn nữa. Phù. Docker xử lý việc này cho chúng tôi bằng cách quản lý và cập nhật các tệp /etc/hosts trong các vùng chứa một cách liền mạch để cho phép trao đổi chéo này. Chúng tôi cũng có thể thực thi những vùng chứa nào có thể nói chuyện với nhau. Điều này cho phép các ứng dụng an toàn hơn. Lưu ý trong ví dụ này, chúng tôi đã xác định “frontend” và “backend”. Chúng tôi có thể đặt các dịch vụ php và mysql của mình trong một mạng bị hạn chế hơn và không tiếp xúc với thế giới bên ngoài và chỉ hiển thị bộ chứa apache của chúng tôi trên cổng được yêu cầu. Điều này là tuyệt vời cho môi trường sản xuất

Một lưu ý. Chúng tôi cần một tệp cấu hình vhost của apache được thiết lập để ủy quyền các yêu cầu này cho các tệp PHP tới bộ chứa PHP. Bạn sẽ nhận thấy trong Dockerfile cho Apache mà chúng tôi đã xác định ở trên, chúng tôi thêm tệp này và sau đó đưa nó vào cơ sở httpd. tập tin conf. Cái này dành cho việc ủy ​​quyền cho phép tách rời Apache và PHP. Trong ví dụ này, chúng tôi gọi nó là demo. apache. conf và chúng tôi có các mô-đun ủy quyền được xác định cũng như VirtualHost. Cũng lưu ý rằng chúng tôi gọi bộ chứa php bằng mã “php”, do tích hợp tệp /etc/hosts mà Docker xử lý cho chúng tôi, hoạt động hoàn hảo

apache/bản trình diễn. apache. conf

ServerName localhost

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so


    # Proxy .php requests to port 9000 of the php-fpm container
    ProxyPassMatch ^/[.*\.php[/.*]?]$ fcgi://php:9000/var/www/html/$1
    DocumentRoot /var/www/html/
    
        DirectoryIndex index.php
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    
    
    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    ErrorLog /proc/self/fd/2


tập

Tính năng cuối cùng mà chúng tôi sẽ gọi ở đây cho mục đích trình diễn là việc sử dụng các khối để phân phát mã của chúng tôi. Cả bộ chứa PHP và Apache đều có quyền truy cập vào một “ổ đĩa” mà chúng tôi xác định trong docker-compose. yml ánh xạ thư mục public_html của kho lưu trữ của chúng tôi tới các dịch vụ tương ứng để họ truy cập. Khi chúng tôi thực hiện việc này, chúng tôi ánh xạ một thư mục trên hệ thống tệp máy chủ [bên ngoài bối cảnh vùng chứa] vào bên trong các vùng chứa đang chạy. Các nhà phát triển có thể muốn thiết lập các dự án của họ như thế này vì nó cho phép họ chỉnh sửa tệp bên ngoài vùng chứa, tuy nhiên, vùng chứa sẽ phân phát mã PHP đã cập nhật ngay khi các thay đổi được lưu

Các ổ đĩa là một cấu trúc rất mạnh mẽ của thế giới Docker và chúng tôi mới chỉ vạch ra bề nổi của những gì một người có thể đạt được bằng cách sử dụng chúng trong quá trình phát triển và sản xuất. Vui lòng xem tài liệu chính thức về ổ đĩa để biết thêm các trường hợp sử dụng và phương pháp hay nhất

Trình diễn docker-compose up

$ docker-compose up


php_1     | [16-Jul-2018 02:08:11] NOTICE: fpm is running, pid 1
php_1     | [16-Jul-2018 02:08:11] NOTICE: ready to handle connections
apache_1  | [Mon Jul 16 02:08:12.494294 2018] [pid 1:tid 140290664872840] AH00489: Apache/2.4.33 [Unix]
apache_1  | [Mon Jul 16 02:08:12.496833 2018] [pid 1:tid 140290664872840] AH00094: Command line: 'httpd -D FOREGROUND'
mysql_1   | 2018-07-16 02:08:12 1 [Note] mysqld: ready for connections.
mysql_1   | Version: '5.6.40'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306 MySQL Community Server [GPL]

Lưu ý cách 3 trình nền này chạy trên PID 1 bên trong mỗi vùng chứa, đây được coi là cách thực hành tốt nhất để xây dựng vùng chứa

$  curl localhost:8080
Hello Cloudreach!
Attempting MySQL connection from php...
Connected to MySQL successfully!

Bây giờ, hãy lưu ý trong nhật ký rằng cả bộ chứa apache và bộ chứa php đều đáp ứng yêu cầu, như mong muốn

________số 8_______
Phần kết luận

Với những nguyên tắc cơ bản này, bạn có thể liên kết các dịch vụ với nhau để tạo ra các ứng dụng. Bạn có thể dễ dàng đưa “composer” vào bộ chứa PHP để xây dựng và chạy ứng dụng PHP/Laravel của mình theo cách tương tự. Có lẽ bạn muốn chạy Drupal hoặc WordPress và tách riêng PHP khỏi phiên bản Apache, điều đó cũng có thể xảy ra. Bạn thậm chí có thể sử dụng điều này để kiểm tra liền mạch các bản nâng cấp phiên bản PHP hoặc phiên bản MySQL với sự thay đổi mã tối thiểu. Có rất nhiều lợi ích khi hiện đại hóa ứng dụng của bạn với Docker bằng cách sử dụng docker-compose và một số hình ảnh và tính năng chính thức mới nhất. Nếu bạn bắt đầu hành trình Docker của mình bằng những kỹ thuật này, thì bạn sẽ có một khởi đầu tuyệt vời trong hành trình container hóa của mình

Đọc Phần 1 của Containerize This. hàng loạt ở đây. Và Phần 2 tại đây

Bạn muốn tìm hiểu thêm về cách Bộ chứa có thể giúp tổ chức của bạn tối ưu hóa và hiện đại hóa các ứng dụng của bạn trên đám mây?

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

Dưới đây là các bước bạn có thể thực hiện để cài đặt Dockerhub MySQL Container. .
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

Làm cách nào để chạy tệp PHP trong Docker?

Trong các bước sau, chúng ta đang tạo và chạy ứng dụng php. .
Tạo một thư mục
Tạo một tệp Php
Tạo một DockerFile
Tạo hình ảnh Docker
Chạy hình ảnh Docker

Làm cách nào để chạy các lệnh MySQL trong Docker?

Chúng tôi sẽ chỉ hiển thị quy trình cơ bản ở đây cho tùy chọn thứ hai ở trên. .
Tạo một thư mục dữ liệu trên một ổ đĩa phù hợp trên hệ thống máy chủ của bạn, e. g. /của tôi/của riêng/datadir
Bắt đầu vùng chứa mysql của bạn như thế này. $ docker run --name some-mysql -v /my/own/datadir. /var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql. nhãn

Làm cách nào để cài đặt PHP trong bộ chứa Docker?

Để thiết lập bộ chứa tác nhân PHP cho Docker. Đảm bảo cài đặt PHP có sẵn trong vùng chứa. Ví dụ: sử dụng hình ảnh Docker đã xuất bản như php. 7. 1. Để cài đặt tác nhân, hãy tải xuống gói tác nhân PHP từ trang web tải xuống tệp tar của New Relic và chạy tập lệnh newrelic-install với đối số cài đặt .

Chủ Đề