Adakah Docker mainan atau tidak? Atau adakah ia masih benar?

Hello!

Saya benar-benar ingin terus ke topik, tetapi lebih tepat untuk menceritakan sedikit tentang kisah saya:

Entry

Saya seorang pengaturcara yang berpengalaman dalam membangunkan aplikasi halaman tunggal bahagian hadapan, scala/java dan nodejs pada pelayan.

Untuk masa yang agak lama (pasti beberapa atau tiga tahun), saya berpendapat bahawa Docker adalah manna dari syurga dan secara amnya alat yang sangat keren dan pasti setiap pembangun harus dapat menggunakannya. Dan daripada ini, setiap pembangun harus memasang Docker pada mesin tempatan mereka. Bagaimana pula dengan pendapat saya, lihatlah kekosongan jawatan yang disiarkan di hh yang sama. Setiap detik mengandungi sebutan tentang docker, dan jika anda memilikinya, ini akan menjadi kelebihan daya saing anda πŸ˜‰

Dalam perjalanan saya, saya bertemu dengan ramai orang, dengan sikap berbeza mereka terhadap Docker dan ekosistemnya. Ada yang mengatakan bahawa ini adalah perkara yang mudah yang menjamin kefungsian merentas platform. Yang kedua tidak faham mengapa mereka harus berlari dalam bekas dan apa keuntungan yang akan diperoleh daripadanya, yang ketiga tidak peduli sama sekali dan tidak peduli (mereka hanya menulis kod dan pulang ke rumah - Saya iri dengan mereka, oleh cara :)

Sebab penggunaan

Mengapa saya menggunakan buruh pelabuhan? Mungkin atas sebab-sebab berikut:

  • pelancaran pangkalan data, 99% daripada aplikasi menggunakannya
  • melancarkan nginx untuk pengedaran frontend dan proksi ke backend
  • anda boleh membungkus aplikasi dalam imej docker, dengan cara ini aplikasi saya akan berfungsi di mana sahaja docker wujud, masalah pengedaran diselesaikan dengan segera
  • penemuan perkhidmatan di luar kotak, anda boleh mencipta perkhidmatan mikro, setiap bekas (disambungkan ke rangkaian biasa) boleh menghubungi yang lain dengan mudah melalui alias, sangat mudah
  • Seronok untuk mencipta bekas dan "bermain" di dalamnya.

Perkara yang saya selalu TIDAK suka tentang docker:

  • Untuk aplikasi saya berfungsi, saya memerlukan Docker sendiri pada pelayan. Mengapa saya memerlukan ini jika aplikasi saya berjalan pada jre atau nodejs dan persekitaran untuk mereka sudah ada di pelayan?
  • jika saya ingin menjalankan imej (peribadi) saya yang dibina secara tempatan pada pelayan jauh, maka saya memerlukan repositori docker saya sendiri, saya memerlukan pendaftaran untuk berfungsi di suatu tempat dan saya juga perlu mengkonfigurasi https, kerana docker cli hanya berfungsi melalui https. Oh sial... ada pilihan, sudah tentu, untuk menyimpan imej secara tempatan melalui docker save dan hantar sahaja gambar melalui scp... Tapi itu banyak pergerakan badan. Selain itu, ia kelihatan seperti penyelesaian "tongkat" sehingga repositori anda sendiri muncul
  • docker-compose. Ia hanya diperlukan untuk menjalankan bekas. Itu sahaja. Dia tidak boleh berbuat apa-apa lagi. Docker-compose mempunyai sekumpulan versi failnya, sintaksnya sendiri. Tidak kira betapa deklaratifnya, saya tidak mahu membaca dokumentasi mereka. Saya tidak akan memerlukannya di tempat lain.
  • apabila bekerja dalam pasukan, kebanyakan orang menulis fail Docker dengan sangat bengkok, tidak memahami cara ia dicache, menambah semua yang mereka perlukan dan tidak perlu pada imej, mewarisi daripada imej yang tiada dalam Dockerhub atau repositori peribadi, buat beberapa docker-compose fail dengan pangkalan data dan tiada apa yang berterusan. Pada masa yang sama, pembangun dengan bangganya mengisytiharkan bahawa Docker hebat, semuanya berfungsi secara tempatan untuk mereka, dan HR penting menulis dalam kekosongan: "Kami menggunakan Docker dan kami memerlukan calon yang mempunyai pengalaman kerja sedemikian."
  • Saya sentiasa dihantui oleh pemikiran tentang menaikkan segala-galanya dalam Docker: postgresql, kafka, redis. Sayang sekali tidak semuanya berfungsi dalam bekas, tidak semuanya mudah untuk dikonfigurasikan dan dijalankan. Ini disokong oleh pembangun pihak ketiga, dan bukan oleh vendor itu sendiri. Dan dengan cara itu, persoalan segera timbul: vendor tidak bimbang tentang mengekalkan produk mereka di Docker, mengapa ini, mungkin mereka tahu sesuatu?
  • Persoalan sentiasa timbul tentang kegigihan data kontena. dan kemudian anda fikir, adakah saya perlu memasang direktori hos atau membuat volum docker atau membuat bekas data yang kini deprecated? Jika saya melekapkan direktori, maka saya perlu memastikan bahawa uid dan gid pengguna dalam bekas sepadan dengan id pengguna yang melancarkan bekas, jika tidak, fail yang dibuat oleh bekas akan dibuat dengan hak akar. Jika saya menggunakan volume maka data hanya akan dibuat dalam beberapa /usr/* dan akan ada cerita yang sama dengan uid dan gid seperti dalam kes pertama. Jika anda melancarkan komponen pihak ketiga, anda perlu membaca dokumentasi dan mencari jawapan kepada soalan: "dalam direktori kontena manakah komponen itu menulis fail?"

Saya selalu tidak menyukai hakikat bahawa saya terpaksa bermain-main dengan Docker terlalu lama pada peringkat awal: Saya mengetahui cara untuk melancarkan bekas, imej yang hendak dilancarkan, membuat Makefiles yang mengandungi alias kepada arahan Docker yang panjang. Saya benci docker-compose kerana saya tidak mahu mempelajari alat lain dalam ekosistem docker. DAN docker-compose up Ia mengganggu saya, terutamanya jika mereka masih bertemu di sana build pembinaan, bukannya imej yang telah dipasang. Apa yang saya mahukan hanyalah membuat produk dengan cekap dan cepat. Tetapi saya tidak dapat mengetahui cara menggunakan docker.

Memperkenalkan Ansible

Baru-baru ini (tiga bulan lalu), saya bekerja dengan pasukan DevOps, hampir setiap ahli mempunyai sikap negatif terhadap Docker. Atas sebab:

  • peraturan docker iptables (walaupun anda boleh melumpuhkannya dalam daemon.json)
  • docker adalah buggy dan kami tidak akan menjalankannya dalam pengeluaran
  • jika daemon docker ranap, maka semua kontena dengan infrastruktur ranap dengan sewajarnya
  • tidak perlu berlabuh
  • mengapa berlabuh jika terdapat mesin Ansible dan maya

Pada pekerjaan yang sama, saya berkenalan dengan alat lain - Ansible. Saya pernah mendengar tentangnya, tetapi saya tidak cuba menulis buku permainan saya sendiri. Dan sekarang saya mula menulis tugas saya dan kemudian penglihatan saya berubah sepenuhnya! Kerana saya sedar: Ansible mempunyai modul untuk menjalankan bekas docker yang sama, binaan imej, rangkaian, dll., dan bekas boleh dijalankan bukan sahaja secara tempatan, tetapi juga pada pelayan jauh! Kegembiraan saya tidak mengenal batas - saya menemui alat NORMAL dan membuang fail Makefile dan docker-compose saya, ia digantikan dengan tugas yaml. Kod itu dikurangkan dengan menggunakan konstruk seperti loop, when, Dll

Docker untuk menjalankan komponen pihak ketiga seperti pangkalan data

Saya baru-baru ini berkenalan dengan terowong ssh. Ternyata sangat mudah untuk "memajukan" port pelayan jauh ke port tempatan. Pelayan jauh boleh sama ada mesin dalam awan atau mesin maya yang berjalan dalam VirtualBox. Jika rakan sekerja saya atau saya memerlukan pangkalan data (atau beberapa komponen pihak ketiga yang lain), kami hanya boleh memulakan pelayan dengan komponen ini dan mematikannya apabila pelayan tidak diperlukan. Pemajuan port memberikan kesan yang sama seperti pangkalan data yang berjalan dalam bekas docker.

Perintah ini memajukan port tempatan saya ke pelayan jauh yang menjalankan postgresql:

ssh -L 9000:localhost:5432 [e-mel dilindungi]

Menggunakan pelayan jauh menyelesaikan masalah dengan pembangunan pasukan. Pelayan sedemikian boleh digunakan oleh beberapa pembangun sekaligus; mereka tidak perlu dapat mengkonfigurasi postgresql, memahami Docker dan selok-belok lain. Pada pelayan jauh, anda boleh memasang pangkalan data yang sama dalam Docker itu sendiri, jika sukar untuk memasang versi tertentu. Apa yang diperlukan oleh pembangun ialah menyediakan akses ssh!

Saya baru-baru ini membaca bahawa terowong SSH adalah fungsi terhad VPN biasa! Anda hanya boleh memasang OpenVPN atau pelaksanaan VPN lain, sediakan infrastruktur dan berikannya kepada pembangun untuk digunakan. Ini sangat keren!

Nasib baik, AWS, GoogleCloud dan lain-lain memberi anda penggunaan percuma selama setahun, jadi gunakannya! Ia murah jika anda mematikannya apabila tidak digunakan. Saya sentiasa tertanya-tanya mengapa saya memerlukan pelayan jauh seperti gcloud, nampaknya saya menjumpainya.

Sebagai mesin maya tempatan, anda boleh menggunakan Alpine yang sama, yang digunakan secara aktif dalam bekas docker. Nah, atau beberapa pengedaran ringan lain untuk menjadikan mesin but lebih cepat.

Intinya: anda boleh dan harus menjalankan pangkalan data dan barang infrastruktur lain pada pelayan jauh atau dalam kotak maya. Saya tidak memerlukan buruh pelabuhan untuk tujuan ini.

Sedikit mengenai imej dan pengedaran buruh pelabuhan

Saya sudah menulis artikel di mana saya ingin menyampaikan bahawa menggunakan imej docker tidak memberikan sebarang jaminan. Imej docker hanya diperlukan untuk membuat bekas docker. Jika anda menaik taraf kepada imej docker, maka anda sedang menaik taraf untuk menggunakan bekas docker dan anda hanya akan menggunakannya.

Pernahkah anda melihat mana-mana tempat pembangun perisian mengalihkan produk mereka hanya dalam imej docker?
Hasil daripada kebanyakan produk ialah fail binari untuk platform tertentu; ia hanya ditambahkan pada imej docker, yang diwarisi daripada platform yang dikehendaki. Pernahkah anda terfikir mengapa terdapat begitu banyak imej yang serupa di dockerhub? Masukkan nginx sebagai contoh, anda akan melihat 100500 imej daripada orang yang berbeza. Orang-orang ini tidak membangunkan nginx sendiri, mereka hanya menambah nginx rasmi pada imej docker mereka dan menyedapkannya dengan konfigurasi mereka sendiri untuk kemudahan melancarkan kontena.

Secara umum, anda hanya boleh menyimpannya dalam tgz, jika seseorang perlu menjalankannya dalam docker, maka biarkan mereka menambah tgz pada Dockerfile, mewarisi dari persekitaran yang dikehendaki dan mencipta roti tambahan yang tidak mengubah aplikasi itu sendiri dalam tgz. Sesiapa yang akan mencipta imej docker akan tahu apa itu tgz dan apa yang dia perlukan untuk bekerja. Inilah cara saya menggunakan docker di sini

Intinya: Saya tidak memerlukan pendaftaran docker, saya akan menggunakan beberapa jenis S3 atau hanya storan fail seperti google drive/dropbox

Docker di CI

Semua syarikat yang saya pernah bekerja adalah serupa. Mereka biasanya kedai runcit. Iaitu, mereka mempunyai satu aplikasi, satu timbunan teknologi (baik, mungkin beberapa atau tiga bahasa pengaturcaraan).

Syarikat-syarikat ini menggunakan docker pada pelayan mereka di mana proses CI dijalankan. Soalan: Mengapa anda perlu membina projek dalam bekas docker pada pelayan anda? Mengapa tidak sediakan sahaja persekitaran untuk binaan, sebagai contoh, tulis buku permainan Ansible yang akan memasang versi nodejs, php, jdk, salin kekunci ssh, dsb. yang diperlukan ke pelayan tempat binaan akan berlaku?

Sekarang saya faham bahawa ini adalah menembak diri saya sendiri, kerana buruh pelabuhan tidak membawa apa-apa keuntungan dengan pengasingannya. Masalah yang saya hadapi dengan CI dalam docker:

  • sekali lagi anda memerlukan imej docker untuk dibina. anda perlu mencari imej atau menulis fail docker anda sendiri.
  • 90% yang anda perlukan untuk memajukan beberapa kunci ssh, data rahsia yang anda tidak mahu tulis kepada imej docker.
  • bekas dibuat dan mati, semua cache hilang bersama dengannya. binaan seterusnya akan memuat turun semula semua kebergantungan projek, yang memakan masa dan tidak berkesan, dan masa adalah wang.

Pemaju tidak membina projek dalam bekas buruh pelabuhan (saya pernah menjadi peminat, sungguh, saya berasa kasihan pada diri saya pada masa lalu xD). Dalam java adalah mungkin untuk mempunyai beberapa versi dan menukarnya dengan satu arahan kepada yang anda perlukan sekarang. Ia sama dalam nodejs, terdapat nvm.

Output

Saya percaya bahawa docker adalah alat yang sangat berkuasa dan fleksibel, ini adalah kelemahannya (bunyi pelik, ya). Dengan bantuannya, syarikat boleh dengan mudah terpikat padanya dan menggunakannya di mana perlu dan tidak diperlukan. Pembangun melancarkan bekas mereka, beberapa persekitaran mereka, kemudian semuanya lancar mengalir ke CI dan pengeluaran. Pasukan DevOps sedang menulis beberapa jenis kod untuk menjalankan bekas ini.

Gunakan docker hanya pada yang terbaru peringkat dalam aliran kerja anda, jangan seretnya ke dalam projek pada mulanya. Ia tidak akan menyelesaikan masalah perniagaan anda. Dia hanya akan memindahkan masalah ke tahap LAIN dan menawarkan penyelesaiannya sendiri, anda akan melakukan kerja berganda.

Apabila buruh pelabuhan diperlukan: Saya membuat kesimpulan bahawa docker sangat baik dalam mengoptimumkan proses tertentu, tetapi tidak membina fungsi asas

Jika anda masih memutuskan untuk menggunakan docker, maka:

  • berhati-hati
  • jangan paksa pembangun menggunakan docker
  • lokalkan penggunaannya di satu tempat, jangan sebarkannya ke semua repositori Dockefile dan docker-compose

PS:

Terima kasih kerana membaca, saya doakan anda membuat keputusan yang telus dalam urusan dan hari bekerja anda yang produktif!

Sumber: www.habr.com

Tambah komen