2017-04-09 16 views
8

Docker daemon documentation gợi ý hosts tùy chọn sau đây đối với hầu hết các thiết lập:những gì hiện fd: // nghĩa chính xác trong dockerd -H fd: //

dockerd -H fd:// 

Tôi đoán fd đứng cho bộ mô tả tập tin. Tôi không hiểu cách fd được sử dụng cho giao tiếp socket.

Tôi hiểu các tùy chọn sau:

-H unix:///var/run/docker.sock -H tcp://192.168.59.106 -H tcp://10.10.10.2 

Đây là unix socket miền và ổ cắm tcp. Tôi biết làm thế nào để gọi Docker daemon sử dụng các ổ cắm:

docker -H tcp://0.0.0.0:2375 ps 

Nhưng nếu tôi bắt đầu Docker daemon sử dụng -H fd://, cuộc gọi sau đây cho lỗi:

$ docker -H fd:// ps 
error during connect: Get http:///v1.26/containers/json: http: no Host in request URL 

Vì vậy, ý nghĩa của fd:// là gì? Có sử dụng cho nó?

Trả lời

1

Cú pháp -H fd:// được sử dụng khi chạy docker bên trong systemd. Bản thân Systemd sẽ tạo một ổ cắm trong tập tin đơn vị docker.socket và lắng nghe nó, và ổ cắm này được kết nối với daemon docker với cú pháp fd:// trong tệp đơn vị docker.service.

12

Khi bạn khởi động trình nền Docker, -H fd:// sẽ thông báo cho Docker rằng dịch vụ đang được Systemd khởi động và sẽ sử dụng kích hoạt socket. systemd sau đó sẽ tạo socket đích và chuyển nó vào trình nền Docker để sử dụng. Điều này được mô tả trong introduction to Systemd và trong introduction to socket activation. Các blog là khá dài nhưng thực sự đáng đọc, sau đây là một bản tóm tắt ngắn các điểm then chốt để hiểu được câu hỏi này:

  • Systemd là một init hệ thống mới nhằm thay thế hệ thống SysV init truyền thống. Một trong những tính năng chính của nó là quá trình init nhanh hơn.
  • Socket activation là một trong những công nghệ được sử dụng trong Systemd để tăng tốc độ khởi tạo dịch vụ
  • Để nhận yêu cầu, dịch vụ cần ổ cắm để nghe. Lấy Docker làm ví dụ, nó cần unix domain socket như /var/run/docker.sock hoặc ổ cắm TCP. Tất nhiên những ổ cắm này cần một cái gì đó để tạo ra chúng và phần lớn thời gian đó là bản thân dịch vụ tại thời điểm bắt đầu.
  • Khi kích hoạt ổ cắm, SystemD sẽ tạo các ổ cắm này và lắng nghe chúng cho các dịch vụ và chuyển các ổ cắm này để phục vụ với exec khi dịch vụ được khởi động. Một lợi ích là yêu cầu của khách hàng có thể được xếp hàng đợi trong bộ đệm ổ cắm khi ổ cắm được tạo thành công, ngay cả trước khi dịch vụ liên quan được bắt đầu.
  • Thông báo thông tin ổ cắm cho một dịch vụ nào đó được sử dụng bởi Systemd là trong socket tập tin đơn vị, cho Docker nó [docker.socket][3] với nội dung:

    [Unit] 
    Description=Docker Socket for the API 
    PartOf=docker.service 
    
    [Socket] 
    ListenStream=/var/run/docker.sock 
    SocketMode=0660 
    SocketUser=root 
    SocketGroup=docker 
    
    [Install] 
    WantedBy=sockets.target 
    

Hãy xem cách toàn bộ điều hoạt động. Tôi có các tệp docker.socketdocker.service trong số /etc/systemd/system.Dòng ExecStart cho docker.service là:

ExecStart=/usr/bin/dockerd -H fd:// 
  1. Dừng Docker dịch vụ: systemctl stop docker

    $> ps aux | grep 'docker' # the `grep` itself in the output is ignored 
    $> lsof -Ua | grep 'docker' 
    $> 
    

    Không có quá trình Docker đang chạy, và không docker.sock

  2. Execute systemctl start docker.socket:

    $> systemctl start docker.socket 
    $> ps aux | grep 'docker' 
    $> lsof -Ua | grep 'docker' 
    systemd  1 root 27u unix 0xffff880036da6000  0t0 140748188 /var/run/docker.sock 
    

    Sau khi bắt đầu docker.socket, chúng ta có thể thấy rằng vẫn không có quá trình docker chạy, nhưng socket /var/run/docker.sock đã được tạo và thuộc về quá trình systemd.

    (Tắt chủ đề: Trên thực tế, ổ cắm đã sẵn sàng nhận yêu cầu ngay bây giờ, mặc dù docker chưa chạy. Systemd sẽ bắt đầu docker.service tại thời điểm yêu cầu đầu tiên đến, chuyển các ổ cắm đã tạo đến Docker. -called theo yêu cầu tự động đẻ trứng)

  3. Bắt đầu docker.service

    $> systemctl start docker.service 
    $> ps aux | grep 'docker' 
    root  26302 0.0 1.8 431036 38712 ?  Ssl 14:57 0:00 /usr/bin/dockerd -H fd:// 
    <....> 
    

    Như bạn có thể nói với Docker hiện đang chạy. Hãy quay lại một bước và thử thực hiện /usr/bin/dockerd -H fd:// theo cách thủ công từ thiết bị đầu cuối:

    $> /usr/bin/dockerd -H fd:// 
    FATA[0000] no sockets found via socket activation: make sure the service was started by systemd 
    

    Bây giờ bạn thấy sự khác biệt; khi bạn sử dụng -H fd://, docker sẽ mong đợi socket được truyền bởi quá trình cha mẹ của nó chứ không phải là tự tạo nó. Khi nó được khởi động bởi Systemd, Systemd sẽ thực hiện công việc, nhưng khi bạn tự khởi động nó trên thiết bị đầu cuối, bạn không thực hiện công việc để quá trình docker daemon thất bại và hủy bỏ. Đây là số code of how docker process fd:// when docker daemon starts, bạn có thể xem nếu bạn quan tâm.

Mặt khác cho khách hàng Docker, Docker cli sẽ phân tích giao thức/addr từ host quy định tại -H và thực hiện một yêu cầu http để daemon Docker. Máy chủ lưu trữ mặc định là unix:///var/run/docker.sock. Các giao thức được hỗ trợ bao gồm tcp, unix, npipefd. Theo như tôi tìm hiểu từ mã nguồn cấu hình giao thông cho fd là như nhau với tcp vì vậy nếu bạn có tcp ổ cắm nghe, bạn chỉ có thể chơi nó với:

$> docker -H fd://localhost:4322 ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 

mà là giống như:

docker -H tcp://localhost:4322 ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
+0

Mô tả tuyệt vời @shizhz – Alkaline

+0

Cảm ơn @Alkaline vì đã cải thiện câu trả lời, tiếng Anh không phải là ngôn ngữ chính của tôi: - – shizhz

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