Apakah Docker itu mainan atau bukan? Atau apakah itu masih benar?

Hello!

Saya sangat ingin langsung ke topiknya, tetapi akan lebih tepat jika saya menceritakan sedikit tentang cerita saya:

Masuk

Saya seorang programmer dengan pengalaman dalam mengembangkan aplikasi halaman tunggal frontend, scala/java dan nodejs di server.

Untuk waktu yang cukup lama (pastinya beberapa atau tiga tahun), saya berpendapat bahwa Docker adalah manna dari surga dan secara umum merupakan alat yang sangat keren dan tentunya setiap pengembang harus dapat menggunakannya. Oleh karena itu, setiap pengembang harus menginstal Docker di mesin lokal mereka. Bagaimana menurut saya, lihat lowongan yang diposting di hh yang sama. Setiap detiknya berisi penyebutan buruh pelabuhan, dan jika Anda memilikinya, ini akan menjadi keunggulan kompetitif Anda 😉

Dalam perjalanan saya, saya bertemu banyak orang, dengan sikap berbeda terhadap Docker dan ekosistemnya. Beberapa orang mengatakan bahwa ini adalah hal praktis yang menjamin fungsionalitas lintas platform. Yang kedua tidak mengerti kenapa mereka harus dijalankan dalam container dan keuntungan apa yang didapat darinya, yang ketiga tidak peduli sama sekali dan tidak repot (mereka hanya menulis kode dan pulang - saya iri pada mereka, ngomong-ngomong jalan :)

Alasan penggunaan

Mengapa saya menggunakan buruh pelabuhan? Mungkin karena alasan berikut:

  • peluncuran database, 99% aplikasi menggunakannya
  • meluncurkan nginx untuk distribusi frontend dan proksi ke backend
  • anda dapat mengemas aplikasi dalam gambar buruh pelabuhan, dengan cara ini aplikasi saya akan bekerja dimanapun buruh pelabuhan ada, masalah distribusi segera teratasi
  • penemuan layanan di luar kotak, Anda dapat membuat layanan mikro, setiap kontainer (terhubung ke jaringan umum) dapat dengan mudah menjangkau yang lain melalui alias, sangat nyaman
  • Menyenangkan sekali membuat wadah dan “bermain” di dalamnya.

Apa yang selalu saya TIDAK suka tentang buruh pelabuhan:

  • Agar aplikasi saya berfungsi, saya memerlukan Docker sendiri di server. Mengapa saya memerlukan ini jika aplikasi saya berjalan di jre atau nodejs dan lingkungannya sudah ada di server?
  • jika saya ingin menjalankan image (pribadi) yang dibuat secara lokal di server jarak jauh, maka saya memerlukan repositori buruh pelabuhan saya sendiri, saya memerlukan registri untuk berfungsi di suatu tempat dan saya juga perlu mengkonfigurasi https, karena buruh pelabuhan cli hanya berfungsi melalui https. Astaga... tentu saja ada opsi untuk menyimpan gambar secara lokal melalui docker save dan tinggal kirim gambarnya lewat scp.. Tapi itu banyak sekali gerakan badannya. Dan selain itu, ini tampak seperti solusi "penopang" sampai repositori Anda sendiri muncul
  • docker-compose. Itu hanya diperlukan untuk menjalankan container. Itu saja. Dia tidak bisa melakukan hal lain. Docker-compose memiliki banyak versi filenya, sintaksnya sendiri. Betapapun deklaratifnya, saya tidak ingin membaca dokumentasinya. Saya tidak membutuhkannya di tempat lain.
  • ketika bekerja dalam tim, kebanyakan orang menulis Dockerfile dengan sangat tidak benar, tidak mengerti cara cache, menambahkan semua yang mereka butuhkan dan tidak perlu ke gambar, mewarisi dari gambar yang tidak ada di Dockerhub atau repositori pribadi, membuat beberapa docker-compose file dengan database dan tidak ada yang tersisa. Pada saat yang sama, para pengembang dengan bangga menyatakan bahwa Docker itu keren, semuanya bekerja secara lokal untuk mereka, dan bagian HR yang penting menulis dalam lowongan tersebut: “Kami menggunakan Docker dan kami membutuhkan kandidat dengan pengalaman kerja seperti itu.”
  • Saya terus-menerus dihantui oleh pemikiran tentang meningkatkan segala sesuatu di Docker: postgresql, kafka, redis. Sayangnya tidak semuanya berfungsi dalam container, tidak semuanya mudah dikonfigurasi dan dijalankan. Hal ini didukung oleh pengembang pihak ketiga, dan bukan oleh vendor itu sendiri. Dan omong-omong, pertanyaan segera muncul: vendor tidak khawatir tentang mempertahankan produk mereka di Docker, mengapa demikian, mungkin mereka mengetahui sesuatu?
  • Pertanyaan yang selalu muncul tentang kegigihan data container. dan kemudian Anda berpikir, haruskah saya memasang direktori host saja atau membuat volume buruh pelabuhan atau membuat wadah data seperti sekarang deprecated? Jika saya memasang direktori, maka saya perlu memastikan bahwa uid dan gid pengguna dalam wadah cocok dengan id pengguna yang meluncurkan wadah, jika tidak, file yang dibuat oleh wadah akan dibuat dengan hak root. Jika saya menggunakan volume maka data hanya akan dibuat di beberapa /usr/* dan akan ada cerita yang sama dengan uid dan gid seperti pada kasus pertama. Jika Anda meluncurkan komponen pihak ketiga, Anda perlu membaca dokumentasi dan mencari jawaban atas pertanyaan: “di direktori container manakah komponen tersebut menulis file?”

Saya selalu tidak menyukai kenyataan bahwa saya harus terlalu lama mengutak-atik Docker pada tahap awal: Saya menemukan cara meluncurkan container, gambar apa yang akan diluncurkan, membuat Makefile yang berisi alias untuk perintah Docker yang panjang. Saya benci komposisi buruh pelabuhan karena saya tidak ingin mempelajari alat lain di ekosistem buruh pelabuhan. DAN docker-compose up Itu menggangguku, apalagi jika mereka masih bertemu di sana build konstruksi, bukan gambar yang sudah dirangkai. Yang saya inginkan hanyalah membuat produk secara efisien dan cepat. Tapi saya tidak tahu cara menggunakan buruh pelabuhan.

Memperkenalkan Mungkin

Baru-baru ini (tiga bulan lalu), saya bekerja dengan tim DevOps, yang hampir setiap anggotanya memiliki sikap negatif terhadap Docker. Karena alasan:

  • aturan buruh pelabuhan iptables (walaupun Anda dapat menonaktifkannya di daemon.json)
  • buruh pelabuhan bermasalah dan kami tidak akan menjalankannya dalam produksi
  • jika daemon buruh pelabuhan mogok, maka semua kontainer dengan infrastruktur pun ikut mogok
  • tidak perlu buruh pelabuhan
  • mengapa buruh pelabuhan jika ada mesin Ansible dan virtual

Pada pekerjaan yang sama, saya berkenalan dengan alat lain - Ansible. Saya pernah mendengarnya sekali, tetapi saya tidak mencoba menulis buku pedoman saya sendiri. Dan sekarang saya mulai menulis tugas saya dan kemudian visi saya berubah total! Karena saya menyadari: Ansible memiliki modul untuk menjalankan container buruh pelabuhan, pembuatan image, jaringan, dll., dan container dapat dijalankan tidak hanya secara lokal, tetapi juga di server jarak jauh! Kegembiraan saya tidak mengenal batas - saya menemukan alat NORMAL dan membuang file Makefile dan pembuatan buruh pelabuhan saya, mereka digantikan dengan tugas yaml. Kode dikurangi dengan menggunakan konstruksi seperti loop, when, Dll

Docker untuk menjalankan komponen pihak ketiga seperti database

Saya baru-baru ini berkenalan dengan terowongan ssh. Ternyata sangat mudah untuk “meneruskan” port server jarak jauh ke port lokal. Server jarak jauh dapat berupa mesin di cloud atau mesin virtual yang berjalan di VirtualBox. Jika saya atau rekan saya memerlukan database (atau komponen pihak ketiga lainnya), kita cukup memulai server dengan komponen ini dan mematikannya saat server tidak diperlukan. Penerusan port memberikan efek yang sama seperti database yang berjalan di kontainer buruh pelabuhan.

Perintah ini meneruskan port lokal saya ke server jauh yang menjalankan postgresql:

ssh -L 9000:host lokal:5432 [email dilindungi]

Menggunakan server jarak jauh memecahkan masalah pengembangan tim. Server seperti itu dapat digunakan oleh beberapa pengembang sekaligus, mereka tidak perlu bisa mengkonfigurasi postgresql, memahami Docker dan seluk-beluk lainnya. Di server jarak jauh, Anda dapat menginstal database yang sama di Docker itu sendiri, jika sulit untuk menginstal versi tertentu. Yang dibutuhkan pengembang hanyalah menyediakan akses ssh!

Baru-baru ini saya membaca bahwa terowongan SSH adalah fungsi terbatas dari VPN biasa! Anda cukup menginstal OpenVPN atau implementasi VPN lainnya, menyiapkan infrastruktur, dan memberikannya kepada pengembang untuk digunakan. Ini sangat keren!

Untungnya, AWS, GoogleCloud, dan lainnya memberi Anda penggunaan gratis selama satu tahun, jadi gunakanlah! Harganya murah jika Anda mematikannya saat tidak digunakan. Saya selalu bertanya-tanya mengapa saya memerlukan server jarak jauh seperti gcloud, sepertinya saya menemukannya.

Sebagai mesin virtual lokal, Anda dapat menggunakan Alpine yang sama, yang secara aktif digunakan dalam container buruh pelabuhan. Nah, atau beberapa distro ringan lainnya untuk membuat mesin boot lebih cepat.

Intinya: Anda dapat dan harus menjalankan database dan infrastruktur lainnya di server jarak jauh atau di kotak virtual. Saya tidak memerlukan buruh pelabuhan untuk tujuan ini.

Sedikit tentang gambar dan distribusi buruh pelabuhan

saya sudah menulis sebuah artikel yang ingin saya sampaikan bahwa penggunaan gambar buruh pelabuhan tidak memberikan jaminan apa pun. Gambar Docker diperlukan hanya untuk membuat container buruh pelabuhan. Jika Anda mengupgrade ke image buruh pelabuhan, maka Anda mengupgrade untuk menggunakan kontainer buruh pelabuhan dan Anda hanya akan menggunakannya.

Pernahkah Anda melihat di mana pengembang perangkat lunak mem-porting produk mereka hanya dalam gambar buruh pelabuhan?
Hasil dari sebagian besar produk adalah file biner untuk platform tertentu; mereka hanya ditambahkan ke gambar buruh pelabuhan, yang diwarisi dari platform yang diinginkan. Pernahkah Anda bertanya-tanya mengapa ada begitu banyak gambar serupa di dockerhub? Masukkan nginx misalnya, Anda akan melihat 100500 gambar dari orang yang berbeda. Orang-orang ini tidak mengembangkan nginx sendiri, mereka hanya menambahkan nginx resmi ke image buruh pelabuhan mereka dan membumbuinya dengan konfigurasi mereka sendiri untuk kenyamanan peluncuran container.

Secara umum, Anda cukup menyimpannya di tgz, jika seseorang perlu menjalankannya di buruh pelabuhan, biarkan mereka menambahkan tgz ke Dockerfile, mewarisi dari lingkungan yang diinginkan dan membuat roti tambahan yang tidak mengubah aplikasi itu sendiri di tgz. Siapa pun yang membuat image buruh pelabuhan akan mengetahui apa itu tgz dan apa yang dibutuhkannya agar berfungsi. Ini adalah bagaimana saya menggunakan buruh pelabuhan di sini

Intinya: Saya tidak memerlukan registri buruh pelabuhan, saya akan menggunakan semacam S3 atau hanya penyimpanan file seperti google drive/dropbox

buruh pelabuhan di CI

Semua perusahaan tempat saya bekerja serupa. Biasanya mereka adalah toko kelontong. Artinya, mereka memiliki satu aplikasi, satu tumpukan teknologi (mungkin beberapa atau tiga bahasa pemrograman).

Perusahaan-perusahaan ini menggunakan buruh pelabuhan di server mereka tempat proses CI berjalan. Pertanyaan - mengapa Anda perlu membangun proyek dalam wadah buruh pelabuhan di server Anda? Mengapa tidak menyiapkan lingkungan untuk pembangunan saja, misalnya, menulis buku pedoman Ansible yang akan menginstal versi nodejs, php, jdk, menyalin kunci ssh, dll. yang diperlukan ke server tempat pembangunan akan dilakukan?

Sekarang saya mengerti bahwa ini merugikan diri saya sendiri, karena buruh pelabuhan tidak membawa keuntungan apa pun dengan isolasinya. Masalah yang saya temui dengan CI di buruh pelabuhan:

  • sekali lagi Anda memerlukan image buruh pelabuhan untuk dibuat. Anda perlu mencari gambar atau menulis file docker Anda sendiri.
  • 90% Anda perlu meneruskan beberapa kunci ssh, data rahasia yang tidak ingin Anda tulis ke image buruh pelabuhan.
  • wadah dibuat dan mati, semua cache ikut hilang. build berikutnya akan mengunduh ulang semua dependensi proyek, yang memakan waktu dan tidak efektif, dan waktu adalah uang.

Pengembang tidak membangun proyek dalam wadah buruh pelabuhan (saya pernah menjadi penggemarnya, sungguh, saya merasa kasihan pada diri saya sendiri di masa lalu xD). Di java dimungkinkan untuk memiliki beberapa versi dan mengubahnya dengan satu perintah ke yang Anda perlukan sekarang. Di nodejs sama saja, ada nvm.

Keluaran

Saya percaya bahwa buruh pelabuhan adalah alat yang sangat kuat dan fleksibel, inilah kekurangannya (kedengarannya aneh ya). Dengan bantuannya, perusahaan dapat dengan mudah terpikat dan menggunakannya jika diperlukan dan tidak diperlukan. Pengembang meluncurkan container mereka, beberapa lingkungan mereka, lalu semuanya mengalir dengan lancar ke CI dan produksi. Tim DevOps sedang menulis semacam kode untuk menjalankan container ini.

Gunakan buruh pelabuhan hanya pada paling baru tahapan dalam alur kerja Anda, jangan menyeretnya ke dalam proyek di awal. Itu tidak akan menyelesaikan masalah bisnis Anda. Dia hanya akan memindahkan masalah ke level LAIN dan menawarkan solusinya sendiri, Anda akan melakukan pekerjaan ganda.

Kapan buruh pelabuhan dibutuhkan: Saya sampai pada kesimpulan bahwa buruh pelabuhan sangat baik dalam mengoptimalkan proses tertentu, tetapi tidak dalam membangun fungsionalitas dasar

Jika Anda masih memutuskan untuk menggunakan buruh pelabuhan, maka:

  • berhati-hatilah
  • jangan memaksa pengembang untuk menggunakan buruh pelabuhan
  • lokalkan penggunaannya di satu tempat, jangan sebarkan ke seluruh Dockefile dan repositori docker-compose

PS:

Terima kasih telah membaca, saya berharap Anda mengambil keputusan yang transparan dalam urusan Anda dan hari kerja yang produktif!

Sumber: www.habr.com

Tambah komentar