ฉันจะเปิดเผย docker API ผ่าน TCP ได้อย่างไร


13

ฉันกำลังใช้ตัวแปลงและไม่สามารถจัดการจุดปลายทางระยะไกลได้ ฉันพยายามใช้บรรทัดคำสั่งในการเชื่อมต่อไปยังต่อมน้ำนักเทียบท่าระยะไกล Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?แต่มีข้อความ

ใช่พวกเขากำลังทำงานอยู่ ฉันได้เพิ่มตัวเองลงในกลุ่มนักเทียบท่าและสามารถเข้าถึงนักเทียบท่าโดย SSHing ไปยังโหนด อย่างไรก็ตามฉันไม่สามารถเข้าถึงโหนดนักเทียบท่าได้จากระยะไกล

ฉันแก้ไข/etc/defaultเพื่อเพิ่ม / ไม่แสดงความคิดเห็น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"

ฉันยังมีการปรับเปลี่ยน/etc/init.d/dockerและจะรวมถึง/etc/init/docker.confDOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

ฉันรีสตาร์ทเซอร์วิสนักเทียบท่าออกจากระบบและเข้าสู่ระบบหลายครั้งในกระบวนการ แต่ก็ยังไม่สามารถเชื่อมต่อกับโหนดระยะไกลได้ ฉันไม่สามารถเชื่อมต่อกับโหนดในเครื่องได้ด้วยการส่งผ่าน IP

ฉันพลาดอะไรไป ไฟล์คอนฟิกูเรชันใดที่เปิดเผย API ผ่าน 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:~$

แก้ไข: วิ่งps aux | grep -i dockerกลับนี้ -

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

2375 ฟังใช่ไหม ss -ntl
jscott

ไม่ไม่มีอะไรฟัง 2375 และฉันไม่สามารถคิดออกว่าการกำหนดค่าในไฟล์ใดที่ส่งผลกระทบต่อ ฉันได้รวมเอาท์พุทของps auxในคำตอบของฉันหากที่ช่วย
ลอร์ดโลห์

ฉันลองสิ่งที่คล้ายกันและสงสัยว่าไฟล์ / etc / default / docker, /etc/init/docker.conf และ /etc/init.d/docker จะถูกละเว้นบน Ubuntu 16.04 เพียงแค่ติดตั้ง docker-ce ทุกคนสามารถยืนยันได้ ? ฉันคิดว่าเมื่อฉันเรียกใช้ "สถานะนักเทียบท่าบริการ" สิ่งที่เกิดขึ้นจริงคือ "systemctl status docker" ซึ่งเป็นระบบการจัดการอื่นทั้งหมด
chrisinmtown

คำตอบ:


22

ผมพบว่าวิธีการแก้ปัญหาต้องขอบคุณโพสต์อีวาน Krizsan ของ

ฉันต้องแก้ไข/lib/systemd/system/docker.serviceระบบ Ubuntu 16.04.2 LTS ของฉันเพื่อแก้ไขบรรทัด

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

แล้วก็

sudo systemctl daemon-reload
sudo systemctl restart docker.service

และทุกอย่างทำงาน :-) ขั้นตอนต่อไปคือการหาวิธีป้องกันฟอร์มดีมอนนักเทียบท่าที่ถูกแย่งชิง


1
ฉันยืนยันการเปลี่ยนแปลงนี้ทำให้ Dockerd ฟังคำขอ HTTP บน Ubuntu 16.04 ด้วย docker-ce ver 17.06 มันรู้สึกผิดที่จะแก้ไขสคริปต์บริการโดยตรง
chrisinmtown

7
อย่าแก้ไขสคริปต์บริการนักเทียบท่า (หรือสคริปต์บริการใด ๆ ) โดยตรง SystemD มีคุณสมบัติการแก้ไขที่แตกต่างกันในตัวการใช้งานsystemctl edit docker.serviceและ systemctl จะสร้างไฟล์ใหม่พร้อมการแก้ไขของคุณ สิ่งนี้จะช่วยป้องกันการอัปเดตไม่ให้ลบการเปลี่ยนแปลงของคุณ SystemD จะผสานสองไฟล์ในขณะทำงาน เอกสารที่ดีที่นี่: digitalocean.com/community/tutorials/…
Routhinator

ขอบคุณ! สิ่งนี้มีประโยชน์มาก ฉันได้รับคำเตือนในระหว่างการอัพเดต ฉันจะตรวจสอบเรื่องนี้: _)
ท่านลอร์ดโล๊ะ

4
บน Ubuntu Server 18.04 ใช้งานได้เช่นนี้:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA

เมื่อฉันใช้การ-H tcp://ตั้งค่าด้วยตัวเองโดยไม่มีการ-H fd://ตั้งค่าฉันไม่สามารถออกคำสั่งและคำสั่งไคลเอนต์เช่น .. ข้อมูลนักเทียบท่ารุ่นนักเทียบท่า ฯลฯ
Chris F

2

ไดเร็กทอรี / etc / default คือตำแหน่งที่ผู้ดูแลการแจกจ่ายวางไฟล์คอนฟิกูเรชันไว้ หากคุณติดตั้ง docker โดยตรงจากที่เก็บข้อมูลของ Docker ไดเรกทอรีนี้จะไม่ถูกใช้

ไดเร็กทอรี / lib / systemd คือตำแหน่งที่แพ็กเกจจะติดตั้งไฟล์ systemd และจะเขียนทับการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นเมื่ออัพเกรด หากคุณใช้สิ่งนี้การเปลี่ยนแปลงของคุณจะหายไป

เพื่อทำการเปลี่ยนแปลงของคุณเองไปยังไฟล์ systemd unit ที่ยังคงอยู่คุณสามารถสร้างไฟล์หน่วยใน /etc/systemd/system/docker.service.d/ เช่นนี่คือ /etc/systemd/system/docker.service มาตรฐานของฉัน d / override.conf:

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

การแทนที่นั้นเพียงยกเลิกการแฟล็กบรรทัดคำสั่งทั้งหมดไปยัง dockerd daemon จาก systemd เมื่อเสร็จแล้วคุณสามารถแทนที่การตั้งค่าทั้งหมดจาก /etc/docker/daemon.json ซึ่งนักเทียบท่าใช้และขึ้นอยู่กับการตั้งค่าที่สามารถโหลดใหม่ได้โดยไม่ต้องเริ่มต้น daemon ใหม่ เช่นนี่คือตัวอย่าง /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
}

เพื่อจุดประสงค์ของคุณคุณจะต้องมีบรรทัดในนั้นเพื่อตั้งค่าโฮสต์

ส่วนสำคัญอย่างหนึ่งของไฟล์ปรับแต่งด้านบนคือการตั้งค่า TLS หากคุณไม่ได้กำหนดค่า TLS ร่วมกันระหว่างไคลเอนต์และเซิร์ฟเวอร์และคุณเปิดตัวเทียบท่าเพื่อฟังบนเครือข่ายคุณกำลังเรียกใช้เซิร์ฟเวอร์ telnet ที่เปิดอยู่เทียบเท่ากับการล็อกอินรูทที่อนุญาตโดยไม่ต้องใช้รหัสผ่าน หากคุณต้องการ ssh ผ่าน telnet หรือหากคุณต้องการรหัสผ่านสำหรับบัญชีรูทของคุณคุณต้องกำหนดค่า TLS พอร์ตนักเทียบท่า API จะถูกสแกนบนอินเทอร์เน็ตเป็นประจำและคุณจะพบมัลแวร์ที่ติดตั้งบนโฮสต์ของคุณในระยะเวลาอันสั้นหากคุณข้ามขั้นตอนการกำหนดค่านี้

รายละเอียดเกี่ยวกับวิธีกำหนดค่าคีย์ TLS สำหรับลูกค้าและเซิร์ฟเวอร์สามารถดูได้ที่: https://docs.docker.com/engine/security/https/


1
คำตอบที่ดีมากที่จะอยู่รอดในอนาคตการปรับปรุงบริการท่าเรือ นี่เป็นวิธีที่ถูกต้องที่จะทำ
Fopedush

2

หากคุณไม่ต้องการกำหนดค่าใหม่และรีสตาร์ท docker daemon ของคุณคุณสามารถเชื่อมต่อซ็อกเก็ตยูนิกซ์กับซ็อกเก็ต TCP โดยใช้ncat(จากnmapแพ็คเกจ):

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

เป็นทางเลือกที่คุณสามารถใช้socat หรือเครื่องมืออื่น


! ที่น่าตื่นตาตื่นใจ ฉันจะคืนคำสั่งนี้เป็นพื้นหลังได้ไหม เมื่อฉันปิดการเชื่อมต่อเทอร์มินัลของฉันหายไป
เฟลิกซ์

อ่าฉันเจอnohupแล้ว&
เฟลิกซ์

0

มีเอกสารที่เป็นทางการจะอธิบายถึงวิธีการกำหนดค่าที่หางฟังภูตสำหรับการเชื่อมต่อ

systemd vs daemon.json

การกำหนดค่า Docker เพื่อฟังการเชื่อมต่อโดยใช้ทั้งไฟล์ systemd unit และไฟล์ daemon.json ทำให้เกิดข้อขัดแย้งที่ป้องกันไม่ให้ Docker เริ่มทำงาน

การกำหนดค่าการเข้าถึงระยะไกลด้วยไฟล์ systemd unit

  1. ใช้คำสั่ง sudo systemctl edit docker.service เพื่อเปิดไฟล์แทนที่สำหรับ docker.service ในเท็กซ์เอดิเตอร์

  2. เพิ่มหรือแก้ไขบรรทัดต่อไปนี้แทนค่าของคุณเอง

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. บันทึกไฟล์

  4. โหลดการกำหนดค่า systemctl ใหม่

    $ sudo systemctl daemon-reload
    
  5. รีสตาร์ท Docker

    $ sudo systemctl restart docker.service
    
  6. ตรวจสอบเพื่อดูว่าการเปลี่ยนแปลงนั้นได้รับเกียรติโดยการตรวจสอบเอาต์พุตของ netstat เพื่อยืนยันว่า dockerd กำลังฟังบนพอร์ตที่กำหนดค่าไว้

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

การกำหนดค่าการเข้าถึงระยะไกลด้วย daemon.json

  1. ตั้งค่าโฮสต์อาเรย์ใน /etc/docker/daemon.json เพื่อเชื่อมต่อกับซ็อกเก็ต UNIX และที่อยู่ IP ดังต่อไปนี้:

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

    การกำหนดค่า Docker เพื่อฟังการเชื่อมต่อโดยใช้ทั้งไฟล์ systemd unit และไฟล์ daemon.json ทำให้เกิดข้อขัดแย้งที่ป้องกันไม่ให้ Docker เริ่มทำงาน

    1. เพิ่มหรือแก้ไขบรรทัดต่อไปนี้แทนค่าของคุณเอง

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. บันทึกไฟล์

    3. โหลดการกำหนดค่า systemctl ใหม่

      $ sudo systemctl daemon-reload
      
  2. รีสตาร์ท Docker

  3. ตรวจสอบเพื่อดูว่าการเปลี่ยนแปลงนั้นได้รับเกียรติโดยการตรวจสอบเอาต์พุตของ netstat เพื่อยืนยันว่า dockerd กำลังฟังบนพอร์ตที่กำหนดค่าไว้

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

ไคลเอ็นต์ Docker จะเคารพDOCKER_HOSTตัวแปรสภาพแวดล้อมเพื่อตั้งค่า-Hสถานะสำหรับไคลเอ็นต์ ใช้หนึ่งในคำสั่งต่อไปนี้:

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

หรือ

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.