Bagaimana cara mengekspos docker API melalui TCP?

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 docker dan dapat mengakses docker dengan masuk ke node. Namun saya tidak dapat mengakses node docker dari jarak jauh.

Saya memodifikasi /etc/default untuk menambah / menghapus komentar 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"

Saya juga memodifikasi /etc/init.d/docker dan /etc/init/docker.conf untuk memasukkan DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Saya memulai ulang 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 node lokal dengan meneruskan IP.

Apa yang saya lewatkan? Konfigurasi apa dalam file apa yang mengekspos API melalui TCP?

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 infoCannot 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 infoCannot 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 infoCannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?user@hostname:~$

Edit:Berlari ps aux | grep -i docker mengembalikan 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

Saya menemukan solusi berkat Pos Ivan Krizsan.

Saya harus mengedit /lib/systemd/system/docker.service pada 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-reloadsudo systemctl restart docker.service

dan semuanya bekerja : -). Langkah selanjutnya adalah mencari cara untuk melindungi formulir daemon docker yang dibajak.

Direktori / etc / default adalah tempat pengelola distribusi meletakkan file konfigurasi mereka. Jika Anda menginstal docker langsung dari repositori Docker, direktori ini tidak akan digunakan.

Direktori / lib / systemd adalah tempat paket akan menginstal file systemd mereka, dan mereka akan menimpa perubahan apa pun di sana saat peningkatan. 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.layanan.d/, misalnya di sini adalah standar saya /etc/systemd/system/docker.layanan.d / override.conf:

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

Penggantian itu hanya mereset semua flag baris perintah ke daemon dockerd dari systemd. Setelah selesai, Anda dapat mengganti setiap Pengaturan dari / etc/docker / daemon.json yang digunakan oleh docker, dan tergantung pada pengaturannya, dapat dimuat ulang tanpa memulai ulang daemon. Misalnya berikut adalah 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 tujuan 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 mengkonfigurasi TLS bersama antara klien dan server, dan Anda membuka docker untuk mendengarkan di jaringan, Anda menjalankan 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 docker api sering dipindai di internet, dan Anda akan menemukan malware yang diinstal pada host Anda dalam waktu singkat jika anda melewatkan langkah konfigurasi ini.

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


Perhatikan bahwa dengan docker versi 18.09 ke atas pada klien (baik di mana Anda menjalankan perintah dan node jarak jauh), Anda dapat menggunakan ssh alih-alih mengonfigurasi TLS. Ini melibatkan penggunaan DOCKER_HOST nilai ssh://user@host. Misalnya.

docker -H ssh://user@host container ls

Ada dokumentasi resmi menjelaskan bagaimana Konfigurasikan di mana Daemon Docker mendengarkan koneksi.

systemd vs daemon.json

Mengkonfigurasi Docker untuk mendengarkan koneksi menggunakan file Unit systemd dan daemon.file json menyebabkan konflik yang mencegah Docker memulai.

Mengkonfigurasi akses jarak jauh dengan file Unit systemd

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

  2. Tambahkan atau modifikasi baris berikut, ganti 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 Buruh Pelabuhan.

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

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

Konfigurasi akses remote dengan daemon.json

  1. Mengatur array host 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 daemon.file json menyebabkan konflik yang mencegah Docker memulai.

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

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

    3. Muat ulang konfigurasi systemctl.

      $ sudo systemctl daemon-reload
  2. Mulai Ulang Buruh Pelabuhan.

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

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

Klien Docker akan menghormati DOCKER_HOST variabel lingkungan untuk mengatur -H bendera untuk klien. Gunakan salah satu perintah berikut:

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

atau

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

Jika Anda tidak ingin mengkonfigurasi ulang dan me-restart daemon docker Anda, Anda cukup menjembatani soket unix ke soket TCP menggunakan ncat (dari nmap paket):

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

Sebagai alternatif, Anda dapat menggunakan socat atau alat lainnya.

Bagi mereka yang mencari jawaban ini dalam konteks Ubuntu server 20.04 yang menggunakan SNAP:

Komentar ini masalah github harus memberi Anda konteks yang Anda butuhkan. Dalam kasus saya, saya tidak menemukan set variabel lingkungan $SNAP_DATA, jadi saya harus mencari semua daemon.json file pada sistem dan digunakan satu dengan /var prefiks

$ sudo find / -name daemon.json

Dalam kasus saya itu memiliki dua entri yang tidak terkait jadi saya hanya menambahkan milik saya:

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

IP di atas menentukan dari mana ia akan dapat diakses, dan port dapat berupa port apa pun yang ingin Anda ekspos. Dalam kasus khusus saya, saya tidak dapat membuatnya bekerja dengan IP tertentu, sebagai gantinya saya harus menggunakan 0.0.0.0, jika tidak maka akan gagal dengan kesalahan berikut saat memulai ulang:

aufs aufs_fill_super:918:mount[3724]: no argoverlayfs: missing 'lowerdir'aufs aufs_fill_super:918:mount[3772]: no argoverlayfs: missing 'lowerdir'aufs aufs_fill_super:918:mount[3820]: no argoverlayfs: missing 'lowerdir'

Cukup aneh, saat menggunakan 0.0.0.0 itu sebenarnya meludahkan satu Pasang garis kesalahan di atas tetapi berhasil setelahnya. Dalam kasus saya karena ini adalah VM, ini dapat diterima untuk saya.

Saya mencoba hal serupa dan menduga bahwa file /etc/default/docker, /etc/init/docker.conf dan / etc / init.d / docker diabaikan begitu saja di Ubuntu 16.04 dengan instalasi docker-ce, adakah yang bisa mengonfirmasi? Saya pikir ketika saya menjalankan" service docker status “yang sebenarnya terjadi adalah” systemctl status docker", seluruh sistem manajemen lainnya.

Apakah 2375 mendengarkan? `ss-ntl’

Tidak. Tidak ada yang mendengarkan pada 2375. Dan saya tidak tahu konfigurasi apa dalam file apa yang Memengaruhi ini. Saya telah menyertakan output ‘ps aux’ dalam jawaban saya jika itu membantu.