Yêu cầu thg 6 3, 2023 5:22 SA 126 1 1
  • 126 1 1
0

Docker Swarm - e gặp lỗi ạ.

Chia sẻ
  • 126 1 1
  • E có 2 con server ubuntu khác nhau(A và B ) sv A e tạo 3 container có service name là webserver, app database(khai báo trong cùng 1 file docker-compose.yml) 3 containers trên e tạo mạng network riêng tên là laravel_network, drive là brigde.
  • E vào trong container app e gõ "ping database" hoặc "ping IP của container database" thì đều ping đc ngon và ứng dụng laravel chạy ngon, ở file .env e khai báo DB_HOST=database và 1 tháng sau e ktra vẫn chạy ngon.
  • Sau đó ở server B e tạo docker swarm manager và bên server A e join swarm và kiểm tra thấy đã join, sau đó server A e chạy luôn câu lệnh "docker swarm leave" thì cái ứng dụng laravel của e ở server A báo ko thể kết nối database. E có vào container app để chạy lại 2 lệnh ping ban đầu thì: "ping database" báo lỗi đại khái là ko có service database hoặc lỗi phân giải network gì đó. "ping IP của container databse " thì vẫn ok. nên e phải sửa lại ở file .env thành DB_HOST=ip_container_database thì ứng dụng mưới connect được lại database.
  • E inspect container database thì cái alias network vẫn là database như ban đầu, e check log container cũng ko có lỗi gì. Vậy đây là lỗi gì mà sau khi leave swarm lại ko ping đc đến service name nữa ạ. e đã tái hiện lại lỗi trên rất nhiều lần rồi ạ và đều bị như vậy e có seach google thì có 1 bạn hỏi trên github bị y hệt như e nhưng ko có ai trả lời. Em cảm ơn nhiều ạ!

1 CÂU TRẢ LỜI


Đã trả lời thg 6 9, 2023 6:11 SA
Đã được chấp nhận
+1

Vấn đề của bạn chắc chắn sẽ nằm ở 2 điểm.

Nguyên nhân

  1. Khi bạn khởi tạo các dịch vụ ban đầu, nó không phải là dịch vụ của Swarm, các network controller này nó sẽ là lớp init của Docker.
  2. Sau khi join vào swarm thì Docker của bạn sẽ chuyển sang chế độ join swarm và map network controller theo Swarm, có thể hiểu là sau khi join vào thì nó sẽ đổi mode qua dùng chế độ của swarm chứ không còn là docker thuần nữa, và các network ban đầu không còn map được với nhau nữa.

Khắc phục

  1. Backup dữ liệu đối với DB hoặc code nếu cần thiết
  2. Xóa bỏ toàn bộ container đã tạo
  3. Xóa bỏ toàn bộ network name đã tạo trước đó bằng lệnh Docker
  4. Chạy lại các service như ban đầu

Nếu không được thì chắc phải join vào xem mới biết cụ thể hơn được.

Chia sẻ
thg 6 9, 2023 7:06 SA

Cảm ơn bạn đã chia sẻ 2 nguyên nhân trên giúp mình hiểu thêm, cách khắc phục thì mình chỉ cần restart lại container là nó chạy lại 😃

thg 6 9, 2023 7:08 SA

Vấn đề thắc mắc của mình rằng đó là lỗi hay là tính năng của docker khi join và leave swarm nó bắt buộc phải như vậy.

Avatar Clackken Smith @clackken.smith
thg 6 9, 2023 7:22 SA

@hoangkim1982 nó là phần cấu hình thôi, như đã nói đó, khi cấu hình bằng Swarm các Network Contrller của bạn sẽ hoạt động theo chế độ gọi tên của swarm, khi bạn out ra mà không cài lại các phần đó thì nó sẽ vẫn bị định danh theo swarm.

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí