Chạy PHP trong docker

Trong hướng dẫn này, chúng ta sẽ xem cách chạy nhiều bộ chứa PHP bằng Docker trên cùng một máy. Và làm cách nào để truy cập các bộ chứa PHP Docker đang chạy bên ngoài máy chủ?. Docker chạy các container trong một môi trường bị cô lập. Vì vậy, chúng tôi…

Mục đích của bài đăng này là để xem liệu có thể tránh cài đặt PHP trên các máy phát triển hay không. Để đạt được điều này, ý tưởng là tạo một lệnh PHP dựa trên bộ chứa docker

PHP và docker

PHP có thể được sử dụng với docker. Trong sản xuất, docker mang lại sự nhất quán với các ứng dụng khác được mã hóa bằng các ngôn ngữ khác nhau. Và điều này có thể đơn giản hóa rất nhiều việc triển khai của họ

Nhưng docker cũng có thể hữu ích trong môi trường phát triển. Không còn nghi ngờ gì nữa, khi có một nhà phát triển mới trong một dự án, docker sẽ giúp anh ta cài đặt tất cả các phụ thuộc cần thiết dễ dàng hơn rất nhiều. Đồng thời nó đảm bảo rằng môi trường là hoàn toàn giống nhau cho mọi người, trong quá trình phát triển cũng như trong sản xuất. Điều này có thể giúp bạn tránh xa những lỗi lạ

Có những hướng dẫn hay giải thích cách sử dụng docker-compose để định cấu hình dự án của bạn, như hướng dẫn này

Để sử dụng vùng chứa sản xuất trong quá trình phát triển, bạn chỉ cần tạo một ổ đĩa. Vì vậy, mã trên hệ thống của bạn sẽ thay thế mã bên trong vùng chứa. Bằng cách này, mã có thể được sửa đổi bên ngoài vùng chứa trong trình chỉnh sửa mã. Những thay đổi được phản ánh ngay lập tức. Và điều này hoạt động theo cả hai cách. Bạn có thể dùng docker exec để chạy một số lệnh trong container và nó sẽ ảnh hưởng đến code trên máy của bạn

Cho đến nay rất tốt, không cần cài đặt PHP bên ngoài docker cho trường hợp sử dụng này

Cần một lệnh PHP sau khi tất cả?

Tất cả điều này hoạt động tốt. Nhưng vẫn có trường hợp PHP cần thiết bên ngoài vùng chứa của ứng dụng

  • Nếu bạn muốn sử dụng trình nói dối hoặc trình định dạng mã trong trình chỉnh sửa mã của mình, nó sẽ cần quyền truy cập vào PHP
  • Tại một số điểm, bạn cũng có thể muốn chạy một số tập lệnh nhỏ không thuộc dự án

Đối với điều này, bạn vẫn cần PHP bên ngoài docker

Tạo một lệnh PHP

Vẫn có giải pháp tránh cài đặt PHP bên ngoài docker

Bạn có thể sử dụng

# the current directory and the script directory should be included in the home directory for this to work
docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php
0 để tạo vùng chứa và thực thi PHP. Bạn chỉ cần thêm một số khối lượng vào thùng chứa. Các tập này phải bao gồm các đường dẫn đến mã của bạn

1
2

# the current directory and the script directory should be included in the home directory for this to work
docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php

Lưu ý rằng điều này có thể được bao gồm trong một kịch bản

1
2

#!/bin/bash
docker run -it --rm -v /home:/home -w $PWD php:cli php $@

Mà có thể được sử dụng như thế này.

# the current directory and the script directory should be included in the home directory for this to work
docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php
1

Và bây giờ bạn có lệnh php của mình

Nó hoạt động nhưng nó làm tăng thời gian khởi động đến mức không thể sử dụng được trong trình chỉnh sửa mã. Ít nhất nếu trình định dạng mã của bạn được gọi mỗi khi bạn lưu tệp. Sự chậm trễ là do việc tạo vùng chứa. Vì vậy, có thể có một cách để giảm chi phí này

Bạn có thể tạo vùng chứa chạy ngầm. Thay vì thực thi tập lệnh, vùng chứa sẽ ngủ vô thời hạn. Sau đó, bạn có thể sử dụng docker exec để thực thi tập lệnh PHP trong vùng chứa

1
2
3
4
5
6
7
8

# create a sleeping container
docker run -d -i --name php_worker -v /home:/home php:cli bash -c "while true; do sleep 1; done;"

# execute the php script
docker exec -it -w $PWD php_worker php /home/my_script.php

# remove the container
docker kill php_worker && docker rm php_worker

Trên máy của tôi, tôi nhận được những kết quả này cho

# the current directory and the script directory should be included in the home directory for this to work
docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php
2

MethodExecution timedocker run~ 900 msdocker exec~ 180 msphp~ 15 ms

Phiên bản

# the current directory and the script directory should be included in the home directory for this to work
docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php
3 tiết kiệm vài mili giây so với
# the current directory and the script directory should be included in the home directory for this to work
docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php
0. Nó không hoàn hảo nhưng nó đủ để làm cho nó có thể sử dụng được

Trong thực tế

Tạo vùng chứa và sau đó sử dụng docker exec không thực sự thiết thực. Vì vậy, tôi đã viết một tập lệnh python sử dụng ý tưởng này

Nó sử dụng

# the current directory and the script directory should be included in the home directory for this to work
docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php
3 để chạy lệnh PHP. Trước khi chạy lệnh exec, nó sẽ kiểm tra xem bộ chứa PHP đang ngủ có tồn tại không. Nếu không, nó tạo ra nó. Vùng chứa này sẽ chạy trong một khoảng thời gian xác định, do đó, chi phí hoạt động do việc tạo vùng chứa này gây ra sẽ chỉ ảnh hưởng đến lệnh gọi đầu tiên. Nó cũng có thể ghi nhật ký để giúp gỡ lỗi các sự cố cuối cùng

Xin lưu ý rằng tập lệnh có thể cần tải xuống hình ảnh docker, vì vậy có thể mất thời gian trong lần gọi đầu tiên

1
2
2

1
2
3

Sao chép tập lệnh trong

# the current directory and the script directory should be included in the home directory for this to work
docker run -it --rm -v /home:/home -w $PWD php:cli php /home/my_script.php
6 [hoặc bất kỳ đích nào khác có trong $PATH của bạn] và bạn có một lệnh PHP hoạt động với docker

1
2

1
2
6

Kịch bản có hai hạn chế

  • Nó phải được gọi từ một thư mục được chia sẻ với bộ chứa docker
  • Tập lệnh và các phần phụ thuộc của nó phải nằm trong các thư mục được chia sẻ với vùng chứa

Tại sao lại sử dụng cái này?

Với tập lệnh này, có thể tránh cài đặt PHP trên hệ thống của bạn. Nhưng sử dụng trình quản lý gói như apt vẫn là một lựa chọn tốt. Vì vậy, những lợi thế của giải pháp docker này là gì?

  • Tùy thuộc vào kho lưu trữ trình quản lý gói của bạn, có thể mất thời gian để tải phiên bản PHP mới nhất. Mặt khác, các hình ảnh docker PHP chính thức được cập nhật thường xuyên. Vì vậy, bạn có thể có phiên bản mới nhất nhanh hơn
  • Với tập lệnh này, bạn có thể chạy các phiên bản PHP khác nhau một cách dễ dàng. Bạn chỉ cần thay đổi tên của các hình ảnh trong kịch bản
  • Bạn có thể tạo và sử dụng hình ảnh PHP của riêng mình với các phần mở rộng bổ sung. Chia sẻ hình ảnh với những người còn lại trong nhóm của bạn để họ có thể có cùng một môi trường
  • Bạn cũng có thể sử dụng hình ảnh của một trong các dự án PHP của mình

Trong thực tế, có thể bạn sẽ muốn cài đặt PHP với trình quản lý gói. Nhưng tập lệnh này có thể là một bổ sung tốt cho các trường hợp sử dụng cụ thể

Các ứng dụng khác

Trong ví dụ này, tập lệnh được sử dụng cho PHP. Nhưng nó không bị giới hạn ở đó. Nó có thể được điều chỉnh để sử dụng với các ngôn ngữ kịch bản khác như Node. js hoặc ruby ​​chẳng hạn. Bạn chỉ cần thay đổi thông số cấu hình

Bạn có thể sử dụng localhost trong docker không?

Ngoài ra, bạn có thể chạy bộ chứa docker với cài đặt mạng được đặt thành máy chủ . Một bộ chứa như vậy sẽ chia sẻ ngăn xếp mạng với máy chủ docker và từ quan điểm của bộ chứa, localhost [hoặc 127. 0. 0. 1 ] sẽ đề cập đến máy chủ docker.

Alpine trong docker là gì?

Hình ảnh chính thức của Alpine Docker là gì? . Đó là gói phần mềm thực thi cho Docker và ứng dụng của bạn biết cách hoạt động. Hình ảnh bao gồm mã nguồn, thư viện, công cụ và các phần phụ thuộc cốt lõi khác mà ứng dụng của bạn cần. a building block for Alpine Linux Docker containers. It's an executable software package that tells Docker and your application how to behave. The image includes source code, libraries, tools, and other core dependencies that your application needs.

Bạn có thể Dockerize cơ sở dữ liệu không?

Docker rất phù hợp để chạy cơ sở dữ liệu trong môi trường phát triển . Bạn thậm chí có thể sử dụng nó cho cơ sở dữ liệu của các dự án nhỏ, không quan trọng chạy trên một máy chủ. Chỉ cần đảm bảo có các bản sao lưu thường xuyên [như bạn nên làm trong mọi trường hợp] và bạn sẽ ổn thôi.

Chủ Đề