Docker - Quản lý Cổng: Hướng dẫn cho Người mới bắt đầu

Xin chào các bạn, những người đam mê Docker tương lai! Tôi rất vui mừng được làm hướng dẫn viên của bạn trong hành trình thú vị này vào thế giới quản lý cổng của Docker. Như một ai đó đã dạy khoa học máy tính trong nhiều năm, tôi đã tận mắt chứng kiến cách Docker cách mạng hóa cách chúng ta phát triển và triển khai các ứng dụng. Vậy, hãy cùng nhau lặn vào và làm rõ khái niệm quản lý cổng trong Docker!

Docker - Managing Ports

EXPOSE vs. PUBLISH: Hiểu rõ sự Khác biệt

Trước khi chúng ta bắt đầu viết mã, hãy làm rõ một sự nhầm lẫn phổ biến mà nhiều học sinh của tôi thường gặp: sự khác biệt giữa EXPOSE và PUBLISH trong Docker.

EXPOSE

EXPOSE giống như đặt một biển "Đang bán" trên một ngôi nhà. Nó chỉ ra rằng容器 đang lắng nghe trên các cổng cụ thể, nhưng nó không thực sự làm các cổng đó khả dụng từ bên ngoài container.

PUBLISH

PUBLISH, ngược lại, giống như mở cửa trước và mời mọi người vào. Nó ánh xạ một cổng từ container đến một cổng trên máy chủ, làm cho nó khả dụng từ bên ngoài.

Hãy xem một bảng đơn giản để tóm tắt:

Lệnh Mục đích Khả dụng từ bên ngoài?
EXPOSE ghi chú cổng Không
PUBLISH ánh xạ cổng

Bây giờ chúng ta đã làm rõ điều đó, hãy xem cách chúng ta có thể sử dụng chúng trong thực tế!

Làm thế nào để Expose một Cổng trong Docker bằng PUBLISH?

Khi bạn đang chạy một container, bạn có thể sử dụng tùy chọn -p hoặc --publish để ánh xạ một cổng container đến một cổng trên máy chủ. Giả sử chúng ta có một ứng dụng web chạy trên cổng 8080 bên trong container, và chúng ta muốn truy cập nó trên cổng 80 trên máy chủ của chúng ta.

Dưới đây là cách chúng ta làm điều đó:

docker run -p 80:8080 my-web-app

Hãy phân tích điều này:

  • docker run: Lệnh này chạy một container
  • -p 80:8080: Điều này ánh xạ cổng 8080 trong container đến cổng 80 trên máy chủ
  • my-web-app: Đây là tên của Docker image của chúng ta

Sau khi chạy lệnh này, bạn có thể truy cập ứng dụng web của bạn bằng cách导航 đến http://localhost trong trình duyệt web của bạn. Có phải rất thú vị không?

Nhưng nếu chúng ta muốn ánh xạ nhiều cổng? Không có vấn đề! Chúng ta có thể sử dụng nhiều tùy chọn -p:

docker run -p 80:8080 -p 443:8443 my-web-app

Điều này ánh xạ cổng 8080 đến 80 cho lưu lượng HTTP, và 8443 đến 443 cho lưu lượng HTTPS. Nó giống như cho ứng dụng của bạn cả cửa trước và cửa sau!

Làm thế nào để Expose một Cổng trong Dockerfile?

Bây giờ, hãy nói về cách chúng ta có thể expose ports trực tiếp trong Dockerfile của chúng ta. Điều này rất hữu ích khi bạn đang xây dựng các Docker image của riêng bạn.

Dưới đây là một Dockerfile đơn giản cho một ứng dụng Node.js:

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]

Hãy phân tích điều này:

  • FROM node:14: Đây đặt image cơ bản của chúng ta là Node.js version 14
  • WORKDIR /app: Đây đặt thư mục làm việc trong container
  • COPY package*.json ./: Đây sao chép file package.json của chúng ta
  • RUN npm install: Đây cài đặt các phụ thuộc của chúng ta
  • COPY . .: Đây sao chép mã ứng dụng của chúng ta
  • EXPOSE 8080: Điều này告诉 Docker rằng container sẽ lắng nghe trên cổng 8080
  • CMD [ "node", "server.js" ]: Đây là lệnh để khởi động ứng dụng của chúng ta

Lệnh EXPOSE ở đây giống như đặt biển "Đang bán" mà chúng ta đã nói trước đó. Nó đang告诉 Docker, "Hey, container này sẽ lắng nghe trên cổng 8080!"

Nhưng hãy nhớ, EXPOSE một mình không publish cổng. Để thực sự làm cho cổng khả dụng khi chạy container, chúng ta vẫn cần sử dụng tùy chọn -p:

docker run -p 80:8080 my-node-app

Điều này ánh xạ cổng 8080 đã expose trong container đến cổng 80 trên máy chủ của chúng ta.

Kết luận

Và đó là tất cả, các bạn! Chúng ta đã hành trình qua vùng đất quản lý cổng của Docker, từ việc hiểu sự khác biệt giữa EXPOSE và PUBLISH, đến việc thực sự triển khai chúng trong Dockerfiles và lệnh chạy.

Nhớ rằng, quản lý cổng trong Docker là tất cả về giao tiếp. EXPOSE giống như nói với Docker, "Hey, tôi sẽ sử dụng các cổng này," trong khi PUBLISH giống như nói với máy tính của bạn, "Tôi muốn bạn lắng nghe cổng này từ container Docker."

Khi bạn tiếp tục hành trình Docker của bạn, bạn sẽ thấy rằng việc hiểu port management là rất quan trọng cho việc triển khai các ứng dụng, đặc biệt là trong các kiến trúc microservice phức tạp. Nhưng đừng lo lắng, với thực hành, nó sẽ trở thành bản năng thứ hai!

FAQ

Dưới đây là một số câu hỏi phổ biến mà học sinh của tôi thường hỏi:

  1. Q: Tôi có thể sử dụng EXPOSE trong lệnh docker run không? A: Không, EXPOSE chỉ được sử dụng trong Dockerfiles. Để ánh xạ cổng tại thời điểm chạy, sử dụng tùy chọn -p.

  2. Q: Điều gì xảy ra nếu tôi không sử dụng PUBLISH khi chạy một container? A: Container sẽ chạy, nhưng bạn sẽ không thể truy cập nó từ bên ngoài mạng Docker.

  3. Q: Tôi có thể ánh xạ một cổng container đến nhiều cổng máy chủ không? A: Có! Bạn có thể sử dụng nhiều tùy chọn -p để ánh xạ một cổng duy nhất của container đến nhiều cổng khác nhau trên máy chủ.

  4. Q: Có giới hạn nào về số lượng cổng tôi có thể expose hoặc publish không? A: Không có giới hạn cứng trong Docker, nhưng hệ điều hành của bạn có thể có giới hạn về số lượng cổng khả dụng.

  5. Q: Sự khác biệt giữa -p và -P trong lệnh docker run là gì? A: -p cho phép bạn chỉ định các ánh xạ cổng, trong khi -P publish tất cả các cổng đã expose đến các cổng ngẫu nhiên trên máy chủ.

Nhớ rằng, cách tốt nhất để học là làm. Hãy khởi động terminal của bạn, bắt đầu tạo các Dockerfile, và chúc may mắn với việc mã hóa!

Credits: Image by storyset