Fix error Cannot start Docker Compose application.

Note for me (bản thân mình ghi lại để nhớ)

Tôi đang sử dụng Docker để run website, khi bấm Start thì xảy ra lỗi như bên dưới 

Cannot start Docker Compose application. Reason: compose [start] exit status 1. Container template-template-nginx-1 Starting Container template-template-redis-1 Starting Container template-template-app-1 Starting Container template-template-db-1 Starting Container template-template-redis-1 Started Container template-template-app-1 Started Container template-template-nginx-1 Started Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

I. Cách khắc phục của tôi như sau (cách tôi làm, không biết có lỗi gì tiếp theo hay không, tôi chưa kiểm tra, nhưng nó đã Start được)

1. Vào cmd trên windows, dùng lệnh netstat -ano | findstr :3306 để kiểm tra xem PID số mấy đang chạy



2. Sau khi có được PID  6460 là trường hợp của tôi > vào Task manager > gõ 6460 vào ô tìm kiếm > bên dưới xuất hiện dòng nào đang sử dụng port đó > click phải lên nó > End task

Chú ý: Nếu ứng dụng khác sử dụng MySQL đang chạy trên cổng 3306, bạn cần cân nhắc xem liệu việc dừng tiến trình này có ảnh hưởng đến hệ thống hay không


3. Quit docker > mở lại docker > bấm start lại project là được.


II. Ngoài ra có cách khác, các bạn có thể tham khảo thêm

Lỗi này xảy ra khi Docker cố gắng gán cổng 3306 (thường được sử dụng cho MySQL) cho một container, nhưng cổng này đã được sử dụng bởi một ứng dụng khác trên máy của bạn.

Để khắc phục lỗi này, bạn có thể làm theo các bước sau:

1. Tìm tiến trình đang sử dụng cổng 3306

  • Trên Windows, bạn có thể dùng lệnh sau trong Command Prompt (CMD) hoặc PowerShell để tìm tiến trình đang sử dụng cổng 3306:
    bash
    netstat -ano | findstr :3306
    Lệnh này sẽ liệt kê tất cả các tiến trình sử dụng cổng 3306. Lưu ý số PID (Process ID) của tiến trình này.

2. Dừng tiến trình đang sử dụng cổng 3306

  • Sau khi xác định được PID, bạn có thể dừng tiến trình đó bằng lệnh sau trong CMD:
    bash
    taskkill /PID <PID> /F
    Thay <PID> bằng số PID mà bạn đã tìm thấy.

3. Thay đổi cổng trong Docker Compose

  • Nếu bạn không muốn dừng ứng dụng khác đang sử dụng cổng 3306, bạn có thể thay đổi cổng MySQL trong file docker-compose.yml.
  • Tìm mục tương tự như sau trong file docker-compose.yml:
    yaml
    ports: - "3306:3306"
    Bạn có thể thay đổi cổng host (số trước dấu :) thành một cổng khác chưa được sử dụng, ví dụ:
    yaml
    ports: - "3307:3306"

4. Khởi động lại Docker Compose

  • Sau khi thay đổi cổng hoặc dừng tiến trình đang sử dụng cổng 3306, bạn có thể khởi động lại Docker Compose:
    bash
    docker-compose up -d

Lưu ý

  • Nếu ứng dụng khác sử dụng MySQL đang chạy trên cổng 3306, bạn cần cân nhắc xem liệu việc dừng tiến trình này có ảnh hưởng đến hệ thống hay không.

Task Manager có thể được sử dụng để dừng tiến trình nhưng không thể trực tiếp "kill port". Bạn nên sử dụng phương pháp qua CMD như đã đề cập ở trên để giải quyết vấn đề này một cách chính xác hơn.

Nhận xét