GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Cara Mengatur Akses Jarak Jauh ke Docker Daemon [Panduan Lengkap]

Saya telah menulis secara rinci tentang cara SSH ke dalam wadah buruh pelabuhan. Tutorial ini membawa konsep yang sama ke level lain dengan mengaktifkan akses jarak jauh ke Docker.

Dengan akses jarak jauh buruh pelabuhan, setiap kali Anda menjalankan perintah buruh pelabuhan di host lokal Anda, efeknya terjadi di server jauh.

Biar saya jelaskan secara detail.

Apa itu akses jarak jauh Docker?

Sebelum Anda masuk ke pengaturan, izinkan saya mengingat cara kerja buruh pelabuhan.

Docker bekerja dalam sesuatu yang disebut arsitektur client-server. Komponen utama yang menangani semua kontainer, volume, jaringan, dll. adalah daemon buruh pelabuhan yang berjalan di latar belakang.

docker perintah tidak lain adalah aplikasi klien. Klien dan daemon berkomunikasi melalui API buruh pelabuhan melalui soket Unix tradisional yang dapat Anda temukan di /run/docker.sock atau /var/run/docker.sock . Klien meminta daemon untuk melakukan sesuatu, atau mengambil informasi, dan daemon melakukan hal itu.

Bagaimana ini menarik minat Anda? Karena protokol komunikasi yang digunakan antara klien buruh pelabuhan dan server adalah HTTP biasa, Anda seharusnya dapat mengirim permintaan ke server dari jarak jauh, jika Anda dapat membuat daemon mendengarkan permintaan HTTP di port alih-alih soket UNIX lokal.

Ternyata, Anda benar-benar bisa melakukannya. Daemon memang dapat mendengarkan tidak hanya pada soket UNIX tetapi juga pada port TCP. Seolah itu belum cukup, dimulai dengan buruh pelabuhan versi 18.09, Anda bahkan dapat menggunakan SSH untuk protokol komunikasi.

Dalam tutorial ini, saya akan memandu Anda melalui seluruh proses tentang bagaimana Anda dapat mengonfigurasi host dan server jarak jauh, sehingga Anda dapat menggunakan docker perintah dari satu host dan menjalankannya di host lain, tanpa harus melakukan SSH ke server jauh.

Manfaat menggunakan akses buruh pelabuhan jarak jauh

Masih bertanya-tanya tentang manfaat dari pendekatan ini? Berikut adalah beberapa di antaranya:

  • Tidak perlu masuk ke server untuk memulai atau menghentikan layanan. Semua bisa dilakukan dari jarak jauh.
  • Banyak alat pemantau, seperti Portainer, memerlukan akses ke titik akhir Docker API untuk memantau detail seperti jaringan, menjalankan wadah, dll. Biasanya untuk menambahkan server ke daftar titik akhir, Anda harus menerapkan agen Portainer di server pertama dan ikat beberapa port dari wadah ke Host. Sebagai gantinya, Anda bisa membiarkannya mengakses daemon buruh pelabuhan secara langsung, ini akan menghemat banyak sumber daya Anda.
  • Anda dapat menulis berbagai skrip otomatisasi langsung di komputer lokal Anda untuk mengontrol/mengelola satu atau beberapa server buruh pelabuhan jarak jauh. Karena Anda tidak perlu SSH ke server jauh, tidak perlu mempertahankan koneksi yang stabil. Ini bisa menjadi pilihan yang baik jika Anda memiliki koneksi internet yang tidak stabil atau lambat.
  • Jika sistem lokal Anda tidak cukup kuat untuk menjalankan container, atau mengatakan Anda tidak memiliki cukup penyimpanan, Anda dapat menggunakan server jarak jauh untuk host buruh pelabuhan Anda, dan mengontrolnya dari jarak jauh melalui port TCP atau SSH.
  • Memperluas poin sebelumnya, server di cloud saat ini sangat skalabel. Selama Anda setuju dengan biayanya, Anda dapat menskalakan host buruh pelabuhan sebanyak yang diperlukan tanpa harus khawatir membeli SSD atau HDD yang lebih baru (jika Anda masih menggunakannya).

Keuntungannya sendiri dapat ditingkatkan atau diturunkan, tergantung pada apakah orang yang bersangkutan benar-benar membutuhkannya atau tidak. Jika tidak, tidak apa-apa. Tetapi jika Anda melakukannya, Anda berada di tempat yang tepat.

Apakah akses jarak jauh Docker aman?

Teman-teman di buruh pelabuhan sudah mempertimbangkan ini. Menggunakan SSH untuk protokol di antara, ini seaman sesi SSH Anda. Lebih lanjut tentang ini di bagian selanjutnya dari tutorial ini.

Jika Anda tidak tertarik menggunakan SSH, mengekspos API melalui port publik, tanpa autentikasi apa pun, bukanlah ide terbaik saat ini, bukan?

Itu sebabnya kami memiliki otentikasi TLS. Kecuali orang lain telah mendapatkan sertifikat yang ditandatangani oleh CA Anda (bersama dengan sertifikat CA), dia seharusnya tidak dapat membahayakan Anda.

Diagram berikut menjelaskan hal ini:

Saya pertama akan berbicara tentang bagaimana Anda dapat mengkonfigurasi server lokal dan remote Anda untuk setup ini, dengan SSH. Ini jauh lebih mudah dan saya sarankan Anda menggunakan rute ini jika metode lain tampaknya agak sulit bagi Anda.

Apa yang Anda perlukan untuk penyiapan ini?

Sebelum melangkah maju, Anda memerlukan beberapa hal, beberapa wajib, beberapa opsional.

  • Karena ini sudah cukup jelas, Anda memerlukan server di cloud, saya pribadi merekomendasikan Linode.
  • Docker harus diinstal pada server jarak jauh ini. Anda dapat merujuk ke panduan kami tentang menginstal Docker di Ubuntu dan CentOS.
  • Opsional, beberapa pengetahuan tentang openssl mungkin bermanfaat jika Anda berencana menggunakan metode port TCP.
  • Akses ke server melalui otentikasi kunci publik SSH.

Metode 1:Siapkan akses Docker jarak jauh menggunakan SSH

Salah satu hal terbaik tentang menggunakan SSH di sini adalah membutuhkan lebih sedikit pekerjaan daripada metode lainnya. Jika Anda sudah menyiapkan kunci SSH, ini benar-benar proses satu langkah.

Sebelum melangkah maju, saya ingin Anda memiliki gambaran mental ini, untuk memahami cara kerja metode SSH ini, dan mengapa metode ini dikonfigurasi dengan cara yang dikonfigurasi.

Saat menggunakan protokol SSH untuk akses buruh pelabuhan jarak jauh, yang terjadi adalah klien buruh pelabuhan benar-benar menjalankan perintah ssh pada host lokal, dengan perintah buruh pelabuhan tersembunyi (dial-stdio sistem buruh pelabuhan) pada host jarak jauh, yang membuat koneksi ke remote dockerd endpoint yang hampir selalu /var/run/docker.sock, dan meneruskan koneksi ke perintah stdio.

Untuk mengkonfirmasi pernyataan di atas, jalankan docker perintah di akhir bagian ini (saat pengujian) dengan -l debug bendera. Ini akan mencetak perintah persis yang sedang dieksekusi pada mesin lokal Anda.

Prasyarat

Prasyarat untuk konfigurasi ini adalah sebagai berikut:

1. Otentikasi kunci publik SSH

Anda harus mengaktifkan otentikasi kunci publik SSH di antara mesin yang berpartisipasi. Berikut ringkasan singkat tentang cara melakukannya,

  1. Gunakan perintah ssh-keygen untuk menghasilkan pasangan kunci publik dan pribadi.
  2. Gunakan ssh-copy-id [email protected] perintah untuk menyalin kunci publik ke server jauh.
  3. Pastikan PubKeyAuthentication disetel ke yes dalam file konfigurasi SSHD jarak jauh. Selain itu, saya sarankan untuk menonaktifkan otentikasi kata sandi (set PasswordAuthentication untuk no ).
Cara Menambahkan Kunci Publik SSH ke ServerOtentikasi kunci publik memungkinkan Anda mengakses server melalui SSH tanpa kata sandi. Berikut adalah dua metode untuk menyalin kunci ssh publik ke server. Buku Pegangan LinuxAbhishek Prakash

2. Pengguna login harus dalam grup buruh pelabuhan

Karena secara efektif Anda masuk sebagai beberapa pengguna, dan meminta docker server beberapa informasi atau untuk melakukan sesuatu, pengguna jarak jauh (yang Anda masuki sebagai) harus memiliki izin yang cukup untuk mengirim permintaan melalui "DOCKER_HOST lokal" jarak jauh (yang seperti yang dinyatakan sebelumnya, sebagian besar /var/run/docker.sock ). Anda dapat memiliki izin itu dengan menambahkan pengguna jarak jauh itu ke docker grup.

Yang saya maksud dengan "DOCKER_HOST lokal jarak jauh" adalah DOCKER_HOST lokal dari server jarak jauh.

Ini bisa mematikan bagi banyak orang seperti saya, karena saya pribadi tidak suka menggunakan docker grup untuk sudo -kurang eksekusi.

Anda dapat menggunakan perintah usermod untuk menambahkan pengguna yang ada ke docker grup.

sudo usermod -aG docker [username]

Perubahan konfigurasi pada sistem lokal Anda

Berikut adalah hal-hal yang perlu Anda ubah pada sistem pribadi lokal Anda dari mana Anda akan mengontrol server buruh pelabuhan.

1. Ubah DOCKER_HOST di sistem lokal Anda

Percaya atau tidak, hanya ada satu hal yang harus dilakukan di sini. Setel variabel lingkungan DOCKER_HOST ke kombinasi yang benar dari nama pengguna jarak jauh, IP server dan port sshd sedang berjalan. Seperti ini:

DOCKER_HOST=ssh://[email protected]:22

Atau, Anda juga dapat menggunakan -H tandai seperti yang telah saya lakukan di sini dengan docker perintah

docker -H ssh://[email protected] info

Anda dapat menambahkan alias di Linux seperti ini:

alias docker="docker -H ssh://[email protected]:22"

Uji konfigurasi

Tidak masalah metode mana yang Anda pilih (variabel lingkungan atau alias), menguji ini hanya masalah menjalankan perintah buruh pelabuhan sederhana seperti docker info .

Coba juga jalankan docker -l debug info dan perhatikan perintah yang dijalankan.

Metode 2:Menggunakan port TCP publik dengan otentikasi TLS

Cara ini lebih rumit dari cara sebelumnya, namun memiliki kelebihan seperti tidak harus menggunakan docker grup sama sekali.

Idenya di sini sederhana, Anda akan membuat sertifikat dan kunci pribadi Anda sendiri, lalu menggunakan port TCP untuk mengakses docker daemon melalui bukan HTTP biasa, tetapi saluran HTTPS yang aman.

Ini analog dengan situs web. Dalam kasus situs web, Anda mengonfigurasinya dengan server web untuk menggunakan kunci dan sertifikat yang berbeda, yang kemudian dikonfirmasi oleh browser bahwa mereka valid dan diverifikasi oleh beberapa organisasi tepercaya (seperti Let's Encrypt atau DigiCert). Setelah verifikasi selesai, permintaan HTTP terenkripsi dikirim ke server web untuk mendapatkan data yang diperlukan.

Demikian pula, di sini alih-alih server web tradisional, Anda akan mengonfigurasi docker server daemon untuk menggunakan sertifikat dan kunci pribadi tertentu. Oleh karena itu, setiap kali seseorang akan mengirim permintaan ke server daemon, langkah pertama adalah memastikan bahwa peserta dapat dipercaya, selama klien memiliki sertifikat CA yang sama dan sertifikat ditandatangani oleh CA tersebut, koneksi akan dibuat. dan klien akan dapat mengirim permintaan [terenkripsi] ke server.

Menyiapkan sertifikat dan kunci

Dalam langkah-langkah berikut, Anda akan membuat sertifikat dan kunci pribadi untuk server dan klien Anda.

Otoritas Sertifikat

Untuk mempermudah transaksi, saya akan menggunakan mesin klien saya untuk menghasilkan semua file. Anda dapat menggunakan mesin terpisah untuk itu jika perlu. Sertifikat CA tidak lain adalah sertifikat yang ditandatangani sendiri.

Tetapi pertama-tama, Anda perlu membuat kunci pribadi CA Anda. Gunakan perintah berikut untuk melakukannya

openssl genrsa -aes256 -out ca-key.pem 4096

Mari kita uraikan perintahnya:

  • genrsa :Opsi ini memberitahu openssl untuk menghasilkan kunci pribadi berdasarkan algoritme RSA.
  • -aes256 :Ini mengenkripsi kunci pribadi dengan frasa sandi yang disediakan pengguna, menggunakan AES 256 bit. AES hanyalah sebuah teknik enkripsi (Standar Enkripsi Lanjutan).
  • -keluar :Menentukan nama file keluaran.
  • Akhirnya, saya memasukkan panjang kunci (dalam bit).

Berikan frasa sandi untuk mengamankan kunci. Selanjutnya, Anda akan membuat sertifikat untuk CA Anda, yang akan ditandatangani dengan kunci yang baru saja Anda buat. Buat itu menggunakan perintah berikut:

openssl req -x509 -new -key ca-key.pem -days 365 -subj '/CN=CertificateAuthority' -out ca-cert.pem

Bagi banyak orang, ini mungkin tampak seperti misteri, seperti apa sebenarnya yang dilakukannya? Baiklah, izinkan saya menguraikannya untuk Anda:

  • permintaan :Opsi ini digunakan terutama untuk membuat CSR. Di sini kami menggunakannya untuk membuat sertifikat yang ditandatangani sendiri.
  • -x509 :Ini memberitahu openssl untuk membuat sertifikat yang ditandatangani, bukan CSR.
  • baru :Ini membuat permintaan sertifikat baru, dan menanyakan nilai bidang yang relevan kepada pengguna.
  • -kunci :Kunci yang akan digunakan.
  • -hari :Validitas sertifikat dalam beberapa hari.
  • -subj :Alih-alih dimintai setiap detail, kami menetapkan nilai bidang yang relevan secara langsung dengan opsi ini. Saya telah menetapkan Nama Umum di sini saja. Anda dapat menghilangkan tanda ini, dan Anda akan ditanyai setiap detailnya.
  • -keluar :Nama file keluaran.

Berikan frasa sandi untuk kunci saat diminta.

Server buruh pelabuhan

Selanjutnya, Anda perlu membuat sertifikat dan kunci pribadi server Anda.

Untuk ini, Anda akan membuat CSR terlebih dahulu, Permintaan Penandatanganan Sertifikat, dan kemudian akan ditandatangani oleh CA. Buat kunci pribadi terlebih dahulu:

openssl genrsa -out server-key.pem 2048

Sintaksnya sama seperti yang Anda gunakan sebelumnya, dengan pengecualian. Satu, tidak mengenkripsi kunci kali ini. Karena program lain perlu membaca file ini tanpa pengawasan, jika dienkripsi, Anda akan menghadapi beberapa kesalahan. Dua, panjang kuncinya adalah 256 byte di sini. Saya memilih kunci yang lebih panjang untuk CA. Anda juga dapat menggunakan panjang yang sama untuk yang satu ini, ini untuk menunjukkan kepada Anda berbagai opsi yang tersedia yang Anda inginkan.

Selanjutnya buat CSR:

openssl req -new -key server-key.pem -subj '/CN=docker-host' -out server.csr
Edit /etc/hosts file, dan tambahkan IP host Docker dengan nama host konstan. Anda harus menambahkan ini ke semua klien Anda yang ingin mengakses host ini. Jika host ini memiliki FQDN yang ditetapkan ke IP-nya, Anda dapat menggunakannya sebagai gantinya. FQDN, Fully Qualified Domain Name adalah nama domain yang dikaitkan dengan IP Anda di server DNS. Ini bukan nama host lokal Anda. FQDN diselesaikan ke IP Anda tidak hanya di LAN Anda tetapi di mana saja di seluruh dunia selama itu bagian dari catatan DNS publik dan resolver menggunakan server DNS itu.

Benderanya sama seperti yang Anda gunakan saat membuat sertifikat CA Anda. Di sini saya tidak memiliki -x509 flag, karena ini bukan sertifikat yang ditandatangani sendiri, CA Anda akan menandatangani yang ini. Oleh karena itu, tanda tangani,

openssl x509 -req -days 365 -in server.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile <(echo "extendedKeyUsage = serverAuth") -out server-cert.pem
  • x509 :Opsi ini digunakan untuk menandatangani CSR.
  • -req :Opsi ini ada untuk openssl mengharapkan CSR.
  • -di :Melewati file CSR.
  • Opsi -CA , -CAkey mengambil sertifikat CA dan kunci CA masing-masing sebagai argumen.
  • -CAcreateserial :Dengan opsi ini, openssl membuat file nomor seri CA jika belum ada.
  • -extfile :Melewati file yang berisi ekstensi sertifikat untuk digunakan. Di sini saya telah menggunakan extendedKeyUsage ekstensi.

Sekarang Anda harus memiliki sertifikat server yang ditandatangani CA server-cert.pem dan kunci pribadi server server-key.pem .

Klien buruh pelabuhan

Sekarang Anda perlu mengatur klien buruh pelabuhan Anda. Prosesnya agak sama seperti sebelumnya. Buat kunci pribadi> buat CSR> tanda tangani CSR itu dengan CA Anda.

Untuk kejelasan, saya masih akan mendokumentasikannya di sini. Buat kunci pribadi:

openssl genrsa -out client-key.pem 2048   

Selanjutnya, buat CSR:

openssl req -new -key client-key.pem -subj '/CN=docker-client' -out client.csr

Di sini, masukkan nama host klien Anda untuk nilai CN. Terakhir, tandatangani CSR:

openssl x509 -req -days 365 -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile <(echo "extendedKeyUsage = clientAuth") -out client-cert.pem

Di sini satu-satunya perbedaan adalah nilai ekstensi "penggunaan kunci yang diperpanjang". Saya memiliki clientAuth bukannya serverAuth . Masukkan frasa sandi Anda saat diminta.

Menyiapkan lingkungan

Setelah sertifikat dan kunci pribadi siap, Anda perlu memberi tahu mesin buruh pelabuhan dan klien Anda tentang mereka, bersama dengan mengekspos API mesin ke port TCP publik dan membiarkan klien menggunakan mesin buruh pelabuhan yang tidak ada di mesin lokal.

Langkah-langkah berikut ini persis seperti itu.

Host buruh pelabuhan

Pertama, salin lebih dari tiga file dari mesin administrator, sertifikat CA (ca-cert.pem ), kunci pribadi host ini (server-key.pem ) dan sertifikat yang ditandatangani CA (server-cert.pem ). Buat direktori /etc/docker/certs untuk menyimpan file-file ini.

sudo mkdir /etc/docker/certs

Selanjutnya, buka file konfigurasi daemon, dan tambahkan berikut ini (Anda akan menemukan konfigurasi di /etc/docker/daemon.json ):

{
    "tlsverify": true,
    "tlscacert": "/etc/docker/certs/ca-cert.pem",
    "tlscert": "/etc/docker/certs/server-cert.pem",
    "tlskey": "/etc/docker/certs/server-key.pem",
    "host": "tcp://0.0.0.0:2376"
}

Opsi terakhir memberi tahu daemon untuk mendengarkan port TCP 2376. Simpan file dan mulai ulang buruh pelabuhan.

sudo systemctl restart docker
Sementara tim di belakang docker merekomendasikan menggunakan port 2376 untuk ini, secara teoritis Anda dapat menggunakan port lain yang tidak digunakan/tidak dilindungi undang-undang.

Klien

Sisi klien bisa dibilang lebih mudah diatur. Buat direktori ~/.docker :

mkdir ~/.docker

Di dalam direktori itu, tempatkan tiga file, dengan penamaan yang benar, seperti di bawah ini (Nama yang kita gunakan sebelumnya selama artikel ini ditempatkan di dalam tanda kurung itu)

  • ca.pem :Sertifikat CA (ca-cert.pem ).
  • key.pem :Kunci pribadi klien (client-key.pem ).
  • cert.pem :Sertifikat klien (client-cert.pem ).

Selanjutnya, siapkan dua variabel lingkungan

  • DOCKER_HOST Setel nilai variabel ini ke tcp://docker-host:2376 . Gunakan nama host yang Anda atur di /etc/hosts file untuk host/ip yang sesuai.
  • DOCKER_TLS_VERIFY Setel ini ke 1.

Anda dapat menggunakan ~/.bashrc untuk mengkonfigurasi ini secara otomatis. Gunakan perintah ekspor untuk menyetel variabel berikut:

export DOCKER_HOST=tcp://docker-host:2376
export DOCKER_TLS_VERIFY=1
Sekali lagi, untuk nama host, gunakan nilai yang sesuai dari /etc/hosts . Jika Anda memiliki FQDN untuk IP ini, gunakan itu sebagai gantinya.

Uji penyiapan

Sekarang setelah semuanya selesai, Anda dapat mengujinya dengan menjalankan docker info , atau jalankan wadah acak apa pun, mana pun yang terlintas dalam pikiran Anda. Anda juga dapat menggunakan curl untuk mengujinya (Ingat? Ini adalah permintaan HTTP sederhana). Gunakan yang berikut ini sebagai alternatif untuk docker info

curl https://docker-host:2376/info --cert ~/.docker/cert.pem --key ~/.docker/key.pem --cacert ~/.docker/ca.pem

Ini akan menampilkan objek JSON yang dapat Anda parsing menggunakan sesuatu seperti jq . Anda juga dapat mencoba dan menjalankan server Nginx dengan buruh pelabuhan, dan melihat sistem mana yang menjalankannya. Karena secara visual sepertinya buruh pelabuhan berjalan di sistem lokal Anda, ini adalah contoh/pengujian utama yang dapat Anda lakukan. Cukup jalankan

docker run -d --rm --name remote_nginx -p 8080:80 nginx:latest

Sekarang, gunakan curl untuk memeriksa localhost dan IP jarak jauh. Host lokal pertama,

curl http://localhost:8080

Anda akan melihat output seperti ini

curl: (7) Failed to connect to localhost port 8080: Connection refused

Sekarang coba hal yang sama dengan IP jarak jauh,

curl http://docker-host:8080

Anda akan melihat situs template nginx di sana. Anda juga dapat menggunakan browser untuk menjelajahi lokasi tersebut, localhost, dan remote host.

Metode mana yang digunakan? TCP atau SSH?

Kedua metode tersebut memiliki kelebihannya masing-masing. Metode SSH lebih mudah jika Anda tidak ingin melewati banyak rintangan. Tetapi beberapa aplikasi seperti Portainer tidak akan bekerja dengan metode SSH untuk akses daemon jarak jauh. Menggunakan metode TCP juga menghilangkan masalah "menggunakan atau tidak menggunakan grup buruh pelabuhan" secara default. Pilih metode mana yang memenuhi tujuan Anda.

Semoga tutorial ini bermanfaat dan informatif. Jika Anda memiliki pertanyaan, beri tahu saya di komentar di bawah.


Docker
  1. Cara Menjaga Kontainer Docker Tetap Berjalan Saat Daemon Berhenti

  2. Bagaimana dan Mengapa Menggunakan Host Docker Jarak Jauh

  3. Cara Menilai Keamanan Mesin Docker

  1. Cara mengatur OpenCL untuk GPU di Linux dan Docker [Panduan Lengkap]

  2. Cara Mengatur Akses Jarak Jauh ke Docker Daemon

  3. Cara mengatur Docker dalam Sistem Windows untuk Linux (WSL2) di Windows 10

  1. Cara menggunakan kemampuan akses jarak jauh Kotak GNOME

  2. Cara Mengatur VPN Akses Jarak Jauh Bare Metal Cloud

  3. Cara Mengakses Namespace Jaringan Docker Container dari Host