Mengambil citra Docker yang ada dan menyebarkannya secara lokal

Selesai

Docker adalah teknologi yang memungkinkan Anda untuk menerapkan aplikasi dan layanan dengan cepat dan mudah. Aplikasi Docker berjalan menggunakan citra Docker. Citra Docker adalah lingkungan yang sudah dikemas sebelumnya yang berisi kode aplikasi dan lingkungan tempat kode dijalankan.

Dalam skenario perusahaan yang dijelaskan sebelumnya, Anda ingin menyelidiki kelayakan pengemasan dan menjalankan aplikasi dengan Docker. Anda memutuskan untuk membuat dan menerapkan citra Docker yang menjalankan aplikasi web uji.

Dalam unit ini, Anda akan mempelajari konsep dan proses utama yang terlibat dalam menjalankan aplikasi kontainer yang disimpan dalam citra Docker.

Ringkasan tentang Docker

Docker adalah alat untuk menjalankan aplikasi kontainer. Aplikasi kontainer mencakup aplikasi dan sistem file yang membentuk lingkungan tempat aplikasi tersebut berjalan. Misalnya, aplikasi kontainer dapat terdiri dari database dan informasi perangkat lunak dan konfigurasi terkait lainnya yang diperlukan untuk menjalankan aplikasi.

Aplikasi kontainer biasanya memiliki jejak yang jauh lebih kecil daripada komputer virtual yang dikonfigurasi untuk menjalankan aplikasi yang sama. Jejak yang lebih kecil ini karena komputer virtual harus memasok seluruh sistem operasi dan lingkungan pendukung terkait. Kontainer Docker tidak memiliki overhead ini karena Docker menggunakan kernel sistem operasi komputer host untuk mendayai kontainer. Mengunduh dan memulai Docker gambar lebih cepat dan lebih hemat ruang daripada mengunduh dan menjalankan mesin virtual yang menyediakan fungsionalitas serupa.

Anda membuat aplikasi dalam kontainer dengan membuat gambar yang berisi sekumpulan file dan bagian informasi konfigurasi yang digunakan Docker. Anda menjalankan aplikasi dengan meminta Docker memulai kontainer berdasarkan citra. Ketika kontainer dimulai, Docker menggunakan konfigurasi citra untuk menentukan aplikasi apa yang akan dijalankan di dalam kontainer tersebut. Docker menyediakan sumber daya sistem operasi dan keamanan yang diperlukan. Hal ini memastikan bahwa kontainer berjalan secara bersamaan dan tetap relatif terisolasi.

Penting

Docker tidak menyediakan tingkat isolasi yang tersedia dengan komputer virtual. Komputer virtual menerapkan isolasi di tingkat perangkat keras. Kontainer Docker berbagi sumber daya dan pustaka sistem operasi yang mendasarinya. Namun, Docker memastikan bahwa satu kontainer tidak dapat mengakses sumber daya orang lain kecuali kontainer dikonfigurasi untuk melakukannya.

Anda dapat menjalankan Docker di desktop atau laptop jika Anda mengembangkan dan menguji secara lokal. Untuk sistem produksi, Docker tersedia untuk lingkungan server, termasuk banyak varian Linux dan Microsoft Windows Server 2016. Banyak vendor juga mendukung Docker di cloud. Misalnya, Anda dapat menyimpan citra Docker di Azure Container Registry dan menjalankan kontainer dengan Azure Container Instance.

Dalam modul ini, Anda akan menggunakan Docker secara lokal untuk membangun dan menjalankan gambar. Kemudian Anda akan mengunggah gambar ke Azure Container Registry dan menjalankannya di Instans Kontainer Azure. Versi Docker ini cocok untuk pengembangan lokal dan pengujian citra Docker.

Citra Docker Linux dan Windows

Docker awalnya dikembangkan untuk Linux dan telah diperluas untuk mendukung Windows. Citra Docker individual berbasis Windows atau berbasis Linux, tetapi tidak bisa keduanya pada saat yang sama. Sistem operasi gambar menentukan jenis lingkungan sistem operasi apa yang digunakan di dalam kontainer.

Penulis citra Docker yang ingin menawarkan fungsionalitas serupa dalam citra berbasis Linux dan berbasis Windows dapat membangun citra tersebut secara terpisah. Misalnya, Microsoft menawarkan gambar Windows dan Linux Docker yang berisi lingkungan ASP.NET Core yang dapat Anda gunakan sebagai dasar untuk aplikasi kontainer ASP.NET Core.

Komputer Linux dengan Docker yang diinstal hanya dapat menjalankan kontainer Linux. Komputer Windows dengan Docker yang terinstal dapat menjalankan kedua jenis kontainer. Windows menjalankan keduanya dengan menggunakan mesin virtual untuk menjalankan sistem Linux dan menggunakan sistem Linux virtual untuk menjalankan kontainer Linux.

Dalam modul ini, Anda akan membuat dan menjalankan gambar berbasis Linux.

Registri Docker dan Docker Hub

Citra Docker disimpan dan disediakan dalam registri. Registri adalah layanan web tempat Docker dapat terhubung untuk mengunggah dan mengunduh citra kontainer. Registri yang paling terkenal adalah Docker Hub, yang merupakan registri publik. Banyak individu dan organisasi menerbitkan citra ke Docker Hub, dan Anda dapat mengunduh dan menjalankan citra ini menggunakan Docker yang berjalan di desktop Anda, di server, atau di cloud. Anda dapat membuat akun Docker Hub dan mengunggah citra Anda di sana secara gratis.

Registri diatur sebagai serangkaian repositori. Setiap repositori berisi beberapa citra Docker yang berbagi nama umum dan biasanya tujuan dan fungsionalitas yang sama. Gambar-gambar ini biasanya memiliki versi yang berbeda, diidentifikasi dengan tag. Mekanisme ini memungkinkan Anda menerbitkan dan mempertahankan beberapa versi citra karena alasan kompatibilitas. Saat mengunduh dan menjalankan citra, Anda harus menentukan registri, repositori, dan tag versi untuk citra tersebut. Tag adalah label teks, dan Anda dapat menggunakan sistem penomor nama versi Anda (v1.0, v1.1, v1.2, v2.0, dan sebagainya).

Misalkan Anda ingin menggunakan ASP.NET Core Runtime Docker. Gambar ini tersedia dalam dua versi:

  • mcr.microsoft.com/dotnet/core/aspnet:2.2
  • mcr.microsoft.com/dotnet/core/aspnet:2.1

Misalkan Anda ingin menggunakan sampel citra Docker sampel .NET Core. Di sini kita memiliki empat versi yang tersedia untuk dipilih:

  • mcr.microsoft.com/dotnet/samples:dotnetapp
  • mcr.microsoft.com/dotnet/samples:aspnetapp

Catatan

Satu citra tunggal dapat memiliki beberapa tag yang ditetapkan untuknya. Menurut konvensi, versi terbaru gambar diberi tag terbaru selain tag yang menjelaskan nomor versinya. Saat merilis versi baru dari sebuah citra, Anda dapat menetapkan ulang tag terbaru untuk merujuk pada citra baru.

Repositori juga merupakan unit privasi untuk citra. Jika Anda tidak ingin berbagi citra, Anda dapat membuat repositori pribadi. Anda dapat memberikan akses ke pengguna lain yang Anda ingin untuk berbagi citra.

Jelajahi Docker Hub dan tarik citra

Catatan

Anda tidak perlu menyelesaikan salah satu contoh atau menjalankan kode apa pun di bagian berikut. Anda akan melakukannya di bagian berikutnya.

Seringkali Anda akan menemukan gambar di Docker Hub yang sangat cocok dengan jenis aplikasi yang ingin Anda kemas. Anda dapat mengunduh citra seperti itu dan memperluasnya dengan kode aplikasi Anda.

Docker Hub berisi ribuan citra. Anda dapat mencari dan menelusuri registri menggunakan Docker dari baris perintah atau situs web Docker Hub. Situs web ini memungkinkan Anda mencari, memfilter, dan memilih citra berdasarkan jenis dan penerbit. Gambar di bawah ini memperlihatkan contoh halaman pencarian.

Cuplikan layar halaman pencarian Docker Hub yang mencantumkan berbagai gambar container.

Anda menggunakan perintah docker pull dengan nama citra untuk mengambil citra. Secara default, Docker akan mengunduh citra yang ditandai latest dari repositori tersebut di Docker Hub jika Anda hanya menentukan nama repositori. Perlu diingat bahwa Anda dapat memodifikasi perintah untuk menarik tag yang berbeda dan dari repositori yang berbeda. Contoh ini mengambil citra dengan tag aspnetapp dari repositori mcr.microsoft.com/dotnet/core/samples:aspnetapp. Citra ini berisi aplikasi web ASP.NET Core sederhana.

Catatan

Contoh dalam unit ini dimaksudkan untuk menampilkan sintaks dari berbagai perintah Docker. Anda tidak perlu menjalankan perintah ini saat membaca unit ini. Latihan yang setelah unit ini akan memandu Anda bekerja dengan Docker secara langsung.

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp

Saat Anda mengambil citra, Docker menyimpannya secara lokal dan membuatnya tersedia untuk menjalankan kontainer. Anda dapat melihat citra di registri lokal Anda dengan perintah daftar citra docker.

docker image list

Outputnya terlihat seperti contoh berikut:

REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples   aspnetapp           6e2737d83726        6 days ago          263MB

Anda menggunakan ID nama citra untuk merujuk pada citra di banyak perintah Docker lainnya.

Menjalankan kontainer Docker

Gunakan perintah docker run untuk memulai kontainer. Tentukan citra yang akan dijalankan dengan nama atau ID. Jika Anda belum melakukan docker pull pada citra tersebut, Docker akan melakukannya untuk Anda.

docker run mcr.microsoft.com/dotnet/samples:aspnetapp

Dalam contoh ini, perintah merespons dengan pesan berikut:

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
 No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

Citra ini berisi aplikasi web, jadi sekarang mendengarkan permintaan untuk tiba di port HTTP 80. Namun, jika Anda membuka browser web dan membuka http://localhost:80, Anda tidak akan melihat aplikasinya.

Secara default, Docker tidak mengizinkan permintaan jaringan masuk untuk menjangkau kontainer Anda. Anda perlu memberi tahu Docker untuk menetapkan nomor port tertentu dari komputer Anda ke nomor port tertentu dalam kontainer dengan menambahkan opsi -p ke docker run. Instruksi ini memungkinkan permintaan jaringan ke kontainer pada port yang telah ditentukan.

Selain itu, aplikasi web dalam citra ini tidak dimaksudkan untuk digunakan secara interaktif dari baris perintah. Ketika kita memulainya, kita ingin Docker untuk memulainya di latar belakang dan membiarkannya berjalan. Gunakan bendera -d untuk menginstruksikan Docker memulai aplikasi web di latar belakang.

Tekan Ctrl+C untuk menghentikan gambar lalu mulai ulang seperti yang ditunjukkan oleh contoh berikut:

docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp

Perintah ini memetakan port 80 dalam kontainer ke port 8080 di komputer Anda. Jika Anda mengunjungi halaman http://localhost:8080 di browser, Anda akan melihat contoh aplikasi web.

Cuplikan layar aplikasi web sampel yang berjalan di browser.

Kontainer dan file

Jika kontainer yang sedang berjalan membuat perubahan pada file dalam citranya, perubahan tersebut hanya ada di kontainer tempat perubahan itu dibuat. Kecuali Anda mengambil langkah-langkah khusus untuk mempertahankan status kontainer, perubahan ini hilang saat kontainer dihapus. Demikian pula, beberapa kontainer berdasarkan gambar yang sama yang berjalan secara bersamaan tidak berbagi file dalam gambar. Setiap kontainer memiliki salinan independennya sendiri. Data apa pun yang ditulis oleh satu kontainer ke sistem filenya tidak terlihat oleh kontainer lainnya.

Dimungkinkan untuk menambahkan volume yang dapat ditulis ke kontainer. Volume mewakili sistem file yang dapat dipasang oleh kontainer, dan tersedia untuk aplikasi yang berjalan dalam kontainer. Data dalam suatu volume bertahan saat kontainer berhenti, dan beberapa kontainer dapat berbagi volume yang sama. Detail untuk membuat dan menggunakan volume berada di luar lingkup modul ini.

Ini adalah praktik terbaik untuk menghindari kebutuhan membuat perubahan pada sistem file gambar untuk aplikasi yang digunakan dengan Docker. Hanya gunakan ini untuk file sementara yang Anda tidak maslaah jika harus hilang.

Mengelola kontainer Docker

Anda dapat melihat kontainer aktif dengan perintah docker ps.

docker ps

Output mencakup status kontainer—Naik jika berjalan, Keluar jika dihentikan —di antara nilai lain seperti bendera baris perintah yang ditentukan saat gambar dimulai, dan informasi tambahan. Docker memungkinkan Anda menjalankan beberapa kontainer dari gambar yang sama secara bersamaan, sehingga setiap kontainer diberi ID unik dan nama unik yang dapat dibaca manusia. Sebagian besar perintah Docker yang digunakan untuk mengelola masing-masing kontainer dapat menggunakan ID atau nama untuk merujuk pada kontainer tertentu.

Dalam output berikut, Anda dapat melihat dua kontainer. Bidang PORT menunjukkan bahwa kontainer dengan ID elegant_ramanujan adalah citra yang berjalan dengan port 80 pada host Docker yang dipetakan ke port 8080 di komputer Anda. Instans youthful_heisenberg adalah kontainer untuk menjalankan citra sebelumnya. Bidang COMMAND menunjukkan perintah yang dijalankan kontainer untuk memulai aplikasi dalam citra. Dalam hal ini, untuk kedua kontainer, ini adalah dotnet aspnetapp.dll. ID gambar untuk kontainer juga sama karena kedua kontainer menjalankan gambar yang sama.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   42 seconds ago      Up 41 seconds       0.0.0.0:8080->80/tcp   elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   5 minutes ago      Up 5 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Catatan

docker ps adalah pintasan untuk docker container ls. Nama-nama perintah ini didasarkan pada utilitas Linux ps dan ls, yang masing-masing mencantumkan proses dan file yang berjalan.

Anda dapat menghentikan kontainer aktif dengan docker stop perintah , menentukan ID kontainer.

docker stop elegant_ramanujan

Jika Anda menjalankan docker ps lagi, Anda akan melihat kontainer elegant_ramanujan tidak ada lagi dalam output. Kontainer masih ada, tetapi tidak lagi menghosting proses yang sedang berjalan. Anda dapat menyertakan kontainer yang dihentikan dalam output docker ps dengan menyertakan bendera -a:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   2 minutes ago       Exited (0) 21 seconds ago                       elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   7 minutes ago      Up 7 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Anda dapat memulai ulang kontainer yang dihentikan dengan perintah docker start. Proses utama kontainer dimulai baru.

docker start elegant_ramanujan

Biasanya, setelah kontainer dihentikan, kontainer tersebut juga akan dihapus. Menghapus kontainer akan membersihkan sumber daya apa pun yang ditinggalkannya. Setelah Anda menghapus kontainer, perubahan apa pun yang dilakukan dalam sistem file citranya akan hilang secara permanen.

docker rm elegant_ramanujan

Anda tidak dapat menghapus kontainer yang sedang berjalan, tetapi Anda dapat memaksa kontainer untuk dihentikan dan dihapus dengan bendera -f ke docker rm perintah . Ini adalah cara cepat untuk menghentikan dan menghapus kontainer, tetapi hanya boleh digunakan jika aplikasi di dalam kontainer tidak perlu melakukan penonaktifan yang baik.

docker container rm -f elegant_ramanujan

Menghapus citra Docker

Anda dapat menghapus citra dari komputer lokal dengan perintah docker image rm. Tentukan ID citra yang akan dihapus. Contoh berikut menghapus citra untuk contoh aplikasi web.

docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp

Kontainer yang menjalankan citra harus dihentikan sebelum citra tersebut dapat dihapus. Jika citra masih digunakan oleh kontainer, Anda akan mendapatkan pesan kesalahan seperti berikut ini. Dalam contoh ini, kesalahan terjadi karena kontainer youthful_heisenberg masih menggunakan citra tersebut.

Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe