2016-10-08 64 views
5

Có một số quy trình đang chạy trong vùng chứa Docker, PID của chúng bị cô lập trong vùng tên vùng chứa, có cách nào để tìm ra PID của chúng trên máy chủ Docker không? Ví dụ: có một máy chủ web Apache chạy bên trong vùng chứa Docker, (Tôi sử dụng Apache + PHP hình ảnh từ Docker Hub) và Apache, khi nó bắt đầu, tạo ra nhiều quy trình công nhân bên trong vùng chứa. Những quy trình công nhân đó thực sự đang xử lý các yêu cầu đến. Để xem các quá trình này tôi chạy pstree bên trong container Docker:PID trong máy chủ, của một quá trình chạy bên trong một thùng chứa Docker là gì?

# pstree -p 1 
apache2(1)-+-apache2(8) 
      |-apache2(9) 
      |-apache2(10) 
      |-apache2(11) 
      |-apache2(12) 
      `-apache2(20) 

Phụ huynh quá trình Apache chạy trên PID 1 bên trong namespace quá trình container. Tuy nhiên theo quan điểm của chủ nó cũng có thể được truy cập, nhưng PID của nó trên máy chủ là khác nhau và có thể được xác định bằng cách chạy docker compose lệnh:

$ docker inspect --format '{{.State.Pid}}' container 
17985 

Từ đây chúng ta có thể thấy rằng PID 1 từ bên trong quá trình chứa không gian tên bản đồ để PID 17985 trên máy chủ. Vì vậy, tôi có thể chạy pstree trên máy chủ, vào danh sách các trẻ em của quá trình Apache:

$ pstree -p 17985 
apache2(17985)─┬─apache2(18010) 
       ├─apache2(18011) 
       ├─apache2(18012) 
       ├─apache2(18013) 
       ├─apache2(18014) 
       └─apache2(18164) 

Từ đó tôi cho rằng cùng một cách như thế nào PID 1 trong bản đồ container để PID 17.985 trên máy chủ, nó cũng có bản đồ :

  • PID 8 trong container để PID 18.010 trên máy chủ, và
  • PID 9 đến PID 18.011;
  • PID 10 đến PID 18.012 và vân vân ...

(Điều này cho phép tôi để gỡ lỗi các quá trình từ thùng chứa Docker, sử dụng các công cụ mà chỉ có sẵn chỉ trên máy chủ, và không phải là trong container , như strace)

Vấn đề là tôi không biết làm thế nào an toàn là giả định rằng pstree liệt kê các quy trình theo cùng một thứ tự trong cả thùng chứa và trong máy chủ.

Sẽ rất tuyệt nếu ai đó có thể đề xuất cách đáng tin cậy hơn để phát hiện PID là gì trên máy chủ của một quy trình cụ thể chạy bên trong vùng chứa Docker.

+0

Các PID cũng có thể có nghĩa là hệ điều hành Chủ đề, ít nhất là trên linux. Bạn có thể kiểm tra với java (hoặc ngôn ngữ khác) bằng cách tạo ra một số chủ đề và đếm PIDS bạn nhận được. – ieugen

Trả lời

11

Bạn có thể xem tệp /proc/<pid>/status để xác định ánh xạ giữa không gian tên PID và PID chung. Ví dụ, nếu trong một container Docker tôi bắt đầu vài sleep 900 quy trình, như thế này:

# docker run --rm -it alpine sh 
/# sleep 900 & 
/# sleep 900 & 
/# sleep 900 & 

tôi có thể nhìn thấy chúng chạy trong container:

/ # ps -fe 
PID USER  TIME COMMAND 
    1 root  0:00 sh 
    7 root  0:00 sleep 900 
    8 root  0:00 sleep 900 
    9 root  0:00 sleep 900 
    10 root  0:00 ps -fe 

tôi có thể nhìn vào những trên máy chủ:

# ps -fe | grep sleep 
root  10394 10366 0 09:11 pts/10 00:00:00 sleep 900 
root  10397 10366 0 09:12 pts/10 00:00:00 sleep 900 
root  10398 10366 0 09:12 pts/10 00:00:00 sleep 900 

Và đối với bất kỳ một trong những, tôi có thể nhìn vào các tập tin status để xem pid namespace:

# grep -i pid /proc/10394/status 
Pid: 10394 
PPid: 10366 
TracerPid: 0 
NSpid: 10394 7 

Nhìn vào đường dây NSpid, tôi có thể thấy rằng trong không gian tên PID, quy trình này đã pid 7.Và quả thực, nếu tôi giết quá trình 10394 trên máy chủ:

# kill 10394 

Sau đó, trong container Tôi thấy rằng PID 7 là không còn chạy nữa:

/ # ps -fe 
PID USER  TIME COMMAND 
    1 root  0:00 sh 
    8 root  0:00 sleep 900 
    9 root  0:00 sleep 900 
    11 root  0:00 ps -fe 
+2

Dường như nó giải quyết được vấn đề của tôi, theo lời khuyên này tôi có thể lấy bản đồ đầy đủ của PID với một lớp lót này: 'cho tôi bằng $ (ps -ef | grep $ (docker inspection --format '{{.State.Pid} } 'php-sandbox) | awk' {print $ 2} '); làm grep NSpid:/proc/$ i/trạng thái; xong rồi –

Các vấn đề liên quan