Làm cách nào để cài đặt PHP 8 trong Docker?

Các tập lệnh này có thể được chạy bằng các lệnh sau bởi một siêu người dùng. Điều này cài đặt rất nhiều thứ, đọc đầu tiên

Bạn có thể thêm

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
95 vào sau đó kết thúc để chạy khô trước

Chúng được thử nghiệm trên phiên bản ec2 chạy vscode từ xa

Cách sử dụng

  • Thiết lập từ xa vscode
  • Chạy tất cả các tập lệnh này
  • Khởi động lại ví dụ
  • curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
    96
  • curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
    97 sẽ hoạt động ngay bây giờ
    • Ngoài ra PHP, nút, git, ssh

kịch bản

PHP8. 1 Và Nhà soạn nhạc

Cái này cài đặt PHP 8. 1, phần mở rộng và nhà soạn nhạc. Nó sẽ xuất ra sự giúp đỡ của nhà soạn nhạc

curl -fsSL https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/427f097ae2b4c66e7ad013407ae8fe858bb849e6/php81.sh | sh

Nút 16, với nvm. Ngoài ra, sợi

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh

docker

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh

Đặt quyền cho Docker

Nếu bạn thử và chạy

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
98 hoặc bất cứ thứ gì bây giờ, bạn có thể sẽ gặp phải lỗi quyền Docker, mã 13

Điều này sẽ làm cho người dùng

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
99 trở thành siêu người dùng. Đó là người dùng đang chạy Docker

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh

Sản lượng dự kiến.

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
0

git và ssh

Điều này thiết lập git và tạo và cặp khóa SSH. Nó xuất ra khóa công khai

Đảm bảo thay đổi email@email. gửi email đến email của bạn và tên của bạn. Giữ dấu ngoặc kép xung quanh mỗi

Trong phần này của loạt bài hướng dẫn phát triển PHP trên Docker, chúng ta sẽ xem lại các hướng dẫn trước đó và cập nhật một số thứ để cập nhật vào năm 2022

Tất cả các mẫu mã đều có sẵn công khai trong kho Hướng dẫn Docker PHP của tôi trên Github.
Bạn tìm thấy nhánh của hướng dẫn này tại part-4-1-docker-from-scratch-for-php-applications-in-2022

Tất cả các phần đã xuất bản của Docker PHP Tutorial được thu thập dưới một trang chuyên dụng tại Docker PHP Tutorial. Phần trước là Cấu trúc thiết lập Docker cho Dự án PHP và phần sau là PhpStorm, Docker và Xdebug 3 trên PHP 8. 1 vào năm 2022

Nếu muốn theo dõi, vui lòng đăng ký RSS feed hoặc qua email để nhận thông báo tự động khi có phần tiếp theo. )

Mục lục

  • Giới thiệu
  • Thiết lập docker cục bộ
  • docker
    • soạn thảo docker
      • Tệp
        .
        └── .docker/
            ├── docker-compose/
            |   ├── docker-compose.yml
            |   └── 
            ├── images/
            |   ├── nginx/
            |   |   ├── Dockerfile
            |   |   └── 
            |   └── 
            ├── .env
            └── .env.example
        
        2 và các biến ENV bắt buộc
    • Hình ảnh
      • hình ảnh PHP
        • ENV so với ARG
      • Quy ước đặt tên hình ảnh
      • Môi trường và xây dựng mục tiêu
  • Makefile
    • .
      └── .docker/
          ├── docker-compose/
          |   ├── docker-compose.yml
          |   └── 
          ├── images/
          |   ├── nginx/
          |   |   ├── Dockerfile
          |   |   └── 
          |   └── 
          ├── .env
          └── .env.example
      
      3 bao gồm
    • biến được chia sẻ.
      .
      └── .docker/
          ├── docker-compose/
          |   ├── docker-compose.yml
          |   └── 
          ├── images/
          |   ├── nginx/
          |   |   ├── Dockerfile
          |   |   └── 
          |   └── 
          ├── .env
          └── .env.example
      
      4
      • sửa đổi thủ công
    • Thực thi các tham số bắt buộc
  • Tạo + Docker = <3
    • Đảm bảo trình tự thi công
    • Chạy các lệnh trong docker container
      • Giải quyết các vấn đề về quyền
  • POC PHP
  • kết thúc

Giới thiệu

Nếu bạn đã đọc hướng dẫn trước Cấu trúc thiết lập Docker cho Dự án PHP, bạn có thể gặp một số thay đổi quan trọng. Hướng dẫn đã được xuất bản hơn 2 năm trước, Docker đã phát triển và tôi đã tìm hiểu thêm về nó. Ngoài ra, tôi đã thu thập kinh nghiệm thực tế (tốt và xấu) với thiết lập trước đó. Bây giờ tôi sẽ xem xét hầu hết các điểm trong Nguyên tắc cơ bản về xây dựng các thùng chứa là "không bắt buộc" hoặc đơn giản là "được thiết kế quá mức/quá phức tạp". Để được bê tông

  • Đặt múi giờ
    • không bắt buộc nếu mặc định đã là UTC (hầu như luôn luôn như vậy)
  • Đồng bộ hóa quyền sở hữu tệp và thư mục trên ổ đĩa được chia sẻ
    • đây chỉ là vấn đề nếu các tệp cần được sửa đổi bởi bộ chứa và hệ thống máy chủ - điều này chỉ thực sự phù hợp với bộ chứa PHP
    • ngoài ra, tôi khuyên bạn nên thêm một người dùng hoàn toàn mới (e. g.
      .
      └── .docker/
          ├── docker-compose/
          |   ├── docker-compose.yml
          |   └── 
          ├── images/
          |   ├── nginx/
          |   |   ├── Dockerfile
          |   |   └── 
          |   └── 
          ├── .env
          └── .env.example
      
      5) thay vì sử dụng lại một cái hiện có như
      .
      └── .docker/
          ├── docker-compose/
          |   ├── docker-compose.yml
          |   └── 
          ├── images/
          |   ├── nginx/
          |   |   ├── Dockerfile
          |   |   └── 
          |   └── 
          ├── .env
          └── .env.example
      
      6 - điều này giúp đơn giản hóa rất nhiều việc thiết lập toàn bộ người dùng
    • từ giờ trở đi, chúng tôi sẽ sử dụng
      .
      └── .docker/
          ├── docker-compose/
          |   ├── docker-compose.yml
          |   └── 
          ├── images/
          |   ├── nginx/
          |   |   ├── Dockerfile
          |   |   └── 
          |   └── 
          ├── .env
          └── .env.example
      
      5 làm tên người dùng (
      .
      └── .docker/
          ├── docker-compose/
          |   ├── docker-compose.yml
          |   └── 
          ├── images/
          |   ├── nginx/
          |   |   ├── Dockerfile
          |   |   └── 
          |   └── 
          ├── .env
          └── .env.example
      
      8) và
      .
      └── .docker/
          ├── docker-compose/
          |   ├── docker-compose.yml
          |   └── 
          ├── images/
          |   ├── nginx/
          |   |   ├── Dockerfile
          |   |   └── 
          |   └── 
          ├── .env
          └── .env.example
      
      9 id người dùng (
      curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
      30; theo thông lệ tốt nhất để không sử dụng UID dưới 10.000)
  • Sửa đổi tập tin cấu hình
    • chỉ cần sử dụng
      curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
      31 - không cần tập lệnh chuyên dụng
  • Cài đặt tiện ích mở rộng php
    • xem hình ảnh PHP - bây giờ sẽ được thực hiện thông qua
      curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
      32
  • Cài đặt phần mềm thông dụng
    • xem hình ảnh PHP - vì chỉ có một hình ảnh cơ sở nên không cần tập lệnh chuyên dụng
  • Dọn dẹp
    • không thực sự có ý nghĩa vì "các tệp đã dọn sạch" đã là một phần của lớp trước đó
    • chúng tôi có thể "mang nó trở lại" sau khi chúng tôi tối ưu hóa kích thước hình ảnh để tăng tốc độ đẩy/kéo hình ảnh đến/từ sổ đăng ký
  • Cung cấp máy chủ. người đóng tàu. nội bộ cho hệ thống máy chủ linux
    • bây giờ có thể được thực hiện thông qua tham chiếu phép thuật ________ 133 _______ 134
    • do đó, không cần điểm vào tùy chỉnh nữa

Thiết lập docker cục bộ

Mục tiêu của phần này là giới thiệu một thiết lập cục bộ đang hoạt động mà không cần các công cụ phát triển. Nói cách khác. Chúng tôi muốn mức tối thiểu để có thứ gì đó chạy cục bộ

Các thành phần chính là

  • thiết lập
    curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
    35 trong thư mục
    curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
    36 và trong thư mục
    curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
    37
  • thiết lập docker trong thư mục
    curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
    38
  • một số tệp PHP hoạt động như một POC cho chức năng end2end của thiết lập docker

Kiểm tra mã thông qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
2

khởi tạo nó thông qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
3

và chạy nó qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
4

Bây giờ bạn có thể truy cập giao diện web qua http. //127. 0. 0. 1. Sơ đồ sau đây cho thấy cách các thùng chứa được kết nối

Làm cách nào để cài đặt PHP 8 trong Docker?

Xem thêm PHP POC để kiểm tra đầy đủ thiết lập

docker

Thiết lập docker bao gồm

  • một thùng chứa nginx làm máy chủ web
  • một thùng chứa cơ sở dữ liệu MySQL
  • một thùng chứa Redis hoạt động như một hàng đợi
  • một hình ảnh cơ sở php được sử dụng bởi
    • một bộ chứa công nhân php sinh ra nhiều quy trình công nhân PHP thông qua
      curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
      39
    • bộ chứa php-fpm làm phụ trợ cho bộ chứa nginx
    • một bộ chứa ứng dụng mà chúng tôi sử dụng để chạy các lệnh

Làm cách nào để cài đặt PHP 8 trong Docker?

Chúng tôi giữ thư mục

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
38 từ hướng dẫn trước, mặc dù nó sẽ được chia thành
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
71 và
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
72 như vậy

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example

curl -fsSL https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh73

Tất cả các hình ảnh được xây dựng thông qua ________ 273 vì các tệp ________ 275) cung cấp một lớp trừu tượng đẹp mắt cho cấu hình bản dựng. Ngoài ra, chúng ta cũng có thể sử dụng nó để sắp xếp các container, i. e. khối lượng điều khiển, ánh xạ cổng, kết nối mạng, v.v. - cũng như bắt đầu và dừng chúng thông qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
76 và
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
77

FYI. Mặc dù việc sử dụng

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
73 cho cả hai thứ đều thuận tiện, nhưng tôi thấy nó cũng làm cho việc thiết lập trở nên phức tạp hơn mức cần thiết khi chạy mọi thứ sau này trong quá trình sản xuất (khi chúng tôi không còn sử dụng
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
73 nữa). Tôi tin rằng vấn đề ở đây là một số sửa đổi CHỈ được yêu cầu để xây dựng trong khi những sửa đổi khác CHỈ được yêu cầu để chạy - và việc kết hợp cả hai trong cùng một tệp sẽ tạo ra một lượng nhiễu nhất định. Nhưng mà. Đó là những gì nó được

Chúng tôi sử dụng ba tệp

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
75 riêng biệt

  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    75
    • chứa tất cả thông tin hợp lệ cho tất cả các môi trường
  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
    92
    • chứa thông tin dành riêng cho môi trường
      curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
      93, xem Môi trường và xây dựng mục tiêu
  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
    94
    • chứa thông tin để xây dựng hình ảnh cơ sở php, xem hình ảnh PHP

Tệp
.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
2 và các biến ENV bắt buộc

Trong thiết lập docker của chúng tôi, về cơ bản chúng tôi có 3 loại biến khác nhau

  1. các biến phụ thuộc vào thiết lập cục bộ của một nhà phát triển riêng lẻ, e. g.
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
    96 trên máy chủ (vì cái mặc định có thể đã được sử dụng)
  2. các biến được sử dụng trong nhiều hình ảnh, e. g. vị trí của cơ sở mã trong hệ thống tệp của vùng chứa
  3. các biến chứa thông tin "có khả năng thay đổi", e. g. phiên bản chính xác của một hình ảnh cơ sở

Vì - một lần nữa - chúng tôi cố gắng giữ lại một nguồn sự thật duy nhất, chúng tôi trích xuất thông tin dưới dạng các biến và đưa chúng vào tệp

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
2. Trong một thế giới hoàn hảo, tôi muốn tách các loại khác nhau này thành các tệp khác nhau - nhưng
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
73 chỉ cho phép một tệp
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
99 duy nhất, xem e. g. bình luận này. Nếu tệp không tồn tại, nó được sao chép từ
curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
70

Các biến sau đó được sử dụng trong (các) tệp

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
75. Tôi thấy "ít đau đớn nhất" khi luôn sử dụng công cụ sửa đổi
curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
72 trên các biến để
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
73 thất bại ngay lập tức nếu biến bị thiếu

Ghi chú. Một số biến dự kiến ​​sẽ được chuyển qua các biến môi trường khi

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
73 được gọi (i. e. chúng được yêu cầu nhưng không được xác định trong tệp
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
99; .
.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
4

Hình ảnh

Đối với MySQL và redis, chúng tôi không sử dụng hình ảnh được tạo tùy chỉnh mà thay vào đó sử dụng trực tiếp hình ảnh chính thức và định cấu hình chúng thông qua các biến môi trường khi khởi động vùng chứa. Trong quá trình sản xuất, chúng tôi sẽ không sử dụng docker cho các dịch vụ này mà thay vào đó dựa vào các phiên bản được quản lý, e. g

  • redis => Memorystore cho Redis (GCP) hoặc ElastiCache cho Redis (AWS)
  • mysql => Cloud SQL cho MySQL (GCP) hoặc RDS cho MySQL (AWS)

Các thùng chứa còn lại được định nghĩa trong các thư mục con tương ứng của chúng trong thư mục

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
77, e. g. hình ảnh cho vùng chứa ________ 478 được tạo thông qua ________ 479 nằm trong
.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
70

hình ảnh PHP

Chúng tôi cần 3 hình ảnh PHP khác nhau (fpm, công nhân, ứng dụng) và sử dụng cách tiếp cận hơi khác so với trong Cấu trúc thiết lập Docker cho Dự án PHP

Thay vì sử dụng các hình ảnh cơ sở PHP chính thức (i. e. cli hoặc fpm), chúng tôi sử dụng hình ảnh cơ sở núi cao "đơn giản" và cài đặt PHP và các tiện ích mở rộng cần thiết theo cách thủ công trong đó. Điều này cho phép chúng tôi xây dựng một hình ảnh cơ sở chung cho tất cả các hình ảnh PHP. Những lợi ích

  • một vị trí trung tâm cho các công cụ và cấu hình được chia sẻ (không cần thư mục
    .
    └── .docker/
        ├── docker-compose/
        |   ├── docker-compose.yml
        |   └── 
        ├── images/
        |   ├── nginx/
        |   |   ├── Dockerfile
        |   |   └── 
        |   └── 
        ├── .env
        └── .env.example
    
    71 nữa)
  • giảm kích thước hình ảnh khi đẩy các hình ảnh riêng lẻ (hình ảnh cơ sở được nhận dạng là một lớp và do đó "đã tồn tại")
  • cài đặt tiện ích mở rộng qua
    curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
    32 nhanh hơn rất nhiều so với qua
    .
    └── .docker/
        ├── docker-compose/
        |   ├── docker-compose.yml
        |   └── 
        ├── images/
        |   ├── nginx/
        |   |   ├── Dockerfile
        |   |   └── 
        |   └── 
        ├── .env
        └── .env.example
    
    73

Cách tiếp cận mới này có hai nhược điểm lớn

  • chúng tôi phụ thuộc vào chu kỳ phát hành của PHP (và các phần mở rộng PHP)
  • quá trình xây dựng hình ảnh phức tạp hơn, bởi vì chúng ta phải xây dựng hình ảnh cơ sở trước khi có thể xây dựng hình ảnh cuối cùng

May mắn thay, cả hai vấn đề đều có thể được giải quyết khá dễ dàng

  • codecasts/php-alpine duy trì một kho lưu trữ
    .
    └── .docker/
        ├── docker-compose/
        |   ├── docker-compose.yml
        |   └── 
        ├── images/
        |   ├── nginx/
        |   |   ├── Dockerfile
        |   |   └── 
        |   └── 
        ├── .env
        └── .env.example
    
    74 với các phiên bản PHP mới nhất cho alpine
  • chúng tôi sử dụng mục tiêu
    curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
    35 chuyên dụng để xây dựng hình ảnh thay vì gọi trực tiếp
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    73 - điều này cho phép chúng tôi xác định "thứ tự xây dựng" (cơ sở trước, phần còn lại sau) trong khi vẫn chỉ phải chạy một lệnh duy nhất với tư cách là nhà phát triển (xem Đảm bảo việc xây dựng

ENV so với ARG

Tôi đã nhận thấy rằng một số đối số xây dựng được yêu cầu trong nhiều vùng chứa PHP, e. g. tên của người dùng ứng dụng được xác định trong biến ENV

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
8. Tên người dùng là cần thiết

  • trong hình ảnh cơ sở để tạo người dùng
  • trong ảnh fpm để xác định người dùng chạy các quy trình fpm (xem
    .
    └── .docker/
        ├── docker-compose/
        |   ├── docker-compose.yml
        |   └── 
        ├── images/
        |   ├── nginx/
        |   |   ├── Dockerfile
        |   |   └── 
        |   └── 
        ├── .env
        └── .env.example
    
    78)
  • trong hình ảnh công nhân để xác định người dùng chạy các quy trình công nhân ( xem
    .
    └── .docker/
        ├── docker-compose/
        |   ├── docker-compose.yml
        |   └── 
        ├── images/
        |   ├── nginx/
        |   |   ├── Dockerfile
        |   |   └── 
        |   └── 
        ├── .env
        └── .env.example
    
    79)

Thay vì chuyển tên cho tất cả các hình ảnh thông qua đối số xây dựng, tôi. e

  • xác định nó một cách rõ ràng dưới
    .
    └── .docker/
        ├── docker-compose/
        |   ├── docker-compose.yml
        |   └── 
        ├── images/
        |   ├── nginx/
        |   |   ├── Dockerfile
        |   |   └── 
        |   └── 
        ├── .env
        └── .env.example
    
    70 trong tệp
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    75
  • "truy xuất" nó trong Dockerfile qua
    .
    └── .docker/
        ├── docker-compose/
        |   ├── docker-compose.yml
        |   └── 
        ├── images/
        |   ├── nginx/
        |   |   ├── Dockerfile
        |   |   └── 
        |   └── 
        ├── .env
        └── .env.example
    
    72

Tôi đã chọn cung cấp tên người dùng dưới dạng biến

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
73 trong hình ảnh cơ sở thông qua

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
3

và do đó có thể truy cập nó trực tiếp trong các hình ảnh con, bây giờ tôi có thể viết

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
7

thay vì

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
9

Tôi không chắc chắn 100% rằng tôi thích cách tiếp cận này vì tôi ít nhiều "lạm dụng" các biến ENV theo cách mà chúng có thể không được dự định ("Tại sao tên người dùng cần được lưu trữ dưới dạng biến ENV?") -

Quy ước đặt tên hình ảnh

Xác định tên đủ điều kiện cho hình ảnh sẽ giúp việc tham khảo hình ảnh sau này dễ dàng hơn nhiều, e. g. khi đẩy chúng vào sổ đăng ký

Quy ước đặt tên cho hình ảnh là

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
74, e. g

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
7

và nó được dùng làm giá trị cho

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
75, e. g. cho
curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
78

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
7

Trong trường hợp bạn đang tự hỏi.

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
77 bắt nguồn từ Docker From Scratch

Môi trường và xây dựng mục tiêu

Mục tiêu cuối cùng của chúng tôi là một thiết lập mà chúng tôi có thể sử dụng cho

  • phát triển địa phương
  • trong đường dẫn CI/CD
  • trong sản xuất

và mặc dù chúng tôi cố gắng đạt được sự bình đẳng giữa các môi trường khác nhau đó, nhưng sẽ có sự khác biệt do các yêu cầu cơ bản khác nhau. e. g

  • khi sản xuất, tôi muốn có một vùng chứa bao gồm mã nguồn mà không có bất kỳ phụ thuộc thử nghiệm nào
  • trên CI Tôi muốn một vùng chứa bao gồm mã nguồn VỚI các phụ thuộc kiểm tra
  • trên cục bộ, tôi muốn một vùng chứa gắn mã nguồn từ Máy chủ của tôi (bao gồm cả các phần phụ thuộc)

Điều này được phản ánh thông qua biến môi trường

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
73. Chúng tôi sử dụng nó ở hai nơi

  1. như một phần của tên hình ảnh dưới dạng hậu tố của tên dịch vụ (xem Quy ước đặt tên hình ảnh)
  2. để chỉ định giai đoạn xây dựng mục tiêu

Xem tệp

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
94 chẳng hạn

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
7

Sử dụng nhiều mục tiêu trong cùng một Dockerfile cho phép chúng tôi giữ một cơ sở chung nhưng cũng bao gồm các hướng dẫn cụ thể về môi trường. Xem Dockerfile của hình ảnh

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
300 chẳng hạn

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
30
  • đầu tiên nó xác định giai đoạn
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    301 bao gồm phần mềm cần thiết trong mọi môi trường
  • và sau đó xác định một giai đoạn
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
    93 bổ sung thêm một
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    303 giúp chúng tôi gỡ lỗi các sự cố kết nối

Sau khi quá trình xây dựng cho

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
93 kết thúc, chúng tôi kết thúc với một hình ảnh có tên là
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
305 đã sử dụng giai đoạn xây dựng
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
93 làm giai đoạn xây dựng mục tiêu

Makefile

Trong phần sau tôi sẽ giới thiệu một vài lệnh, e. g. để xây dựng và vận hành container. Và thành thật mà nói, tôi thấy hơi khó để ghi nhớ chúng mà không cần phải tìm kiếm các lựa chọn và lập luận chính xác. Tôi thường tạo một hàm trợ giúp hoặc bí danh trong tệp

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
307 cục bộ của mình trong tình huống như vậy - nhưng điều đó sẽ không có sẵn cho các thành viên khác trong nhóm khi đó và nó sẽ rất cụ thể đối với dự án này

Thay vào đó, chúng tôi sẽ sử dụng Makefile tự tạo tài liệu đóng vai trò là điểm vào trung tâm trong ứng dụng. Vì Makefiles có xu hướng phát triển theo thời gian, nên tôi đã áp dụng một số chiến lược để giữ cho chúng "lành mạnh" thông qua các biến bao gồm, chia sẻ và xử lý lỗi tốt hơn

. └── .docker/ ├── docker-compose/ | ├── docker-compose.yml | └── ├── images/ | ├── nginx/ | | ├── Dockerfile | | └── | └── ├── .env └── .env.example 3 bao gồm

Theo thời gian, thiết lập

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
35 sẽ phát triển đáng kể, do đó chúng tôi chia nó thành nhiều tệp
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
310 trong thư mục
curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
37. Các tệp riêng lẻ được đánh số trước để đảm bảo thứ tự của chúng khi chúng tôi đưa chúng vào
curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
36 chính thông qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
31
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
32

biến được chia sẻ. . └── .docker/ ├── docker-compose/ | ├── docker-compose.yml | └── ├── images/ | ├── nginx/ | | ├── Dockerfile | | └── | └── ├── .env └── .env.example 4

Chúng tôi cố gắng cung cấp các biến dùng chung ở đây, vì sau đó chúng tôi có thể chuyển chúng vào các lệnh riêng lẻ dưới dạng tiền tố, e. g

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
33

Điều này sẽ làm cho

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
314 có sẵn dưới dạng biến môi trường thành
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
315

Các biến được chia sẻ được sử dụng bởi các thành phần khác nhau và chúng tôi luôn cố gắng chỉ duy trì một nguồn sự thật duy nhất. Một ví dụ sẽ là biến

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
316 mà chúng ta cần xác định tên hình ảnh của hình ảnh docker trong tệp
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
75 cũng như khi đẩy/kéo/triển khai hình ảnh thông qua tạo mục tiêu sau này. Trong trường hợp này, biến được yêu cầu bởi
curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
35 cũng như
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
73 và cách thiết lập được giải thích trong phần Make + Docker = <3

Để có sự tách biệt rõ ràng giữa các biến và "mã", chúng tôi sử dụng tệp

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
99 có tại
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
321. Nó có thể được khởi tạo thông qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
34

bằng cách sao chép

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
322 sang
.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
4

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
35

Tệp được bao gồm trong

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
36 chính thông qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
36

Tiền tố

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
325 đảm bảo rằng make không bị lỗi nếu tệp không tồn tại (chưa), xem GNU make. Bao gồm Makefiles khác

Ghi chú

Trong phần sau của hướng dẫn này, chúng tôi sẽ giới thiệu một tệp bổ sung chứa các biến


  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    326

sửa đổi thủ công

Bạn luôn có thể sửa đổi tệp

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
4 theo cách thủ công nếu cần. Đây có thể là trường hợp khi bạn chạy
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
328 trên Linux và cần khớp
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
329 của hệ thống máy chủ của bạn với
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
329 của bộ chứa docker. Thông thường người dùng cục bộ và nhóm của bạn có id
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
331. Trong trường hợp này, bạn sẽ thêm các mục theo cách thủ công vào tệp
.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
4

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
37

Xem thêm phần Giải quyết các vấn đề về quyền

Thực thi các tham số bắt buộc

Chúng tôi hơi "lạm dụng" để thực thi các lệnh tùy ý (thay vì xây dựng các tạo phẩm) và một số lệnh đó yêu cầu các tham số có thể được chuyển dưới dạng đối số lệnh trong biểu mẫu

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
38

Không có cách nào để "xác định" các tham số đó như chúng ta làm trong chữ ký phương thức - nhưng chúng ta vẫn có thể đảm bảo không thành công càng sớm càng tốt nếu thiếu tham số thông qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
39

Xem thêm. Làm cách nào để hủy bỏ makefile nếu biến không được đặt?

Ví dụ, chúng tôi sử dụng kỹ thuật này để đảm bảo rằng tất cả các biến bắt buộc được xác định khi chúng tôi thực thi các mục tiêu docker thông qua mục tiêu điều kiện tiên quyết

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
333

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
40

Tạo + Docker =

Chúng tôi đã giới thiệu khá phức tạp vào thiết lập của mình

  • biến "toàn cầu" (được chia sẻ giữa
    curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
    35 và
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    328)
  • nhiều tệp
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    75
  • xây dựng phụ thuộc

Mang tất cả lại với nhau "thủ công" là một nỗ lực khá lớn và dễ bị lỗi. Nhưng chúng ta có thể loại bỏ sự phức tạp một cách độc đáo trong

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
337 bằng cách xác định hai biến
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
338 và
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
339

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
41
  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    338 sử dụng
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    75 và mở rộng nó với
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
    92
  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    339 chỉ sử dụng
    curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/fix-docker-permissions.sh | sh
    94

Các biến sau đó có thể được sử dụng sau này trong công thức nấu ăn

Đảm bảo trình tự thi công

Như đã đề cập trong phần hình ảnh PHP, chúng ta cần xây dựng hình ảnh theo một thứ tự nhất định và sử dụng các mục tiêu tạo sau đây

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
42

Với tư cách là nhà phát triển, giờ đây tôi có thể chỉ cần chạy

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
345 - trước tiên sẽ xây dựng hình ảnh
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
300 qua
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
347, sau đó xây dựng tất cả các hình ảnh còn lại thông qua
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
348 (bằng cách không chỉ định biến
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
349,
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
73 sẽ xây dựng tất cả các dịch vụ được liệt kê trong tệp
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
75)

Tôi cho rằng bản thân các công thức chế tạo khá dễ đọc và dễ hiểu nhưng khi chúng tôi chạy chúng với tùy chọn

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
352 để chỉ "In công thức sẽ được thực hiện, nhưng không thực hiện nó", chúng tôi có cảm giác về sự phức tạp

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
43

Chạy các lệnh trong docker container

Công cụ là một phần quan trọng trong quy trình phát triển. Điều này bao gồm những thứ như xơ vải, máy phân tích tĩnh và công cụ kiểm tra nhưng cũng có các công cụ "tùy chỉnh" hướng đến quy trình làm việc cụ thể của bạn. Những công cụ đó thường yêu cầu thời gian chạy PHP. Hiện tại, chúng tôi chỉ có một "công cụ" duy nhất được xác định trong tệp

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
353. Nó đảm bảo rằng một bảng có tên là
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
354 được tạo

Để chạy công cụ này, trước tiên chúng ta phải bắt đầu thiết lập docker qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
355 và sau đó thực thi tập lệnh trong bộ chứa
.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
5. Mục tiêu tương ứng được xác định trong
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
357

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
44

về cơ bản dịch sang

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
45

nếu chúng ta ở bên ngoài một container và để

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
46

nếu chúng ta ở trong một container. Điều đó khá tiện lợi, vì chúng tôi có thể chạy công cụ trực tiếp từ hệ thống máy chủ mà không cần phải đăng nhập vào vùng chứa

"Điều kỳ diệu" xảy ra trong biến

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
358 được định nghĩa trong
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
337 là

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
47

Chúng ta có thể xem lại qua

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
352 để xem công thức đã giải quyết trên hệ thống máy chủ

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
48

Trong một thùng chứa nó trông như thế này

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
49

Giải quyết các vấn đề về quyền

Nếu đang sử dụng Linux, bạn có thể gặp phải các vấn đề về quyền khi sửa đổi các tệp được chia sẻ giữa hệ thống máy chủ và bộ chứa docker khi id người dùng không giống như được giải thích trong phần Đồng bộ hóa quyền sở hữu tệp và thư mục trên ổ đĩa được chia sẻ của hướng dẫn trước

Trong trường hợp này, bạn cần sửa đổi thủ công

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
4 và thêm các biến
curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
30 và
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
363 theo thiết lập cục bộ của bạn. Điều này phải được thực hiện trước khi xây dựng hình ảnh để đảm bảo rằng
curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
329 chính xác được sử dụng trong hình ảnh

Trong những trường hợp rất hiếm, nó có thể dẫn đến sự cố, vì id cục bộ của bạn đã tồn tại trong bộ chứa docker. Cá nhân tôi chưa bao giờ gặp phải vấn đề này, nhưng bạn có thể đọc chi tiết hơn về vấn đề này tại Docker và vấn đề khớp với chủ sở hữu hệ thống tệp máy chủ. Tác giả thậm chí còn đề xuất một giải pháp chung thông qua dự án Github "FooBarWidget/matchhostfsowner"

POC PHP

Để đảm bảo rằng mọi thứ hoạt động như mong đợi, kho lưu trữ chứa bằng chứng khái niệm PHP tối thiểu. Theo mặc định, cổng 80 từ máy chủ được chuyển tiếp đến cổng 80 của bộ chứa

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
78

FYI. Tôi cũng khuyên bạn nên thêm mục sau vào tệp máy chủ trên máy chủ

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
0

để chúng tôi có thể truy cập ứng dụng qua http. //ứng dụng. địa phương thay vì http. //127. 0. 0. 1

Các tệp của POC về cơ bản đảm bảo rằng các kết nối bộ chứa được nêu trong Thiết lập docker cục bộ hoạt động như mong đợi

  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    366
    • trả về các đối tượng
      curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
      367 và
      curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
      368 đã được định cấu hình để giao tiếp với hàng đợi và cơ sở dữ liệu
  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    353
    • => đảm bảo rằng
      .
      └── .docker/
          ├── docker-compose/
          |   ├── docker-compose.yml
          |   └── 
          ├── images/
          |   ├── nginx/
          |   |   ├── Dockerfile
          |   |   └── 
          |   └── 
          ├── .env
          └── .env.example
      
      5 có thể nói chuyện với
      curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
      371
  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    372
    • là tệp gốc của web có thể được truy cập qua http. //ứng dụng. địa phương
      • => đảm bảo rằng
        curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
        78 và
        curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
        374 đang hoạt động
    • chứa 3 "tuyến đường" khác nhau
      • http. //ứng dụng. local?dispatch=some-job-id
        • gửi một "công việc" mới với id
          curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
          375 trên hàng đợi để một công nhân nhận
          • => đảm bảo rằng
            curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
            374 có thể nói chuyện với
            curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
            377
      • http. //ứng dụng. địa phương?hàng đợi
        • hiển thị nội dung của hàng đợi
      • http. //ứng dụng. cục bộ?db
        • hiển thị nội dung của cơ sở dữ liệu
          • => đảm bảo rằng
            curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
            374 có thể nói chuyện với
            curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
            371
  • curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
    380
    • được bắt đầu dưới dạng quy trình daemon trong vùng chứa
      curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
      381
    • kiểm tra cơ sở dữ liệu redis ________ 2382 để tìm khóa ________ 2383 mỗi giây
    • nếu một giá trị được tìm thấy, nó sẽ được lưu trữ trong bảng
      curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
      354 của cơ sở dữ liệu
      • => đảm bảo rằng
        curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
        381 có thể nói chuyện với
        curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
        377 và
        curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
        371

Một kịch bản thử nghiệm đầy đủ được xác định trong

curl -fsSL  https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/docker.sh | sh
388 và giống như thế này

.
└── .docker/
    ├── docker-compose/
    |   ├── docker-compose.yml
    |   └── 
    ├── images/
    |   ├── nginx/
    |   |   ├── Dockerfile
    |   |   └── 
    |   └── 
    ├── .env
    └── .env.example
1

kết thúc

Xin chúc mừng, bạn đã làm được. Nếu bây giờ một số điều không hoàn toàn rõ ràng, đừng ngần ngại để lại nhận xét. Ngoài ra, bây giờ bạn sẽ có một thiết lập docker đang chạy và phương tiện để "điều khiển" nó một cách thuận tiện thông qua

curl https://gist.githubusercontent.com/Shelob9/f981e8fee4e80aec383442df7838de7e/raw/b4359b698c6be584d259dac68ae348d4e6e9bf8a/nvm16.sh -fsSL  | sh
35

Trong phần tiếp theo của hướng dẫn này, chúng tôi sẽ định cấu hình PhpStorm làm IDE của chúng tôi để sử dụng thiết lập docker

Vui lòng đăng ký nguồn cấp RSS hoặc qua email để nhận thông báo tự động khi phần tiếp theo này ra mắt. )


Muốn giữ liên lạc?

Vì bạn đã kết thúc blog này, nên khả năng cao là bạn sẽ tham gia Phát triển phần mềm (có thể là PHP, Laravel, Docker hoặc Google Big Query) và tôi là một người rất thích phản hồi và kết nối mạng

Vì vậy - nếu bạn muốn giữ liên lạc, vui lòng gửi email cho tôi với đôi lời về bản thân và/hoặc kết nối với tôi trên LinkedIn hoặc Twitter hoặc chỉ cần đăng ký nguồn cấp dữ liệu RSS của tôi hoặc đi theo con đường điên rồ và đăng ký . )

Theo dõi bài viết qua mail

Địa chỉ email

Họ

Chúng tôi sử dụng Mailchimp làm nhà cung cấp bản tin của mình. Bằng cách nhấp vào đăng ký, bạn xác nhận rằng thông tin của bạn sẽ được chuyển đến Mailchimp để xử lý. Tìm hiểu thêm về thực tiễn bảo mật của Mailchimp tại đây

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

Làm cách nào để cài đặt các tiện ích mở rộng PHP trong Docker?

Dễ dàng cài đặt tiện ích mở rộng PHP trong hình ảnh PHP Docker chính thức .
Tải xuống tập lệnh một cách nhanh chóng. Với Dockerfile. .
Sao chép tập lệnh từ hình ảnh Docker. .
Cài đặt các phiên bản cụ thể của tiện ích mở rộng. .
Cài đặt từ mã nguồn. .
cài đặt trình soạn nhạc. .
Sự cố với chứng chỉ Let's Encrypt

Làm cách nào để triển khai PHP trên Docker?

Bước 1. Cấu hình môi trường làm việc. Một ứng dụng dựa trên docker cơ bản bao gồm nhiều vùng chứa. .
Bước 2. Định cấu hình bộ chứa PHP. .
Bước 3. Thực thi các lệnh bên trong vùng chứa. .
Bước 4. Định cấu hình bộ chứa Nginx. .
Bước 5. Cấu hình vùng chứa MySQL. .
Bước 6. Xây dựng ứng dụng PHP

Docker có cần PHP không?

Bạn thậm chí không cần cài đặt PHP hay NGINX trên chính máy chủ . Chúng sẽ được Docker tự động cài đặt khi bạn khởi chạy ứng dụng. Bạn có thể chạy cùng một hình ảnh trên máy phát triển của mình.