‫Hãy đi sâu vào Dockerfile, đây thực sự là một công thức để tạo hình ảnh của bạn.
‫Cho đến nay, tất cả các hình ảnh Docker mà chúng tôi đang sử dụng đều được tạo từ Dockerfiles nơi bạn có thể xem
‫chúng trên Docker Hub.
‫Nếu bạn đã nhân bản kho lưu trữ của tôi từ các tài nguyên được liệt kê trong phần đầu tiên, bạn sẽ thấy một thư mục tệp mẫu
‫của docker 1 và trong đó chúng ta sẽ chỉ có một tệp. Một tệp Docker.
‫Chúng ta sẽ đi từng dòng một và nói về những khổ thơ khác nhau này. Dockerfile có vẻ giống như một tập lệnh shell,
‫nhưng không phải vậy.
‫Nó không phải là một tập tin hàng loạt, nó không phải là một tập lệnh shell. Đó là một ngôn ngữ hoàn toàn khác của
‫tệp, duy nhất cho Docker và tên mặc định là Dockerfile với chữ D. viết hoa.
‫Tuy nhiên, từ dòng lệnh, bất cứ khi nào bạn cần xử lý một Dockerfile bằng lệnh docker,
‫bạn thực sự có thể sử dụng dấu gạch ngang f. Điều này thực sự phổ biến trong số rất nhiều công cụ với Docker,
‫bạn có thể sử dụng dấu gạch ngang f để chỉ định một tệp khác với tệp mặc định.
‫Vì vậy, đầu tiên là lệnh from. Lệnh from có trong mọi Dockerfile. Nó bắt buộc phải ở đó.
‫Nó thường là một phân phối tối thiểu.
‫Trong trường hợp này, đó là Debian.
‫Nhưng rất nhiều thời điểm hiện nay nó sẽ là Alpine.
‫Và thực sự, lý do bạn sử dụng những thứ này là để tiết kiệm thời gian và sự đau đớn cho bản thân. Bởi vì những bản phân phối tối thiểu này thực sự nhỏ
‫hơn nhiều so với những đĩa CD mà bạn sẽ sử dụng để cài đặt một máy ảo từ chúng.
‫Ví dụ, Ubuntu thậm chí không có cURL trong đó, trong khi rõ ràng, nếu bạn cài đặt bản cài đặt Ubuntu
‫đầy đủ trên một máy ảo, nó sẽ có cURL và rất nhiều lệnh khác đã được cài đặt.
‫Bởi vì tất cả các bản phân phối này đều là hình ảnh chính thức, điều đó có nghĩa là chúng sẽ luôn được
‫cập nhật các bản vá bảo mật mới nhất và bạn có thể tin cậy và tin tưởng vào chúng.
‫Và một trong những lợi ích chính khi sử dụng chúng trong các thùng chứa là sử dụng hệ thống phân phối gói của họ để cài
‫đặt bất kỳ phần mềm nào bạn cần trong gói của mình.
‫Trong trường hợp này, chúng tôi thực sự đang sử dụng bản phát hành Jessie, là bản phát hành sau dấu hai chấm.
‫Và, như bạn nhớ từ cuộc trò chuyện Docker Hub của chúng tôi, có rất nhiều tùy chọn khác nhau mà bạn có thể chỉ
‫định tại đây cho kho lưu trữ Debian.
‫Tiếp theo, chúng ta có đoạn thơ ENV và ENV dành cho các biến môi trường.
‫Đó là một cách để đặt các biến môi trường, thực sự rất quan trọng trong các vùng
‫chứa vì chúng là cách chính chúng ta đặt các khóa và giá trị cho việc xây dựng vùng chứa và để chạy các vùng chứa.
‫Trong trường hợp này, nó thực sự đang thiết lập phiên bản Nginx mà nó muốn chúng tôi cài đặt và biến môi trường
‫này sẽ được đặt để mọi dòng tiếp theo sẽ có thể sử dụng nó.
‫Bây giờ, như một lời nhắc từ các bài giảng trước, mỗi khổ thơ này là một lớp thực tế trong hình ảnh Docker
‫của chúng tôi.
‫Vì vậy, thứ tự của chúng thực sự quan trọng, bởi vì nó hoạt động từ trên xuống.
‫Như bạn sẽ thấy bởi lệnh chạy tương đối dài này ở đây cho lệnh tiếp theo. Bạn sẽ thấy rằng nó giống như
‫một lệnh dài.
‫Những gì nó đang làm thực sự chỉ là thực hiện các lệnh shell bên trong vùng chứa này khi nó đang xây dựng
‫nó.
‫Bạn sẽ thường thấy các lệnh chạy khi cần cài đặt phần mềm với kho lưu trữ gói hoặc bạn cần thực hiện
‫một số thao tác giải nén hoặc một số chỉnh sửa tệp bên trong chính vùng chứa.
‫Lệnh Run cũng có thể chạy các tập lệnh shell mà bạn đã sao chép trước đó trong tệp hoặc bất kỳ lệnh nào mà
‫bạn có thể truy cập từ bên
‫trong vùng chứa tại thời điểm đó trong tệp.
‫Vì chúng tôi đến từ Debian nên lệnh chạy này có quyền truy cập vào tất cả các lệnh và tệp nhị phân sẽ
‫được cài đặt với bản phát hành đó.
‫Và trong lệnh này cho Nginx, danh sách lệnh này ít nhiều bổ sung một khóa vào kho lưu trữ nơi bạn
‫có thể tải gói cài đặt Nginx mới nhất từ kho lưu trữ chính thức của Nginx.
‫Có một vài điều ở đây thực sự quan trọng trong việc tạo Dockerfiles tốt và chúng ta sẽ thực sự nói về điều
‫này nhiều hơn trong phần sau, nơi chúng ta nói về các phương pháp hay nhất.
‫Nhưng cần lưu ý hai điều.
‫Lý do mà chúng tôi thêm tất cả các lệnh này với dấu kép và ở đây, để chúng được
‫xâu chuỗi lần lượt, là bởi vì, nếu bạn nhớ, mỗi khổ thơ là một lớp riêng của nó.
‫Điều này đảm bảo rằng tất cả các lệnh này đều nằm gọn trong một lớp duy nhất.
‫Nó tiết kiệm cho chúng tôi một ít thời gian.
‫Nó giúp chúng ta tiết kiệm không gian. Và nó phổ biến đến mức có thể bạn sẽ thấy nó trong mọi Dockerfile trên Docker Hub.
‫Được rồi, trên dòng 27, chúng ta có một lệnh chạy khác.
‫Đây là tất cả về việc trỏ các tệp nhật ký của chúng tôi tới
‫stdout và tới stderr.
‫Chúng ta sẽ thấy ở phần sau, cách thích hợp để đăng nhập bên trong vùng chứa là không đăng nhập vào tệp nhật ký. Và không có nhật ký hệ thống hoặc bất kỳ dịch
‫vụ nhật ký hệ thống nào khác bên
‫trong một vùng chứa. Docker thực sự xử lý tất cả nhật ký của chúng tôi cho chúng tôi. Tất cả những gì chúng ta phải
‫làm bên trong vùng chứa là đảm bảo rằng mọi thứ chúng ta muốn được ghi lại trong nhật ký sẽ được chuyển sang
‫stdout và stderr và docker sẽ xử lý phần còn lại.
‫Thực sự có các trình điều khiển ghi nhật ký mà chúng tôi có thể sử dụng trong Docker Engine để kiểm soát tất cả các nhật ký cho tất
‫cả các vùng chứa trên máy chủ của chúng tôi.
‫Và đó thực sự là những gì bạn muốn làm với chúng.
‫Nó làm tăng thêm độ phức tạp cho ứng dụng của bạn nếu ứng dụng của bạn thực sự đang tự ghi nhật ký.
‫Và sau đó, nếu bạn phải xử lý các tệp trong mọi vùng chứa, thì bây giờ bạn gặp vấn đề là làm cách nào
‫để lấy các tệp đó ra ngoài, có thể tìm kiếm và có thể truy cập được. Ở đây, chúng tôi đang sử dụng các nhật ký Nginx mặc định và chúng
‫tôi thực sự đang liên kết chúng với stdout.
‫Để Docker có thể nắm bắt chúng.
‫Chúng tôi cũng có một lệnh phơi bày.
‫Theo mặc định, không có cổng TCP hoặc UDP nào
‫được mở bên trong vùng chứa. Nó không hiển thị bất kỳ thứ gì từ vùng chứa vào mạng ảo trừ khi chúng tôi
‫liệt kê nó ở đây.
‫Và, tất nhiên, bởi vì đây là một máy chủ Web và proxy, nó sẽ hiển thị 80 và 443.
‫Bây giờ, lệnh hiển thị này không có nghĩa là các cổng này sẽ được mở tự động trên máy chủ của chúng ta.
‫Đó là lệnh gạch ngang P bất cứ khi nào chúng ta sử dụng docker run.
‫Cuối cùng, chúng tôi có CMD ở đây. CMD là tham số bắt buộc, là lệnh cuối cùng
‫sẽ được chạy mỗi khi bạn khởi chạy vùng chứa mới từ hình ảnh hoặc mỗi khi bạn khởi động lại vùng chứa đã dừng.
‫Có một số tài liệu thực sự tuyệt vời về tất cả các khổ thơ này, cùng với nhiều tài liệu khác nữa, mà chúng ta sẽ đi sâu vào phần sau, trên
‫trang web tài liệu Docker tại docs. người đóng tàu. com, mà bạn
‫có thể tìm thấy trong các nguồn của bài giảng này.
‫Được rồi, vậy đây là những điều cơ bản, phải không? Năm khổ thơ khác nhau này khá bình thường trong mỗi Dockerfile.
‫Một số trong số chúng là bắt buộc.
‫Một số trong số chúng, như chạy, ENV và phơi sáng, là tùy chọn, nhưng chúng khá điển hình cho hầu hết các vùng
‫chứa mà bạn sẽ tạo hình ảnh.