Bạn thêm network_mode: service:vpn vào ứng dụng, khởi động lại ngăn xếp, và ứng dụng chết vì db không còn được phân giải. Không có gì bị đổi tên trong tệp compose, nên những nghi phạm rõ ràng là DNS và cơ sở dữ liệu. Thay đổi thực sự nhỏ hơn và lạ hơn: ứng dụng không còn là thành viên của mạng Compose nơi tên đó tồn tại. Cho đến khi bạn quyết định cơ sở dữ liệu phải trả lời từ không gian tên nào, mọi bản sửa tên máy chủ đều là phỏng đoán.

Vì sao tên máy chủ db không còn được phân giải

Một dịch vụ dùng network_mode không có địa chỉ riêng trên mạng Compose; nó mượn không gian tên của dịch vụ được đặt tên. Không gian tên đó mang theo giao diện, tuyến đường, không gian cổng và trình phân giải của riêng nó, và nó thay thế phần gắn kết của ứng dụng với mạng backend. Tên db chưa bao giờ trừu tượng: nó sống trên mạng đó và được phân giải qua DNS nhúng của mạng. Bỏ phần gắn kết đi thì tên không còn nơi nào để phân giải.

Hãy xác nhận điều đó từ bên trong các container chứ không phải từ máy chủ. Một truy vấn thất bại trong ứng dụng nhưng thành công trong container cơ sở dữ liệu nghĩa là tên vẫn ổn còn tư cách thành viên thì không. Kết quả đó cũng đặt bản sửa vào cấu trúc compose thay vì vào cài đặt trình phân giải của ứng dụng.

Ba câu hỏi trước khi sửa tệp

Trả lời theo thứ tự, vì mỗi câu thu hẹp cấu trúc. Cơ sở dữ liệu phải trả lời cho cái gì: một tên máy chủ mà các container khác dùng, hay chỉ cho ứng dụng trên loopback? Ứng dụng có phải công bố một cổng ra máy chủ không, và dịch vụ nào sẽ sở hữu nó? Cơ sở dữ liệu có phải truy cập được từ máy chủ hay từ máy khác, hay chỉ từ bên trong đường hầm?

Nếu cơ sở dữ liệu cần tên riêng và ứng dụng không công bố gì, hãy giữ chúng trên các gắn kết riêng. Nếu ứng dụng phải công bố một cổng và mọi thứ đi qua đường hầm, hãy đặt cơ sở dữ liệu vào không gian tên VPN và dùng loopback. Trộn cả hai sẽ tạo ra một ngăn xếp khởi động sạch sẽ và hỏng lúc kết nối.

Để cơ sở dữ liệu ở nơi nó đang ở

Thay đổi nhỏ hơn gắn chủ sở hữu không gian tên vào mạng đã chứa cơ sở dữ liệu. Ứng dụng thừa hưởng phần gắn kết đó vì nó chia sẻ ngăn xếp vpn, và db được phân giải đúng như trước.

services:
  vpn:
    networks:
      - backend
  app:
    network_mode: service:vpn
  db:
    networks:
      - backend
networks:
  backend:

Đừng thêm networks vào ứng dụng nữa. Compose từ chối thuộc tính đó cùng với network_mode trong cùng một dịch vụ, và lỗi chỉ vào tệp chứ không phải cặp. Nếu ứng dụng khách VPN lọc đích backend bên trong không gian tên của nó, hãy điều chỉnh cả chính sách mạng cục bộ được hỗ trợ của nó; gắn kết chia sẻ cho một đường đi nhưng không vô hiệu hóa bộ lọc đó.

Chuyển cơ sở dữ liệu vào không gian tên

Thay đổi lớn hơn đặt cơ sở dữ liệu vào cùng không gian tên và trỏ ứng dụng tới 127.0.0.1 với cổng thật. Hai tiến trình không thể cùng ràng buộc một địa chỉ và cổng chỉ vì chúng khởi động trong các container khác nhau, nên một cơ sở dữ liệu cũng lắng nghe trên địa chỉ wildcard sẽ xung đột với bất cứ thứ gì khác làm vậy. Hãy kiểm tra trình lắng nghe trước khi chuyển.

Các cổng được công bố thuộc về dịch vụ sở hữu không gian tên. Việc thêm ports vào ứng dụng bị từ chối cùng với network_mode, và việc bịa ra một địa chỉ ứng dụng riêng mô tả một giao diện không tồn tại.

Sẵn sàng, chặn và trình phân giải

depends_on sắp xếp việc khởi động container; nó không phải bằng chứng đường hầm đang hoạt động và không dừng lưu lượng khi đường hầm sập. Hãy coi khả năng tiếp cận, độ sẵn sàng của đường hầm và việc chặn lỗi là ba yêu cầu riêng biệt. Một ngăn xếp chỉ đáp ứng yêu cầu đầu sẽ qua bài kiểm tra thủ công vào ngày đẹp trời và rò rỉ vào ngày xấu. Viết ba câu trả lời bên cạnh tệp compose, nơi người tiếp theo sẽ nhìn.

Chia sẻ không gian tên cũng có nghĩa là ứng dụng thừa hưởng trình phân giải của container VPN, điều này giúp ích khi đường hầm áp đặt máy chủ DNS và gây nhầm lẫn khi không làm vậy. Hãy kiểm tra không gian tên thực sự chứa gì thay vì giả định trình phân giải của máy chủ được áp dụng. Tài liệu tham chiếu dịch vụ Compose ghi lại network_mode, ports và hành vi của phụ thuộc ở một nơi, bao gồm cả lý do một dịch vụ network_mode không có địa chỉ riêng.

Bài viết liên quan