Di era DevOps yang menang, pengembang hanya perlu tahu tentang wadah Docker, mengapa mereka diperlukan dan bagaimana cara bekerja dengannya. Ini sangat memudahkan pekerjaan. Selain itu, bahkan mereka yang bekerja dengan .Net Core di lingkungan pengembangan Visual Studio 2017 dapat merasakan kekuatan penuh kontainerisasi. Pavel Skiba, kepala departemen pengembangan aplikasi server, di pertemuan
Panda-Meetup C # .Net , berbicara tentang alat yang tersedia dan mengkonfigurasi Docker untuk VS.

Apa yang harus bisa dilakukan pengembang? "Program," jawab Anda dan ... Tebak. Tetapi jika sebelumnya daftar pengetahuan yang diperlukan berakhir pada ini, sekarang di zaman DevOps itu baru saja dimulai. Ketika kita menulis kode, kita pasti perlu mengetahui struktur jaringan: apa yang berinteraksi dengan apa. Dukungan diperlukan untuk beberapa bahasa pemrograman sekaligus, dan potongan kode yang berbeda dalam suatu proyek dapat ditulis pada apa saja.

Kita perlu tahu cara memutar kembali perangkat lunak jika kesalahan terdeteksi. Kita perlu mengelola konfigurasi untuk lingkungan yang berbeda yang digunakan di perusahaan - ini setidaknya beberapa lingkungan pengembang, lingkungan pengujian dan pertempuran. Oh ya, Anda masih perlu memahami skrip di berbagai server / sistem operasi, karena tidak semuanya dapat dilakukan menggunakan kode, terkadang Anda harus menulis skrip.
Kita perlu mengetahui persyaratan keamanan, dan mereka menjadi lebih keras dan memakan banyak waktu dari pengembang. Jangan lupa tentang dukungan dan pengembangan perangkat lunak terkait: Git, Jenkins dan sebagainya. Akibatnya, pengembang mungkin tidak punya cukup waktu untuk pengembangan murni.
Apa yang harus dilakukan Ada jalan keluar, dan itu terletak di wadah Docker dan sistem manajemen mereka. Setelah Anda menyebarkan semua raksasa yang rumit ini, dan Anda, seperti di masa lalu yang baik, hanya akan menulis kode lagi. Segala sesuatu yang lain akan dikendalikan oleh orang lain atau sistem itu sendiri.
Kami memahami wadah
Apa itu wadah buruh pelabuhan? Ini adalah struktur yang terdiri dari beberapa lapisan. Lapisan atas adalah lapisan biner dari aplikasi Anda. Lapisan kedua dan ketiga sekarang terintegrasi dalam. Net Core, wadah sudah SDK-shny. Lapisan selanjutnya tergantung pada sistem operasi yang digunakan wadah tersebut. Dan lapisan bawah adalah sistem operasi itu sendiri.

Di tingkat yang lebih rendah, Windows Nanoserver digunakan. Ini adalah tekanan besar dari Windows Server, yang tidak dapat melakukan apa-apa selain mempertahankan program utilitas yang digunakan. Tapi volumenya 12 kali lebih sedikit.
Jika kita membandingkan server dan wadah fisik dan virtual, maka manfaat yang terakhir jelas.

Ketika semuanya bekerja pada server fisik, kami dihadapkan dengan banyak masalah. Tidak ada isolasi dalam kode perpustakaan, beberapa aplikasi dapat saling mengganggu. Misalnya: satu aplikasi berfungsi di .Net 1.1, dan yang lain di .Net 2.0. Paling sering, ini menyebabkan tragedi. Setelah beberapa waktu, server virtual muncul, masalah isolasi diselesaikan, tidak ada perpustakaan bersama. Benar, pada saat yang sama menjadi sangat mahal dalam hal sumber daya dan tenaga kerja: perlu untuk memantau sepanjang waktu berapa banyak mesin virtual berputar pada satu mesin virtual, pada Hyper-V dan pada sepotong besi.
Kontainer dirancang untuk menjadi solusi yang murah dan nyaman, minimal bergantung pada OS. Mari kita lihat perbedaannya. Server virtual di dalam sistem berada kira-kira seperti ini.

Lapisan bawah adalah server host. Ini bisa berupa fisik atau virtual. Lapisan berikutnya adalah OS apa saja dengan virtualisasi, di atas adalah hypervisor. Di atas adalah server virtual yang dapat dibagi menjadi OS tamu dan aplikasi. Yaitu, di bawah setiap server virtual, OS tamu digunakan di atas OS, dan ini adalah pemborosan sumber daya tambahan.
Mari kita lihat bagaimana wadah Linux berada di sistem.

Seperti yang Anda lihat, binari dengan aplikasi langsung terletak di atas server host dan OS. OS Guest tidak diperlukan, sumber daya dibebaskan, lisensi untuk OS tamu tidak diperlukan.
Wadah Windows sedikit berbeda dari Linux.

Lapisan dasarnya sama: infrastruktur, host OS (tapi sekarang Windows). Tetapi kemudian wadah dapat bekerja secara langsung dengan OS atau ditempatkan di atas hypervisor. Dalam kasus pertama, ada isolasi proses dan ruang, tetapi mereka menggunakan inti yang sama dengan wadah lain, yang dari sudut pandang keamanan bukan es. Jika Anda menggunakan kontainer melalui Hyper-V, maka semuanya akan diisolasi.
Mempelajari Docker untuk VS
Mari kita beralih ke Docker itu sendiri. Misalkan Anda memiliki Visual Studio, dan Anda menginstal klien Docker untuk Windows untuk pertama kalinya. Dalam hal ini, Docker akan menggunakan server iblis Docker, antarmuka di Istirahat untuk akses ke sana, dan klien itu sendiri - baris perintah Docker. Ini akan memungkinkan kami untuk mengelola segala sesuatu yang terkait dengan wadah: jaringan, gambar, wadah, lapisan.

Slide menunjukkan perintah yang paling sederhana: tarik wadah Docker, luncurkan, kumpulkan, komit, kirim kembali.
Docker sangat organik dipasangkan dengan Visual Studio. Tangkapan layar memperlihatkan menu panel dari Visual Studio 2017. Dukungan penulisan Docker terintegrasi langsung ke Intellisense, Dockerfile didukung, dan semua artefak bekerja pada baris perintah.

Menariknya, kita bisa men-debug kontainer Docker secara langsung dalam waktu nyata. Dan jika kontainer Anda terhubung satu sama lain, maka mereka akan segera dibuang sekaligus, dan Anda tidak perlu menjalankan beberapa lingkungan.
Bagaimana wadah dirakit? Elemen utama di sini adalah dockerfile, yang berisi instruksi untuk membangun gambar. Setiap dockerfile dibuat untuk setiap proyek. Ini menunjukkan: dari mana kita mendapatkan gambar dasar, argumen apa yang kita lewati, apa nama direktori yang berfungsi dengan file, port.

Argumen sumber ini memiliki dua parameter. Parameter kedua adalah jalur di mana hasil perakitan akan ditempatkan di proyek, nilainya diatur secara default. Menurut pendapat saya, ini bukan pilihan yang sangat baik. Sering ada banyak sampah di folder ini, perlu dibersihkan secara berkala, dan ketika kita membersihkan folder ini, kita bisa menggosok rakitan. Jadi, jika Anda mau, Anda bisa mengubahnya, itu diatur oleh parameter sistem Docker_build_source, yang juga bisa dipalu.
Instruksi Entrypoint memungkinkan Anda untuk mengonfigurasi wadah sebagai yang dapat dieksekusi. Baris ini diperlukan untuk .Net Core, sehingga setelah wadah mulai berhasil, ia mengirim pesan "Aplikasi Anda sedang berjalan" ke baris perintah.
Sekarang tentang men-debug kontainer. Semuanya di sini seperti .Net biasa, Anda akan sulit melihat perbedaannya. Paling sering, saya menjalankan .Net Core sebagai self-host di bawah dotnet.exe. Ini menggunakan debugger CLRDBG, cache paket NuGet dan kode sumber.
ASP.Net 4.5+ diselenggarakan oleh IIS atau IIS Express, menggunakan Microsoft Visual Studio Debugger dan sumber root situs di IIS.

Ada dua lingkungan untuk debugging: Debug dan Rilis. Tag gambar debugging ditandai sebagai dev, dan rilis terbaru. Saat debugging, argumen Sumber lebih baik diatur ke obj / Docker / kosong, agar tidak menjadi bingung, tetapi ketika Anda melepaskan obj / Docker / publikasikan. Di sini Anda dapat menggunakan semua binari, tampilan, folder wwwroot yang sama dan semua dependensi yang ada.
Menguasai Docker Compose
Mari kita beralih ke bagian yang menyenangkan: alat orkestrasi penyusun Docker. Mari kita lihat sebuah contoh: Anda memiliki semacam layanan bisnis yang memengaruhi 5-6 kontainer. Dan Anda perlu memperbaiki bagaimana mereka harus dirakit, dalam urutan apa. Di sinilah komposisi Docker sangat berguna, yang akan menyediakan semua perakitan, peluncuran dan penskalaan kontainer. Dikelola secara sederhana, semuanya dikumpulkan oleh satu tim.

Susunan docker menggunakan file YAML yang menyimpan konfigurasi tentang bagaimana kontainer harus dirakit. Mereka menggambarkan pengaturan apa yang perlu Anda gunakan untuk gambar itu sendiri, rakitan, layanan, volume, jaringan, lingkungan. Sintaksnya identik untuk publikasi dalam kelompok. Yaitu, begitu mereka menulis file seperti itu, dan jika di masa depan akan diperlukan untuk menggunakan layanan bisnis dalam sebuah cluster, Anda tidak perlu menambahkan apa pun.
Pertimbangkan struktur file YAML. Gambar adalah gambar Docker. Sebuah gambar adalah sebuah wadah tanpa lapisan aplikasi, itu tidak berubah.

Build menunjukkan cara membangun, di mana membangun dan di mana akan digunakan.
Depends_on - Ketergantungan pada layanan yang bergantung padanya.
Lingkungan - di sini kita mengatur lingkungan.
Ports - pemetaan port di mana port wadah Anda akan tersedia.
Pertimbangkan sebuah contoh. Kami hanya memiliki API tanpa layanan, pada dasarnya 3 wadah: ada SQL.data di Linux, ada aplikasi itu sendiri, itu tergantung pada webapi, dan webapi tergantung pada SQL.data.

Tidak masalah bagaimana urutan komponen ditulis dalam file. Jika semuanya dijelaskan dengan benar, Compose akan secara otomatis membangun informasi ini berdasarkan dependensi dalam proyek. File ini cukup untuk mengumpulkan semua kontainer sekaligus, hasilnya akan menjadi rilis yang selesai.
Ada semacam "wadah kontainer", buruh pelabuhan kontainer-compose.ci.build.yml kontainer khusus, di mana seluruh komposisi dirakit. Anda dapat menjalankan wadah khusus ini dari baris perintah Visual Studio, dan itu akan dapat menyelesaikan perakitan di server build, misalnya, di Jenkins.

Lihatlah di dalam file. Contoh berisi direktori kerja dan dari mana asalnya. Ia memulihkan proyek dari GIT, menerbitkan sendiri solusi ini, mengonfigurasi Rilis, dan mengunggah hasilnya. Itulah seluruh tim yang harus dibangun, tidak ada lagi yang perlu ditulis. Cukup mendaftar sekali, lalu mulai publikasi dengan satu tombol.
Apa lagi yang perlu diperhatikan. Susunan Docker untuk setiap lingkungan mengumpulkan gambar, untuk setiap konfigurasi file terpisah. Untuk setiap konfigurasi di Visual Studio ada file dengan pengaturan yang Anda butuhkan untuk lingkungan.

Langsung dari VS, Anda dapat mulai men-debug seluruh komposisi dari jarak jauh.
Orkestra Kelompok
Akhirnya, kami menyentuh topik-topik seperti orkestra klaster. Kita seharusnya tidak memikirkan bagaimana wadah terus ada, orang atau sistem mana yang dikelola. Untuk ini, ada 4 sistem manajemen kontainer paling populer: Google Kubernetes, Mesos DC / OS, Docker Swarm, dan Azure Service Fabric. Mereka memungkinkan Anda untuk mengelola pengelompokan dan komposisi wadah.

Sistem-sistem ini mampu mengatasi lapisan besar layanan microser, memberikan mereka semua yang diperlukan. Pengembang hanya perlu mengkonfigurasi lapisan ini sekali.
Versi lengkap kinerja di Panda Meetup tersedia di bawah ini.
Bagi mereka yang ingin mempelajari topik ini lebih dalam, saya menyarankan Anda untuk mempelajari bahan-bahan berikut:
Http://dot.net
Http://docs.docker.com
Http://hub.docker.com/microsoft
Http://docs.microsoft.com
Http://visualstudio.com
Dan akhirnya, nasihat penting dari praktik: hal yang paling sulit adalah mengingat di mana letak itu.
Dokumentasi ketika bekerja dengan wadah buruh pelabuhan akan jatuh di pundak Anda. Tanpa dokumentasi, Anda akan lupa di mana wadah apa yang terhubung dengan apa dan apa yang berhasil. Semakin banyak layanan, semakin besar total koneksi web.