Pengantar Docker dan Mesin Virtual
Docker dan mesin virtual (VM) keduanya merupakan alat populer untuk menyebarkan aplikasi, namun cara kerjanya berbeda secara mendasar. Banyak pengembang merasa bingung dengan bagaimana Docker dapat menyediakan sistem file lengkap, jaringan terisolasi, dan fitur lain tanpa overhead yang biasanya dikaitkan dengan VM.
Artikel ini bertujuan untuk memperjelas perbedaan antara Docker dan mesin virtual tradisional, menjelaskan mengapa Docker sering dianggap lebih ringan dan lebih mudah untuk menerapkan perangkat lunak. Kami akan mempelajari teknologi yang mendasari dan manfaat praktis menggunakan Docker di lingkungan produksi.
Memerintah | Keterangan |
---|---|
FROM | Menentukan gambar dasar yang akan digunakan untuk membuat kontainer Docker. |
WORKDIR | Menetapkan direktori kerja di dalam wadah Docker. |
COPY | Menyalin file atau direktori dari mesin host ke dalam wadah Docker. |
RUN | Menjalankan perintah di container Docker selama proses build. |
EXPOSE | Memberi tahu Docker bahwa kontainer mendengarkan port jaringan yang ditentukan saat runtime. |
CMD | Menentukan perintah untuk dijalankan dalam kontainer Docker saat dimulai. |
config.vm.box | Menentukan kotak dasar yang akan digunakan untuk mesin virtual Vagrant. |
config.vm.network | Mengonfigurasi pengaturan jaringan, seperti meneruskan port dari host ke VM. |
config.vm.provision | Menentukan cara menyediakan mesin virtual, seperti menjalankan skrip shell selama penyiapan. |
Menjelajahi Dockerfile dan Vagrantfile
Dalam contoh yang diberikan, pertama-tama kami mendemonstrasikan cara membuat Dockerfile untuk menerapkan aplikasi Node.js. Dockerfile dimulai dengan menentukan gambar dasar dengan perintah, dalam hal ini, menggunakan runtime Node.js resmi. Mengatur direktori kerja di dalam wadah dicapai dengan perintah, yang memastikan perintah selanjutnya dijalankan di direktori yang ditentukan. Itu perintah digunakan untuk mentransfer file package.json dan kode aplikasi ke dalam container. Itu RUN perintah kemudian menginstal dependensi yang diperlukan di dalam wadah. Kami mengekspos port tempat aplikasi dijalankan menggunakan perintah, dan akhirnya, command mendefinisikan perintah untuk menjalankan aplikasi saat container dimulai.
Untuk contoh Vagrantfile, konfigurasi dimulai dengan menentukan kotak dasar dengan ekstensi perintah, di sini menggunakan Ubuntu 20.04. Pengaturan jaringan dikonfigurasi menggunakan perintah, yang meneruskan port 8080 pada host ke port 80 pada VM tamu, memungkinkan akses eksternal ke layanan yang berjalan pada VM. Itu perintah ini digunakan untuk menjalankan skrip shell yang memperbarui daftar paket dan menginstal Apache2, menyediakan VM dengan perangkat lunak yang diperlukan. Perintah-perintah ini menampilkan langkah-langkah mendasar untuk menyiapkan lingkungan VM, menawarkan pendekatan yang lebih tradisional dibandingkan dengan lingkungan dalam container yang disediakan oleh Docker.
Membuat Dockerfile untuk Penerapan Aplikasi Node.js
Contoh ini menunjukkan cara membuat Dockerfile untuk aplikasi Node.js, menampilkan langkah-langkah untuk membangun dan menjalankan aplikasi di dalam container Docker.
# Use an official Node.js runtime as a parent image
FROM node:14
# Set the working directory inside the container
WORKDIR /usr/src/app
# Copy package.json and package-lock.json to the container
COPY package*.json ./
# Install the application dependencies inside the container
RUN npm install
# Copy the rest of the application code to the container
COPY . .
# Expose the port the app runs on
EXPOSE 8080
# Define the command to run the app
CMD ["node", "app.js"]
Menyiapkan Mesin Virtual Menggunakan Vagrant
Contoh ini menunjukkan cara menyiapkan mesin virtual menggunakan Vagrant dengan Vagrantfile sederhana, yang menunjukkan proses pendefinisian dan konfigurasi lingkungan VM.
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# Use Ubuntu 20.04 as the base box
config.vm.box = "ubuntu/focal64"
# Forward port 8080 on the host to port 80 on the guest
config.vm.network "forwarded_port", guest: 80, host: 8080
# Provision the VM with a shell script
config.vm.provision "shell", inline: <<-SHELL
sudo apt-get update
sudo apt-get install -y apache2
SHELL
end
Memahami Docker dan Mesin Virtual
Salah satu perbedaan utama antara Docker dan mesin virtual (VM) terletak pada cara mereka memanfaatkan sumber daya sistem. VM berjalan pada hypervisor, yang mengemulasi perangkat keras dan memungkinkan beberapa sistem operasi berjalan secara bersamaan pada mesin host. Hal ini mengharuskan setiap VM menyertakan sistem operasi tamu lengkap, kumpulan pustakanya sendiri, dan binernya. Hal ini tidak hanya menghabiskan sumber daya sistem secara signifikan namun juga meningkatkan ukuran dan kompleksitas penerapan dan pemeliharaan secara keseluruhan.
Sebaliknya, Docker memanfaatkan teknologi containerization, yang memungkinkan beberapa container berbagi kernel sistem operasi yang sama. Setiap kontainer berjalan sebagai proses terisolasi di ruang pengguna. Artinya, container jauh lebih ringan dan lebih cepat untuk dijalankan dibandingkan dengan VM, karena container tidak perlu melakukan booting seluruh OS. Docker mencapai isolasi sistem file melalui sistem file berlapis, di mana setiap kontainer memiliki lapisan sistem file sendiri di atas gambar dasar. Isolasi jaringan ditangani menggunakan namespace, memungkinkan Docker menyediakan lingkungan jaringan terisolasi untuk setiap kontainer tanpa overhead yang terkait dengan VM.
- Apa perbedaan utama antara Docker dan VM?
- Docker menggunakan containerisasi untuk berbagi kernel OS host, membuatnya lebih ringan dan cepat, sedangkan VM memerlukan OS tamu lengkap dan hypervisor.
- Mengapa container Docker dianggap lebih efisien?
- Kontainer berbagi kernel OS host dan memiliki overhead minimal, memungkinkan waktu startup lebih cepat dan pemanfaatan sumber daya yang efisien.
- Bagaimana Docker mencapai isolasi sistem file?
- Docker menggunakan sistem file berlapis, di mana setiap container memiliki lapisan sistem file sendiri di atas image dasar.
- Apa yang dimaksud dengan hypervisor dalam konteks VM?
- Hypervisor adalah perangkat lunak yang mengemulasi perangkat keras, memungkinkan beberapa sistem operasi berjalan secara bersamaan pada satu mesin host.
- Bagaimana Docker menangani isolasi jaringan?
- Docker menggunakan namespace untuk menyediakan lingkungan jaringan yang terisolasi untuk setiap container.
- Mengapa menerapkan perangkat lunak ke image Docker lebih mudah daripada VM?
- Gambar Docker merangkum semua dependensi dan konfigurasi, memastikan konsistensi di berbagai lingkungan.
- Apa sajakah kasus penggunaan umum untuk Docker?
- Docker umumnya digunakan untuk arsitektur layanan mikro, integrasi berkelanjutan/penyebaran berkelanjutan (CI/CD), dan lingkungan pengembangan terisolasi.
- Bisakah container Docker berjalan di OS apa pun?
- Kontainer Docker dapat berjalan di OS apa pun yang mendukung Docker, tetapi kontainer tersebut berbagi kernel OS host.
- Apa itu gambar dasar di Docker?
- Gambar dasar adalah titik awal untuk membuat container Docker, sering kali menyertakan OS dan dependensi dasar.
Meringkas Docker vs. Mesin Virtual
Dalam membandingkan Docker dan mesin virtual, perbedaan utama terletak pada pemanfaatan sumber daya dan efisiensi penerapannya. Mesin virtual beroperasi dengan sistem operasi tamu lengkap dan hypervisor, yang menyebabkan konsumsi sumber daya lebih tinggi. Sebaliknya, container Docker berbagi kernel OS host, sehingga menghasilkan solusi yang lebih ringan dan gesit. Docker mencapai lingkungan yang terisolasi melalui sistem file berlapis dan namespace jaringan, memungkinkannya menyediakan fungsionalitas serupa dengan VM tanpa overhead terkait. Hal ini membuat penerapan perangkat lunak ke image Docker lebih efisien, konsisten, dan lebih mudah dikelola di berbagai lingkungan produksi.
Kesimpulannya, penggunaan containerisasi oleh Docker menawarkan keuntungan yang signifikan dibandingkan mesin virtual tradisional dengan meminimalkan penggunaan sumber daya dan menyederhanakan proses penerapan. Dengan berbagi kernel OS host dan memanfaatkan sistem file dan jaringan yang terisolasi, Docker memberikan solusi yang kuat namun ringan untuk penerapan aplikasi modern. Memahami perbedaan ini dapat membantu pengembang memilih alat yang tepat untuk kebutuhan mereka, memastikan manajemen aplikasi yang efisien dan terukur.