Raspberry Pi lý tưởng để cài đặt tất cả các loại chương trình luôn phải chạy. Cách đáng tin cậy nhất để làm điều đó là với Docker: theo cách này, mỗi chương trình chạy biệt lập trong một vùng chứa, vì vậy chúng không thể can thiệp vào nhau. Chúng tôi sẽ hướng dẫn bạn cách sử dụng Docker trên Raspberry Pi và những điều bạn nên chú ý.
Nếu bạn đã sử dụng Raspberry Pi một thời gian, rất có thể bạn sẽ tiếp tục cài đặt ngày càng nhiều phần mềm trên đó. Home Assistant, Zwave2Mqtt, Node-RED, Rhasspy… Mọi việc đều diễn ra tốt đẹp, cho đến khi bạn cập nhật tất cả phần mềm của mình lên phiên bản mới và đột nhiên một trong các chương trình của bạn ngừng hoạt động và đưa ra thông báo lỗi mơ hồ.
Chuyện gì đã xảy ra thế? Một kịch bản phổ biến là như sau. Phần mềm A và B đều sử dụng phiên bản 1.0 của thư viện C. Trong khi đó, phiên bản 2.0 của thư viện C được phát hành, không tương thích với C 1.0. Phần mềm A đang được viết lại để sử dụng thư viện C 2.0, trong khi các nhà phát triển phần mềm B không nhanh như vậy và sẽ gắn bó với thư viện C 1.0 trong một thời gian. Bạn cập nhật phần mềm A và cài đặt thư viện C 2.0. Nhưng Raspbian chỉ có thể cài đặt một phiên bản của thư viện. Kết quả là phần mềm B đột nhiên không hoạt động nữa, vì nó không tương thích với thư viện C 2.0.
Trên thực tế, các bản phân phối Linux làm mọi cách để tránh tình huống này, nhưng nó vẫn xảy ra. Đôi khi theo những cách tinh tế hơn nhiều, vì vậy không phải lúc nào cũng rõ ràng ngay lập tức điều gì gây ra vấn đề.
01 Docker là gì?
Docker giúp các nhà phát triển dễ dàng phân phối các ứng dụng để bạn có thể chạy chúng trên bất kỳ hệ thống Linux nào. Các ứng dụng này có thể được tìm thấy dưới dạng hình ảnh trên Docker Hub. Một hình ảnh như vậy về cơ bản là một khuôn mẫu cho một hệ thống Linux tối thiểu, mà bạn có thể chạy trên Raspbian dưới dạng một vùng chứa.
Mỗi container được cách ly hoàn toàn với các container khác. Vì vậy, ứng dụng trong một vùng chứa sẽ không nhìn thấy các ứng dụng trong các vùng chứa khác. Và việc cài đặt và cập nhật một vùng chứa đảm bảo rằng phiên bản mới không xung đột với các ứng dụng trong các vùng chứa khác. Vì vậy, nếu bạn muốn chạy nhiều hơn một số ứng dụng trên Raspberry Pi của mình, Docker sẽ giúp bạn thực hiện điều đó một cách đáng tin cậy. Nhờ Docker, bạn cũng có thể thử nghiệm một cách an toàn với phần mềm mới: bạn không thích nó, chỉ cần xóa vùng chứa sau đó.
02 Cài đặt Docker
Chúng tôi giả định rằng bạn đã cài đặt Raspbian, phiên bản Lite là đủ. Sau đó đăng nhập qua ssh để thực hiện các lệnh trong khóa học cơ bản này. Đầu tiên, cài đặt Docker bằng lệnh:
curl -sSL //get.docker.com | NS
Sau đó, cung cấp cho người dùng số Pi (mà bạn đã đăng nhập) quyền truy cập vào Docker, vì vậy bạn không chạy tất cả các lệnh Docker bằng lệnh sudo phải thực hiện:
Dodo usermod pi -aG docker
Đăng xuất bằng thoát và sau đó đăng nhập lại. Bây giờ người dùng thuộc về số Pi cho nhóm người đóng tàu.
03 Xin chào thế giới
Bây giờ bạn có thể khởi động một vùng chứa Docker đầu tiên:
docker run --rm hello-world
Lệnh này sẽ chạy vùng chứa Docker hello-world. Vùng chứa này hiển thị trong đầu ra những gì chính xác xảy ra: hình ảnh không được tìm thấy trên Raspberry Pi của bạn và sau đó được Docker tải xuống từ Docker Hub. Sau đó, Docker tạo một vùng chứa dựa trên hình ảnh này và chạy chương trình trong đó. Theo tùy chọn -rm thùng chứa được dọn dẹp sau khi đóng chương trình. Bây giờ bạn biết rằng Docker đã được cài đặt và hoạt động chính xác.
Hypriot
Chúng tôi sẽ chỉ cài đặt Docker trên Raspbian trong hướng dẫn cơ bản này, nhưng các hệ điều hành khác cũng có thể thực hiện được nếu bạn quan tâm đến Docker trên Raspberry Pi. Ví dụ, có Hypriot: một hệ điều hành cho Raspberry Pi được tối ưu hóa để sử dụng Docker. Sau đó, bạn chỉ phải cài đặt hình ảnh này trên thẻ micro-SD của Raspberry Pi và bạn có thể ngay lập tức bắt đầu sử dụng Docker. Hypriot đặc biệt thú vị nếu bạn chỉ chạy các vùng chứa Docker trên Raspberry Pi của mình và không có gì khác.
04 Tạo vùng chứa
Những điều cơ bản về làm việc với Docker container được thực hiện bằng lệnh người đóng tàu, như chúng tôi đã trình bày ở bước trước. Thông thường với Docker, bạn không muốn chạy một vùng chứa và tắt nó ngay lập tức, nhưng hãy để nó chạy. Vì vậy, chúng tôi không sử dụng tùy chọn --rm. Ngoài ra, bạn muốn vùng chứa đó chạy ở chế độ nền mà không phải lúc nào cũng nhìn thấy đầu ra trên màn hình. Các tùy chọn -NS.
Nếu bạn bắt đầu một vùng chứa theo cách này, Docker sẽ đặt cho nó một cái tên ngẫu nhiên, điều này sẽ không hữu ích nếu bạn có nhiều hơn một số vùng chứa. Với tùy chọn --tên tên do đó bạn đặt tên cố định cho vùng chứa.
Sau đó, bạn cũng phải xem xét các kết nối mạng. Vì mỗi vùng chứa Docker được tách biệt, bạn không thể chỉ truy cập ví dụ như máy chủ web chạy trên cổng 80 trong một vùng chứa. Do đó, bạn phải hướng dẫn Docker chuyển tiếp mọi yêu cầu trên cổng 8888 trên Raspberry Pi, chẳng hạn như cổng 80 trong một vùng chứa cụ thể. Bạn làm điều đó với tùy chọn -p 8888: 80. Đặt tất cả các tùy chọn này lại với nhau cho vùng chứa mẫu containernous / whoami, hãy chạy lệnh sau:
docker run -d --name whoami -p 8888: 80 containernous / whoami
Nếu mọi việc suôn sẻ, sau một thời gian, bạn sẽ thấy một chuỗi dài các số thập lục phân (như 5122c935ce5178751a59699d2c5605c607700bd04e5f57a6c18de434ae53956e). Đây là ID của vùng chứa. Nếu bây giờ bạn lướt trong trình duyệt web của mình để // IP: 8888 thay vì IP địa chỉ IP của Raspberry Pi của bạn, bạn sẽ thấy một trang web được tạo bởi máy chủ web trong vùng chứa.
05 Xem các vùng chứa của bạn
Khi bạn đã bắt đầu một vài vùng chứa như thế này, việc quản lý bắt đầu trở nên quan trọng. Trước hết, sẽ rất hữu ích khi xem các vùng chứa nào đang chạy:
docker ps
Sau đó, bạn sẽ thấy thông tin về tất cả các vùng chứa đang hoạt động (với tùy chọn -Một kể cả các thùng chứa đã dừng). Cột đầu tiên chứa một ID duy nhất cho mỗi vùng chứa, bên cạnh đó là hình ảnh mà vùng chứa được tạo từ đó. Cột TRẠNG THÁI tốt nhất nếu bạn có vấn đề. Ví dụ: nếu vùng chứa của bạn tiếp tục khởi động lại do sự cố, bạn sẽ thấy nó ở đây.
Trong cột CỔNG bạn thấy các cổng được sử dụng. Ví dụ, ở phía trước thùng chứa của chúng tôi, whoami là 0.0.0.0:8888->80/tcp. Điều đó có nghĩa là cổng tcp 8888 trên Raspberry Pi sẽ được chuyển hướng đến cổng tcp 80 trên vùng chứa. Trong cột cuối cùng, bạn thấy tên của vùng chứa, bạn có thể sử dụng tên này trong các lệnh Docker khác.
Nếu bạn muốn biết thêm thông tin, lệnh đi kèm số liệu thống kê về docker có ích. Sau đó, bạn sẽ thấy số liệu thống kê cho từng vùng chứa, chẳng hạn như mức tiêu thụ của bộ xử lý, bộ nhớ và mạng. Nếu bạn muốn tất cả thông tin Docker biết về một vùng chứa cụ thể, hãy chạy lệnh này với ID hoặc tên của vùng chứa:
docker kiểm tra CONTAINER
Và cuối cùng, nếu bạn muốn xem nhật ký của một vùng chứa, hãy chạy một trong hai lệnh sau:
nhật ký docker CONTAINER
nhật ký docker -f CONTAINER
Với tùy chọn -NS theo dõi nhật ký trong thời gian thực khi vùng chứa tạo ra chúng.
06 Quản lý vùng chứa và hình ảnh của bạn
Nếu bạn muốn dừng, bắt đầu hoặc khởi động lại vùng chứa đang chạy, bạn có thể thực hiện dễ dàng với các lệnh sau tương ứng:
docker dừng CONTAINER
khởi chạy docker CONTAINER
docker khởi động lại CONTAINER
Nếu bạn muốn tạm dừng một vùng chứa (tất cả các chương trình trong đó sẽ tạm thời bị 'đóng băng'), hãy chạy lệnh sau:
docker tạm dừng CONTAINER
Sau lệnh này, tất cả các chương trình trong vùng chứa sẽ chạy lại:
docker bỏ tạm dừng CONTAINER
Với lệnh hình ảnh docker bạn sẽ thấy danh sách các hình ảnh mà Docker đã tải xuống. Đối với vùng chứa whoami của chúng tôi, hãy xem trong cột KHO văn bản container / whoami đứng và trong cột NHÃN đứng muộn nhất. Tên đầy đủ của hình ảnh sẽ là container / whoami: mới nhất là, nhưng những muộn nhất là giá trị mặc định cho thẻ, vì vậy có thể được bỏ qua. Đó là lý do tại sao, trong nhiệm vụ của chúng tôi ở phần 4, chúng tôi docker chạy chỉ cần container / whoami như một hình ảnh.
Trong cột TẠO xem hình ảnh này đã được tải xuống cách đây bao lâu. Để cập nhật hình ảnh này, hãy chạy lệnh sau:
docker pull containernous / whoami: mới nhất
Sau đó, Docker tải xuống phiên bản mới nhất của hình ảnh hoặc cho bạn biết rằng hình ảnh đã được cập nhật. Nếu bạn làm lại sau hình ảnh docker bạn sẽ thấy rằng một hình ảnh đã được thêm vào.
Nhưng thùng chứa whoami hiện tại vẫn sử dụng hình ảnh cũ. Để nâng cấp cái này, hãy dừng (docker dừng whoami) và xóa (docker rm wohami) bạn tạo vùng chứa và tạo lại vùng chứa bằng cách sử dụng lệnh docker run từ phần 4.
Để dọn dẹp
Nếu bạn thường xuyên cập nhật hình ảnh Docker của mình để chạy phiên bản mới nhất trong một vùng chứa, các hình ảnh cũ sẽ vẫn còn. Thẻ micro-SD của Raspberry Pi có dung lượng tối đa là vài chục gigabyte có thể nhanh chóng đầy, đặc biệt nếu bạn chạy các bộ chứa lớn. Ví dụ: các vùng chứa như từ Home Assistant và Rhasspy có kích thước hơn một gigabyte. Bây giờ Docker hoạt động với một hệ thống để với một bản cập nhật không phải là gigabyte đầy đủ được tải xuống và lưu trữ lại, nhưng sau nhiều bản cập nhật, dung lượng lưu trữ cần thiết tiếp tục tăng lên. Với lệnh docker rmi IMAGE_ID xóa hình ảnh dựa trên ID bạn chỉ định trong đầu ra của lệnh hình ảnh docker tìm thấy. Docker cũng biết lệnh cắt tỉa hình ảnh docker loại bỏ tất cả các hình ảnh không được vùng chứa sử dụng. Của cắt tỉa hệ thống docker cũng xóa các vùng chứa đã dừng, các mạng không được sử dụng bởi ít nhất một vùng chứa và các tệp trong bộ nhớ cache.
07 Tập
Bộ chứa ví dụ whoami của chúng tôi không sử dụng bất kỳ dữ liệu cấu hình hoặc dữ liệu nào. Nhưng bạn có thể chia sẻ một thư mục trên Raspberry Pi của mình với một vùng chứa Docker để nó có thể truy cập dữ liệu từ đó. Docker gọi một thư mục chia sẻ như vậy là một tập.
Nếu bạn định làm việc với nhiều vùng chứa trên Raspberry Pi của mình, bạn nên đặt tất cả các thư mục của chúng lại với nhau. Tạo một thư mục cho điều đó, chẳng hạn như với:
mkdir -p / home / pi / container / nginx / data
Sau đó đặt vào thư mục container / nginx / data một tập tin index.html với một trang html.
Sau đó, bây giờ bạn có thể bắt đầu một vùng chứa với nginx (một máy chủ web) mà bạn chia sẻ thư mục này:
docker run -d --name nginx -p 8080: 80 -v / home / pi / container / nginx / data: / usr / share / nginx / html: ro nginx
Sau đó, vùng chứa khởi động với máy chủ web và gắn kết thư mục / home / pi / container / nging / data trên Raspberry Pi của bạn trong vùng chứa tại vị trí / usr / share / nginx / html, với quyền chỉ đọc (ro là viết tắt của chỉ đọc). Nếu bạn lướt bây giờ để IP: 8080 bạn có lấy được tệp html không index.html nhìn.
08 Docker Soạn
Cho đến nay, chúng tôi đã khởi động vùng chứa Docker theo cách thủ công bằng lệnh docker chạy. Nhưng nếu bạn đang chạy thêm một vài vùng chứa Docker và muốn thay đổi cấu hình của chúng thường xuyên, thì một cách tiếp cận khác sẽ tốt hơn: đặt mọi thứ vào một tệp cấu hình. Điều đó đi với Docker Compose.
Để làm điều đó, trước tiên hãy cài đặt pip trình quản lý gói của Python và sau đó là Docker Compose (là một chương trình Python) bằng các lệnh sau:
sudo apt cài đặt python3-pip
sudo pip3 cài đặt docker -omp
Bây giờ bạn có thể định cấu hình nhiều vùng chứa Docker trong một tệp docker-compos.yml để làm cho. Để thực hiện việc này, hãy tạo tệp Docker Compose với:
nano docker -omp.yml
Đặt vào đó cấu hình sau cho các vùng chứa ví dụ whoami và nginx của chúng tôi:
phiên bản: '3.7'
dịch vụ:
tôi là ai:
hình ảnh: container / whoami
container_name: whoami
khởi động lại: luôn luôn
Hải cảng:
- 8888:80
nginx:
hình ảnh: nginx
container_name: nginx
khởi động lại: luôn luôn
Hải cảng:
- 8080:80
âm lượng:
- / home / pi / container / nginx / data: / usr / share / nginx / html: ro
09 YAML
Lưu tệp bằng Ctrl + O và thoát nano bằng Ctrl + X. Đây là tệp YAML (có phần mở rộng là .yml). YAML (viết tắt của từ viết tắt đệ quy "YAML Ain't Markup Language") là một định dạng tệp để xác định dữ liệu cấu hình theo cách có thể đọc được. Thông tin thêm có thể được tìm thấy trên trang web chính thức.
Bạn có thể thấy trong tệp này rằng chúng tôi xác định hai vùng chứa là dịch vụ. Đối với mỗi vùng chứa, chúng tôi xác định hình ảnh được sử dụng, tên vùng chứa sẽ được cung cấp và liệu vùng chứa có nên tự động khởi động lại trong trường hợp có sự cố hay không. Ngoài ra, chúng tôi cũng xác định các cổng được chuyển hướng và khối lượng.
Bạn cũng có thể tìm thấy tất cả thông tin này trên các dòng lệnh với docker chạy, nhưng trong tệp Docker Compose này, nó có tổ chức hơn một chút.
10 Làm việc với Docker Compose
Khi bạn có một tập tin docker-compos.yml bạn có thể dễ dàng tạo và chạy các vùng chứa được xác định trong đó:
docker-soạn up -d
Sau đó, bạn có thể quản lý các vùng chứa này bằng lệnh docker, nhưng bản thân docker-compose cũng có rất nhiều tùy chọn đặc biệt để quản lý các vùng chứa mà bạn đã tạo bằng Docker Compose. Đây là cách bạn dọn dẹp mọi thứ bằng lệnh sau, tất cả các vùng chứa đã xác định sẽ bị dừng và bị xóa:
docker soạn xuống
Bạn cũng có thể theo dõi nhật ký của tất cả các vùng chứa với:
docker-soạn nhật ký -f
Mỗi vùng chứa hiển thị thông báo nhật ký của nó bằng một màu khác nhau. Docker Compose cũng có một giai điệu quen thuộc để dừng, bắt đầu và khởi động lại tất cả các vùng chứa:
docker soạn dừng
docker soạn bắt đầu
docker soạn thư khởi động lại
Cập nhật tất cả các vùng chứa trong tệp Docker Compose của bạn bằng hai lệnh sau:
docker soạn kéo
docker soạn thư khởi động lại
Lệnh đầu tiên sẽ tải xuống hình ảnh mới cho tất cả các vùng chứa bạn đã xác định và lệnh thứ hai sẽ khởi động lại tất cả các vùng chứa đó để chúng sử dụng hình ảnh mới. Sau đó, bạn có thể xóa các hình ảnh cũ nếu muốn với:
cắt tỉa hình ảnh docker
11 Và hơn thế nữa
Bạn có thể tìm thấy hình ảnh Docker của nhiều ứng dụng trên Docker Hub. Trên LinuxServer.io, bạn cũng sẽ tìm thấy hàng tá hình ảnh Docker được duy trì bởi các tình nguyện viên. Những hình ảnh này được duy trì và ghi lại tốt, và tất cả chúng đều sử dụng một cách tiếp cận và cơ sở hạ tầng cơ bản giống nhau.
Cố gắng giới hạn bản thân trong các hình ảnh Docker 'chính thức', được cung cấp bởi chính dự án hoặc hình ảnh từ các bên đáng tin cậy như LinuxServer.io. Vì về nguyên tắc ai cũng có thể xuất bản hình ảnh Docker lên Docker Hub, nhưng không phải lúc nào chúng cũng được cập nhật.
Kiến trúc bộ xử lý phù hợp
Điều quan trọng là bạn phải tải xuống hình ảnh Docker để có kiến trúc bộ xử lý chính xác. Raspberry Pi có bộ xử lý ARM, không tương thích với bộ xử lý Intel hoặc AMD có trong PC. Nhiều hình ảnh Docker được xuất bản để tự động tải xuống phiên bản chính xác cho kiến trúc bộ xử lý của bạn. Trên Docker Hub, bạn sẽ tìm thấy những kiến trúc nào được hỗ trợ trong trang hình ảnh Docker mong muốn. Đối với Raspbian là arm32v7, arm / v7 hoặc armhf. Nếu bạn nhận được thông báo lỗi khi khởi động vùng chứa Docker: lỗi định dạng thực thi có thể bạn đã tải xuống hình ảnh có cấu trúc bộ xử lý sai. Nếu điều đó xảy ra, bạn sẽ cần tải xuống hình ảnh có thẻ khác. Ví dụ: dự án motionEye phân phối hình ảnh Docker chính thức của nó với hai thẻ có thể có: bạn chạy ccrisan / motioneye: master-amd64 trên bộ xử lý tương thích với Intel và ccrisan / motioneye: master-armhf trên Raspberry Pi.