Bagaimana cara mengekspos API buruh pelabuhan melalui TCP?

13

Saya menggunakan portainer dan tidak dapat mengelola titik akhir jarak jauh. Saya mencoba menggunakan baris perintah untuk terhubung ke node docker jarak jauh, tetapi mendapat pesan Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Ya, mereka sedang berlari. Saya telah menambahkan diri saya ke grup buruh pelabuhan dan dapat mengakses buruh pelabuhan dengan SSHing ke node. Namun saya tidak dapat mengakses node buruh pelabuhan dari jarak jauh.

Saya dimodifikasi /etc/defaultuntuk menambah / menghapus komentarDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

Saya juga memodifikasi /etc/init.d/dockerdan /etc/init/docker.confmemasukkan DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Saya me-restart layanan buruh pelabuhan, keluar dan masuk beberapa kali dalam proses, tetapi masih tidak dapat terhubung ke node jarak jauh. Saya bahkan tidak dapat terhubung ke simpul lokal dengan melewatkan IP.

Apa yang saya lewatkan? Konfigurasi apa dalam file apa yang mengekspos API melalui 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:~$

Edit: Menjalankan ps aux | grep -i dockermengembalikan ini -

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
Tuan Loh.
sumber
Apakah 2375 mendengarkan? ss -ntl
jscott
Tidak. Tidak ada yang mendengarkan pada 2375. Dan saya tidak tahu konfigurasi apa yang mempengaruhi file ini. Saya telah memasukkan output ps auxdalam jawaban saya jika itu membantu.
Tuan Loh.
Saya mencoba hal-hal serupa dan mencurigai bahwa file / etc / default / docker, /etc/init/docker.conf dan /etc/init.d/docker diabaikan di Ubuntu 16.04 dengan instalasi docker-ce, adakah yang bisa mengkonfirmasi ? Saya pikir ketika saya menjalankan "service docker status" yang sebenarnya terjadi adalah "systemctl status docker", sistem manajemen lainnya.
chrisinmtown

Jawaban:

21

Saya menemukan solusi berkat posting Ivan Krizsan .

Saya harus mengedit /lib/systemd/system/docker.servicepada sistem Ubuntu 16.04.2 LTS saya untuk memodifikasi baris

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

kemudian

sudo systemctl daemon-reload
sudo systemctl restart docker.service

dan semuanya bekerja :-). Langkah selanjutnya adalah mencari cara untuk melindungi bentuk daemon buruh pelabuhan yang dibajak.

Tuan Loh.
sumber
1
Saya mengkonfirmasi perubahan ini menyebabkan Dockerd mendengarkan permintaan HTTP pada Ubuntu 16.04 dengan docker-ce ver 17.06. Rasanya salah untuk memodifikasi skrip layanan secara langsung.
chrisinmtown
7
Jangan pernah mengedit skrip layanan buruh pelabuhan (atau skrip layanan apa pun) secara langsung. SystemD memiliki fitur pengeditan diferensial bawaan. Gunakan systemctl edit docker.servicedan systemctl akan membuat file baru dengan hasil edit Anda. Ini mencegah pembaruan menghapus perubahan Anda. SystemD akan menggabungkan dua file saat runtime. Dokumen bagus di sini: digitalocean.com/community/tutorials/…
Routhinator
Terima kasih! Ini sangat berguna. Saya terus mendapat peringatan selama pembaruan. Saya akan melihat ini: _)
Lord Loh.
4
Pada Ubuntu Server 18.04, ia bekerja seperti ini:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA
ketika saya menggunakan -H tcp://pengaturan dengan sendirinya, tanpa -H fd://pengaturan, saya tidak bisa mengeluarkan dan perintah klien, misalnya .., info buruh pelabuhan, versi buruh pelabuhan, dll.
Chris F
2

Direktori / etc / default adalah tempat pengelola distribusi meletakkan file konfigurasinya. Jika Anda memasang buruh pelabuhan langsung dari gudang Docker, direktori ini tidak akan digunakan.

Direktori / lib / systemd adalah tempat paket akan menginstal file systemd mereka, dan mereka akan menimpa setiap perubahan yang ada di upgrade. Jika Anda menggunakan ini, perubahan Anda akan hilang.

Untuk membuat perubahan Anda sendiri ke file unit systemd yang bertahan, Anda dapat membuat file unit di /etc/systemd/system/docker.service.d/, misalnya di sini adalah /etc/systemd/system/docker.service standar saya. d / override.conf:

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

Override itu hanya menghapus semua flag baris perintah ke daemon dockerd dari systemd. Setelah selesai, Anda dapat mengganti setiap pengaturan dari /etc/docker/daemon.json yang digunakan oleh buruh pelabuhan, dan tergantung pada pengaturannya, dapat dimuat ulang tanpa memulai ulang daemon. Misalnya, ini contoh /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
}

Untuk keperluan Anda, Anda hanya perlu garis di sana untuk mengatur host.

Salah satu bagian yang sangat penting dari file konfigurasi di atas adalah pengaturan TLS. Jika Anda tidak mengonfigurasi TLS timbal balik antara klien dan server, dan Anda membuka buruh pelabuhan untuk mendengarkan di jaringan, Anda menjalankan yang setara dengan server telnet terbuka dengan login root diizinkan tanpa kata sandi. Jika Anda lebih suka ssh daripada telnet, atau jika Anda lebih suka memiliki kata sandi untuk akun root Anda, maka Anda harus mengonfigurasi TLS. Port API docker sering dipindai di internet, dan Anda akan menemukan malware terinstal di host Anda dalam waktu singkat jika Anda pernah melewatkan langkah konfigurasi ini.

Detail lengkap tentang cara mengkonfigurasi kunci TLS untuk klien dan server dapat ditemukan di: https://docs.docker.com/engine/security/https/

BMitch
sumber
1
Jawaban yang sangat bagus yang akan bertahan pembaruan di masa depan untuk layanan buruh pelabuhan. Ini cara yang tepat untuk melakukannya.
Fopedush
2

Jika Anda tidak ingin mengkonfigurasi ulang dan memulai kembali daemon docker Anda, Anda dapat dengan mudah menjembatani soket unix ke soket TCP menggunakan ncat(dari nmappaket):

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

Sebagai alternatif, Anda bisa menggunakan socat atau alat lain .

eadmaster
sumber
luar biasa! dapatkah saya mengatur perintah ini di latar belakang? ketika saya menutup koneksi terminal saya hilang
Felix
ah saya menemukan nohupdan&
Felix
0

Ada dokumentasi resmi yang menjelaskan cara Mengkonfigurasi tempat daemon Docker mendengarkan koneksi .

systemd vs daemon.json

Mengkonfigurasi Docker untuk mendengarkan koneksi menggunakan file unit systemd dan file daemon.json menyebabkan konflik yang mencegah Docker dari mulai.

Mengkonfigurasi akses jarak jauh dengan file unit systemd

  1. Gunakan perintah sudo systemctl edit docker.service untuk membuka file override untuk docker.service dalam editor teks.

  2. Tambahkan atau modifikasi baris berikut, gantikan nilai Anda sendiri.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. Simpan file.

  4. Muat ulang konfigurasi systemctl.

    $ sudo systemctl daemon-reload
    
  5. Mulai ulang Docker.

    $ sudo systemctl restart docker.service
    
  6. Periksa untuk melihat apakah perubahan itu dihormati dengan meninjau output netstat untuk mengonfirmasi dockerd mendengarkan pada port yang dikonfigurasi.

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

Mengkonfigurasi akses jarak jauh dengan daemon.json

  1. Atur array hosts di /etc/docker/daemon.json untuk terhubung ke soket UNIX dan alamat IP, sebagai berikut:

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

    Mengkonfigurasi Docker untuk mendengarkan koneksi menggunakan file unit systemd dan file daemon.json menyebabkan konflik yang mencegah Docker dari mulai.

    1. Tambahkan atau modifikasi baris berikut, gantikan nilai Anda sendiri.

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. Simpan file.

    3. Muat ulang konfigurasi systemctl.

      $ sudo systemctl daemon-reload
      
  2. Mulai ulang Docker.

  3. Periksa untuk melihat apakah perubahan itu dihormati dengan meninjau output netstat untuk mengonfirmasi dockerd mendengarkan pada port yang dikonfigurasi.

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

Klien Docker akan menghormati DOCKER_HOSTvariabel lingkungan untuk mengatur -Hbendera untuk klien. Gunakan salah satu dari perintah berikut:

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

atau

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
ROY
sumber