S3 của Amazon là một giải pháp tuyệt vời để lưu trữ tệp và Laravel làm cho nó dễ sử dụng. Đôi khi, bạn sẽ cần buộc các tệp tải xuống thay vì chỉ hiển thị tệp đó trong trình duyệt, nhưng rất may điều này cũng dễ dàng. Thay vì lãng phí tài nguyên máy chủ của bạn để truyền phát tệp từ S3 tới người dùng của bạn, chúng tôi sẽ sử dụng các URL đã ký
Các URL đã ký có thể cấp cho người dùng quyền truy cập tạm thời vào một tệp cụ thể trong vùng lưu trữ riêng tư của bạn, vì vậy, chúng tôi chỉ cần chuyển hướng đến đó và yêu cầu S3 đặt tiêu đề bổ sung. Trong bộ điều khiển của bạn chịu trách nhiệm tải xuống các tệp, bạn chỉ cần trả lại phản hồi như bên dưới
return redirect[Storage::disk['s3']->temporaryUrl[
$file->path,
now[]->hour[],
['ResponseContentDisposition' => 'attachment']
]];
Trong ví dụ này, $file->path
là đường dẫn tệp của tôi trong bộ chứa S3 của tôi và now[]->addHour[]
đang tạo dấu thời gian Carbon một giờ trong tương lai khi URL đã ký của chúng tôi sẽ hết hạn. Phần quan trọng là tùy chọn ['ResponseContentDisposition' => 'attachment']
cho S3 biết người dùng của chúng tôi muốn tải xuống tệp thay vì hiển thị tệp trong trình duyệt
Trong chương này, chúng tôi sẽ triển khai khả năng tải xuống và tải lên các tệp trong ứng dụng. Ngoài ra, chúng tôi sẽ thảo luận về một số khía cạnh khi làm việc với các tệp trong Kubernetes và cung cấp một ví dụ thực tế về việc sử dụng bộ lưu trữ tương thích với S3
Ứng dụng được mô tả trong chương này không nhằm mục đích sử dụng trong môi trường sản xuất nguyên trạng. Lưu ý rằng cần hoàn thành thành công toàn bộ hướng dẫn này để tạo ứng dụng sẵn sàng sản xuất
Chuẩn bị môi trường
Nếu bạn chưa chuẩn bị môi trường của mình trong các bước trước, vui lòng thực hiện theo hướng dẫn được cung cấp trong chương “Chuẩn bị môi trường”
Nếu môi trường của bạn ngừng hoạt động hoặc các hướng dẫn trong chương này không hoạt động, vui lòng tham khảo các gợi ý này
Docker có đang chạy không?
Hệ điều hành Linux MacOS Windows
Hãy khởi chạy Docker Desktop. Phải mất một thời gian để ứng dụng này khởi động Docker. Nếu không có lỗi trong quá trình khởi động, hãy kiểm tra xem Docker có đang chạy và được cấu hình đúng không
docker run hello-world
Bạn sẽ thấy đầu ra sau nếu lệnh hoàn thành thành công
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
Nếu bạn gặp bất kỳ vấn đề nào, vui lòng tham khảo tài liệu về Docker
Hãy khởi chạy ứng dụng Docker Desktop. Phải mất một thời gian để ứng dụng khởi động Docker. Nếu không có lỗi trong quá trình khởi động, thì hãy kiểm tra xem Docker có đang chạy và được cấu hình đúng không
docker run hello-world
Bạn sẽ thấy đầu ra sau nếu lệnh hoàn thành thành công
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
Nếu bạn gặp bất kỳ vấn đề nào, vui lòng tham khảo tài liệu về Docker
Bắt đầu docker
sudo systemctl restart docker
Đảm bảo rằng Docker đang chạy
sudo systemctl status docker
Nếu khởi động Docker thành công, bạn sẽ thấy đầu ra sau
● docker.service - Docker Application Container Engine
Loaded: loaded [/lib/systemd/system/docker.service; enabled; vendor preset: enabled]
Active: active [running] since Thu 2021-06-24 13:05:17 MSK; 13s ago
TriggeredBy: ● docker.socket
Docs: //docs.docker.com
Main PID: 2013888 [dockerd]
Tasks: 36
Memory: 100.3M
CGroup: /system.slice/docker.service
└─2013888 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
dockerd[2013888]: time="2021-06-24T13:05:16.936197880+03:00" level=warning msg="Your kernel does not support CPU realtime scheduler"
dockerd[2013888]: time="2021-06-24T13:05:16.936219851+03:00" level=warning msg="Your kernel does not support cgroup blkio weight"
dockerd[2013888]: time="2021-06-24T13:05:16.936224976+03:00" level=warning msg="Your kernel does not support cgroup blkio weight_device"
dockerd[2013888]: time="2021-06-24T13:05:16.936311001+03:00" level=info msg="Loading containers: start."
dockerd[2013888]: time="2021-06-24T13:05:17.119938367+03:00" level=info msg="Loading containers: done."
dockerd[2013888]: time="2021-06-24T13:05:17.134054120+03:00" level=info msg="Daemon has completed initialization"
systemd[1]: Started Docker Application Container Engine.
dockerd[2013888]: time="2021-06-24T13:05:17.148493957+03:00" level=info msg="API listen on /run/docker.sock"
Bây giờ hãy kiểm tra xem Docker có sẵn không và cấu hình của nó đã chính xác chưa
docker run hello-world
Bạn sẽ thấy đầu ra sau nếu lệnh hoàn thành thành công
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
Nếu bạn có bất kỳ vấn đề, xin vui lòng tham khảo các
Bạn đã khởi động lại máy tính sau khi thiết lập môi trường chưa?
Hệ điều hành Linux / macOS
Hãy bắt đầu cụm minikube mà chúng ta đã cấu hình trong chương “Chuẩn bị môi trường”
minikube start
Đặt Không gian tên mặc định để bạn không phải chỉ định nó mỗi khi bạn gọi
sudo systemctl restart docker
6Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
0Bạn sẽ thấy đầu ra sau nếu lệnh hoàn thành thành công
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
1Đảm bảo rằng đầu ra lệnh chứa dòng sau
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
2Sự vắng mặt của nó có nghĩa là một cụm minikube mới đã được tạo thay vì sử dụng cụm cũ. Trong trường hợp này, hãy lặp lại tất cả các bước cần thiết để cài đặt môi trường sử dụng minikube
Bây giờ hãy chạy lệnh trong thiết bị đầu cuối PowerShell nền [không đóng cửa sổ của nó]
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
3Hãy bắt đầu cụm minikube mà chúng ta đã cấu hình trong chương “Chuẩn bị môi trường”
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
4Đặt Không gian tên mặc định để bạn không phải chỉ định nó mỗi khi bạn gọi
sudo systemctl restart docker
6Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
5Bạn sẽ thấy đầu ra sau nếu lệnh hoàn thành thành công
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
1Đảm bảo rằng đầu ra lệnh chứa dòng sau
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
2Sự vắng mặt của nó có nghĩa là một cụm minikube mới đã được tạo thay vì sử dụng cụm cũ. Trong trường hợp này, hãy lặp lại tất cả các bước cần thiết để cài đặt môi trường từ đầu bằng minikube
Bạn đã vô tình xóa Không gian tên của ứng dụng?
Nếu lỡ tay xóa Namespace của ứng dụng, bạn phải chạy lệnh sau để thực hiện theo hướng dẫn
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
8Bạn sẽ thấy đầu ra sau nếu lệnh hoàn thành thành công
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
9Không có gì giúp được;
Nếu không có gì hiệu quả, hãy lặp lại tất cả các bước được mô tả trong chương "Chuẩn bị môi trường" và tạo một môi trường mới từ đầu. Nếu việc tạo môi trường từ đầu cũng không giúp được gì, vui lòng cho chúng tôi biết về sự cố của bạn trong cuộc trò chuyện Telegram của chúng tôi hoặc tạo sự cố trên GitHub. Chúng tôi sẽ rất vui khi được giúp bạn
Chuẩn bị kho lưu trữ
Tôi đang làm theo hướng dẫn từ đầu Tôi mới bắt đầu từ chương này
Cập nhật kho lưu trữ hiện có chứa ứng dụng
Hệ điều hành Linux / macOS
Chạy các lệnh sau trong PowerShell
docker run hello-world
0Chúng tôi sẽ thực hiện những thay đổi nào
docker run hello-world
1Chạy các lệnh sau trong Bash
docker run hello-world
2Chúng tôi sẽ thực hiện những thay đổi nào
docker run hello-world
3Không hoạt động?
Chuẩn bị một kho lưu trữ mới với ứng dụng
Hệ điều hành Linux / macOS
Chạy các lệnh sau trong PowerShell
docker run hello-world
4Chúng tôi sẽ thực hiện những thay đổi nào
docker run hello-world
1Chạy các lệnh sau trong Bash
docker run hello-world
6Chúng tôi sẽ thực hiện những thay đổi nào
docker run hello-world
3Lưu trữ tệp
Các thùng chứa đang chạy trong Kubernetes thường được tạo và xóa tự động, e. g. , do các bản cập nhật Triển khai. Điều này có nghĩa là các tệp ứng dụng không thể được lưu trữ trên hệ thống tệp vùng chứa vì các tệp đó sẽ được
- có sẵn cho một bản sao vùng chứa/ứng dụng thay vì tất cả chúng;
- bị xóa khi container bị giết
Do đó, thật hợp lý khi chỉ lưu trữ trong các vùng chứa dữ liệu mà bạn có thể đủ khả năng để mất
Nhân tiện, bạn có thể đặt hệ thống tệp vùng chứa thành chỉ đọc. Điều này sẽ cải thiện bảo mật và ngăn ứng dụng lưu trữ dữ liệu cục bộ
Nhưng nếu bạn cần giữ một số dữ liệu thì sao? . Ví dụ: cơ sở dữ liệu NoSQL như kho lưu trữ đối tượng thường được sử dụng để lưu trữ các tệp thông thường. Cửa hàng đối tượng cung cấp API tương thích với Amazon S3 đặc biệt phổ biến
Dưới đây, chúng tôi sẽ chỉ cho bạn cách lưu trữ tệp trong bộ lưu trữ tương thích với S3 thay vì hệ thống tệp cục bộ. Bằng cách này, ứng dụng của bạn có thể duy trì trạng thái không trạng thái và tránh được một số sự cố khi làm việc trong Kubernetes
cài đặt phụ thuộc
Hãy cài đặt phần phụ thuộc còn thiếu bằng cách sử dụng vùng chứa
sudo systemctl restart docker
8docker run hello-world
8Chúng tôi đã chuyển bố cục hệ thống tệp Laravel từ kho lưu trữ chính thức. Những thay đổi sau đây đã được thực hiện cho ứng dụng của chúng tôi
- Tạo cấu hình/hệ thống tập tin. tập tin cấu hình php
Thêm các điểm cuối sudo systemctl restart docker
9 và sudo systemctl status docker
0 vào ứng dụng
sudo systemctl restart docker
sudo systemctl status docker
Hãy thêm hai điểm cuối mới,
sudo systemctl restart docker
9 [để tải tệp lên bộ lưu trữ đối tượng tương thích với S3] và sudo systemctl status docker
0 [để tải xuống tệp từ bộ lưu trữ đối tượng tương thích với S3], để xem cách tải lên và tải xuống hoạt độngHãy thêm một bộ điều khiển mới
ứng dụng/Http/Bộ điều khiển/S3FileController. php Sao chép tên tệp Sao chép văn bản
docker run hello-world
9