Làm cách nào để hiển thị API docker qua TCP?


13

Tôi đang sử dụng portainer và không thể quản lý các điểm cuối từ xa. Tôi đã thử sử dụng dòng lệnh để kết nối với các nút docker từ xa, nhưng nhận được một tin nhắn Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Vâng, họ đang chạy. Tôi đã thêm mình vào nhóm docker và có thể truy cập docker bằng cách SSH vào các nút. Tuy nhiên tôi không thể truy cập bất kỳ nút docker từ xa.

Tôi đã sửa đổi /etc/defaultđể thêm / bỏ ghi chúDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

Tôi cũng sửa đổi /etc/init.d/docker/etc/init/docker.confbao gồm DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Tôi đã khởi động lại dịch vụ docker, đăng xuất và đăng nhập nhiều lần trong quy trình, nhưng vẫn không thể kết nối với nút từ xa. Tôi thậm chí không thể kết nối với nút cục bộ bằng cách truyền IP.

Tôi đã bỏ lỡ những gì? Cấu hình nào trong tệp hiển thị API qua TCP?

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<REMOTE_IP>:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://127.0.0.1:2375 info
Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://<LOCAL_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?
user@hostname:~$

Chỉnh sửa: Chạy ps aux | grep -i dockertrả về cái này -

root      3581  0.1  0.2 596800 41540 ?        Ssl  04:17   0:35 /usr/bin/dockerd -H fd://
root      3588  0.0  0.0 653576 14492 ?        Ssl  04:17   0:18 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

Là 2375 nghe? ss -ntl
jscott

Không. Không có gì nghe vào năm 2375. Và tôi không thể tìm ra cấu hình nào trong tập tin nào ảnh hưởng đến điều này. Tôi đã bao gồm đầu ra ps auxtrong câu trả lời của tôi nếu điều đó giúp.
Chúa ơi.

Tôi đã thử những thứ tương tự và nghi ngờ rằng các tệp / etc / default / docker, /etc/init/docker.conf và /etc/init.d/docker chỉ đơn giản là bị bỏ qua trên Ubuntu 16.04 với cài đặt docker-ce, bất cứ ai cũng có thể xác nhận ? Tôi nghĩ rằng khi tôi chạy "trạng thái docker dịch vụ", điều thực sự xảy ra là "docker status systeml", toàn bộ hệ thống quản lý khác.
chrisinmtown

Câu trả lời:


21

Tôi tìm thấy một giải pháp nhờ vào bài viết của Ivan Krizsan .

Tôi đã phải chỉnh sửa /lib/systemd/system/docker.servicetrên hệ thống Ubuntu 16.04.2 LTS của mình để sửa đổi dòng

ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:

sau đó

sudo systemctl daemon-reload
sudo systemctl restart docker.service

và mọi thứ đã hoạt động :-). Bước tiếp theo là tìm ra cách bảo vệ hình thức docker daemon bị tấn công.


1
Tôi xác nhận thay đổi này khiến Dockerd lắng nghe các yêu cầu HTTP trên Ubuntu 16.04 với docker-ce ver 17,06. Nó chỉ cảm thấy sai khi sửa đổi tập lệnh dịch vụ trực tiếp.
chrisinmtown

7
Không bao giờ chỉnh sửa trực tiếp tập lệnh dịch vụ docker (hoặc bất kỳ tập lệnh dịch vụ nào). SystemD có một tính năng chỉnh sửa khác biệt được tích hợp. Sử dụng systemctl edit docker.servicevà systemctl sẽ tạo một tệp mới với các chỉnh sửa của bạn. Điều này ngăn một bản cập nhật xóa sạch các thay đổi của bạn. SystemD sẽ hợp nhất hai tệp khi chạy. Tài liệu tốt ở đây: digitalocean.com/community/tutorials/ Từ
Routhinator

Cảm ơn! Điều này là rất hữu ích. Tôi tiếp tục nhận được cảnh báo trong khi cập nhật. Tôi sẽ xem xét điều này: _)
Lord Loh.

4
Trên Ubuntu Server 18.04, nó hoạt động như thế này:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA

Khi tôi sử dụng -H tcp://cài đặt một mình, không có -H fd://cài đặt, tôi không thể phát lệnh và lệnh máy khách, ví dụ .., thông tin về docker, phiên bản docker, v.v.
Chris F

2

Thư mục / etc / default là nơi các nhà bảo trì phân phối đặt các tệp cấu hình của họ. Nếu bạn cài đặt docker trực tiếp từ kho của Docker, thư mục này sẽ không được sử dụng.

Thư mục / lib / systemd là nơi các gói sẽ cài đặt các tệp systemd của chúng và chúng sẽ ghi đè lên bất kỳ thay đổi nào khi nâng cấp. Nếu bạn sử dụng điều này, những thay đổi của bạn sẽ bị mất.

Để thực hiện các thay đổi của riêng bạn đối với tệp đơn vị systemd vẫn tồn tại, bạn có thể tạo tệp đơn vị trong /etc/systemd/system/docker.service.d/, ví dụ: đây là /etc/systemd/system/docker.service của tôi. d / ghi đè.

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

Việc ghi đè đó chỉ đơn giản là hủy cài đặt tất cả các cờ dòng lệnh sang trình nền dockerd từ systemd. Sau khi hoàn tất, bạn có thể ghi đè mọi cài đặt từ /etc/docker/daemon.json được sử dụng bởi docker và tùy thuộc vào cài đặt, có thể được tải lại mà không cần khởi động lại daemon. Ví dụ: đây là một ví dụ /etc/docker/daemon.json:

{
"debug": false,
"experimental": true,
"hosts": ["fd://", "tcp://0.0.0.0:2376"],
"labels": ["foo=bar", "fez=baz"],
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"},
"storage-driver": "overlay2",
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/host-cert.pem",
"tlskey": "/etc/docker/certs/host-key.pem",
"tlsverify": true
}

Đối với mục đích của bạn, bạn chỉ cần dòng trong đó để thiết lập máy chủ.

Một phần cực kỳ quan trọng của tệp cấu hình ở trên là cài đặt TLS. Nếu bạn không định cấu hình TLS lẫn nhau giữa máy khách và máy chủ và bạn mở docker để nghe trên mạng, bạn đang chạy tương đương với máy chủ telnet mở với thông tin đăng nhập gốc được phép mà không cần mật khẩu. Nếu bạn thích ssh hơn telnet hoặc nếu bạn muốn có mật khẩu cho tài khoản root của mình, thì bạn phải định cấu hình TLS. Các cổng API docker thường được quét trên internet và bạn sẽ thấy phần mềm độc hại được cài đặt trên máy chủ của mình trong một thời gian ngắn nếu bạn bỏ qua bước cấu hình này.

Chi tiết đầy đủ về cách định cấu hình các khóa TLS cho máy khách và máy chủ có thể được tìm thấy tại: https://docs.docker.com/engine/security/https/


1
Một câu trả lời rất hay sẽ tồn tại trong các bản cập nhật trong tương lai cho dịch vụ docker. Đây là cách đúng đắn để làm điều đó.
Fopedush

2

Nếu bạn không muốn cấu hình lại và khởi động lại trình nền docker của mình, bạn chỉ cần kết nối ổ cắm unix với ổ cắm TCP bằng cách sử dụng ncat(từ nmapgói):

ncat -lknvp 2375 -c "ncat -U /var/run/docker.sock"

Thay thế, bạn có thể sử dụng socat hoặc các công cụ khác .


kinh ngạc! Tôi có thể tải lệnh này trong nền không? khi tôi đóng kết nối thiết bị đầu cuối của mình bị mất
Felix

ah tôi đã tìm thấy nohup&
Felix

0

Có một tài liệu chính thức mô tả cách Cấu hình nơi Docker daemon lắng nghe các kết nối .

systemd vs daemon.json

Định cấu hình Docker để lắng nghe các kết nối bằng cả tệp đơn vị systemd và tệp daemon.json gây ra xung đột ngăn Docker khởi động.

Cấu hình truy cập từ xa với tệp đơn vị systemd

  1. Sử dụng lệnh sudo systemctl chỉnh sửa docker.service để mở tệp ghi đè cho docker.service trong trình soạn thảo văn bản.

  2. Thêm hoặc sửa đổi các dòng sau, thay thế các giá trị của riêng bạn.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. Lưu các tập tin.

  4. Tải lại cấu hình systemctl.

    $ sudo systemctl daemon-reload
    
  5. Khởi động lại Docker.

    $ sudo systemctl restart docker.service
    
  6. Kiểm tra xem liệu thay đổi có được thực hiện hay không bằng cách xem lại đầu ra của netstat để xác nhận dockerd đang lắng nghe trên cổng được định cấu hình.

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

Cấu hình truy cập từ xa với daemon.json

  1. Đặt mảng máy chủ trong /etc/docker/daemon.json để kết nối với ổ cắm UNIX và địa chỉ IP, như sau:

    {
    "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
    

    Định cấu hình Docker để lắng nghe các kết nối bằng cả tệp đơn vị systemd và tệp daemon.json gây ra xung đột ngăn Docker khởi động.

    1. Thêm hoặc sửa đổi các dòng sau, thay thế các giá trị của riêng bạn.

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. Lưu các tập tin.

    3. Tải lại cấu hình systemctl.

      $ sudo systemctl daemon-reload
      
  2. Khởi động lại Docker.

  3. Kiểm tra xem liệu thay đổi có được thực hiện hay không bằng cách xem lại đầu ra của netstat để xác nhận dockerd đang lắng nghe trên cổng được định cấu hình.

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

Máy khách Docker sẽ tôn vinh DOCKER_HOSTbiến môi trường để đặt -Hcờ cho máy khách. Sử dụng một trong các lệnh sau:

$ docker -H tcp://127.0.0.1:2375 ps

hoặc là

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.