Mengenal Lebih Dekat Container, Vms Dan Docker - CRUDPRO

Mengenal Lebih Dekat Container, Vms Dan Docker

Jika Anda seorang programmer atau teknisi, Anda setidaknya pernah mendengar tentang Docker. Docker adalah alat yang nyaman untuk mengemas, mengirim, dan menjalankan aplikasi di dalam "container". Akhir-akhir ini mendapat banyak perhatian dari pengembang dan sysadmin, jadi sulit untuk tidak melakukannya. Bahkan perusahaan besar seperti Google, VMware, dan Amazon sedang membangun layanan untuk mendukungnya.

Apakah Anda memiliki kasus penggunaan langsung Docker atau tidak, penting untuk memahami beberapa konsep dasar tentang apa itu "container" dan bagaimana perbandingannya dengan virtual Machine (VM). Ada banyak panduan bagus untuk menggunakan Docker di internet, tetapi saya belum menemukan banyak panduan konseptual untuk pemula, terutama pada container itu sendiri. Jadi semoga posting ini menyelesaikan masalah itu :)

Mari kita mulai dengan memahami apa itu VM dan container.

Apa itu "container" dan "VM"?

container dan VM memiliki tujuan serupa untuk mengisolasi aplikasi dan dependensinya menjadi unit mandiri yang dapat berjalan di mana saja.

Selain itu, container dan VM menghilangkan kebutuhan akan perangkat keras fisik, memungkinkan penggunaan sumber daya komputasi yang lebih efisien, baik dalam hal konsumsi energi maupun efektivitas biaya.

Perbedaan utama antara container dan VM adalah pendekatan arsitekturnya. Mari kita lihat lebih dekat.

virtual Machine

VM pada dasarnya adalah emulasi dari komputer nyata yang menjalankan program seperti komputer nyata. VM berjalan pada mesin fisik menggunakan "hypervisor". Sebaliknya, hypervisor berjalan di host machine atau di "bare metal".

Mari kita perjelas terminologinya.

Hypervisor adalah perangkat lunak, firmware, atau perangkat keras tempat VM dijalankan. Hypervisor itu sendiri berjalan di komputer fisik yang disebut "host machine". host machine menyediakan sumber daya seperti RAM dan CPU ke VM. Sumber daya ini dibagi antara VM dan dapat didistribusikan sesuai kebutuhan. Jadi, jika satu VM menjalankan aplikasi yang lebih intensif sumber daya, Anda dapat mengalokasikan lebih banyak sumber daya ke VM tersebut daripada VM lain yang berjalan di host machine yang sama.

VM yang berjalan di host machine (menggunakan hypervisor) juga disebut "guest machine". guest machine ini berisi aplikasi dan apa pun yang diperlukan untuk dijalankan, seperti sistem biner dan pustaka. Ini juga memiliki seluruh tumpukan perangkat keras tervirtualisasi, termasuk adaptor jaringan virtual, penyimpanan, dan CPU. Ini berarti ia juga memiliki sistem operasi guest yang lengkap. Dari dalam, guest machine berperilaku sebagai unitnya sendiri dengan sumber dayanya sendiri. Dari luar, Anda dapat mengetahui bahwa ini adalah VM, berbagi sumber daya yang disediakan oleh host machine.

Seperti disebutkan sebelumnya, guest machine dapat berjalan di hypervisor yang dihosting atau hypervisor bare-metal. Ada beberapa perbedaan penting di antara mereka.

Pertama, hypervisor virtualisasi yang dihosting berjalan di atas sistem operasi host machine. Misalnya, di komputer yang menjalankan OSX, Anda dapat menginstal VM (seperti VirtualBox atau VMware Workstation 8) di atas OS tersebut. VM tidak memiliki akses langsung ke perangkat keras, jadi mereka harus melalui sistem operasi host (OSX pada Mac dalam kasus ini).

Keuntungan dari hypervisor yang dihosting adalah perangkat keras yang mendasarinya kurang kritis. Sistem operasi host dianggap lebih "kompatibel dengan perangkat keras" karena bertanggung jawab atas driver perangkat keras dan bukan hypervisor itu sendiri. Di sisi lain, lapisan tambahan antara perangkat keras dan hypervisor ini menciptakan lebih banyak overhead sumber daya dan memperlambat kinerja VM.

Lingkungan hypervisor bare metal mengatasi masalah kinerja dengan menginstal dan menjalankan perangkat keras host machine. Ini terhubung langsung ke perangkat keras yang mendasarinya dan tidak perlu menjalankan sistem operasi host. Dalam hal ini, hypervisor adalah sistem operasi pertama yang dipasang di server host machine. Tidak seperti hypervisor yang dihosting, hypervisor bare-metal memiliki driver perangkatnya sendiri dan berinteraksi langsung dengan setiap komponen untuk I/O, pemrosesan, atau tugas khusus OS. Ini meningkatkan kinerja, skalabilitas, dan stabilitas. Imbalannya di sini adalah jumlah driver perangkat yang dapat dibangun menjadi hypervisor sangat besar, sehingga membatasi kompatibilitas perangkat keras.

Sekarang kita telah berbicara tentang hypervisor, Anda mungkin bertanya-tanya mengapa kita membutuhkan lapisan "hypervisor" ekstra ini antara VM dan host machine.

Karena VM memiliki sistem operasi virtualnya sendiri, hypervisor memainkan peran kunci dalam menyediakan VM dengan platform untuk mengelola dan menjalankan sistem operasi guest ini. Ini memungkinkan komputer host untuk berbagi sumber daya di antara virtual Machine yang berjalan sebagai guest di dalamnya.

Diagram VM

Seperti yang Anda lihat pada diagram, VM mengemas perangkat keras virtual, kernel (yaitu OS), dan ruang pengguna untuk setiap VM baru.

container

Tidak seperti VM, yang menyediakan virtualisasi perangkat keras, container menyediakan virtualisasi tingkat sistem operasi dengan memisahkan "ruang pengguna". Mengurai istilah container akan memberi Anda Imagean tentang apa yang saya maksud.

Untuk semua maksud dan tujuan, container terlihat seperti VM. Misalnya, ia memiliki ruang pribadi untuk diproses, dapat menjalankan perintah sebagai root, memiliki antarmuka jaringan pribadi dan alamat IP, memungkinkan rute khusus dan aturan iptable, dan dapat memasang sistem file.

Salah satu perbedaan utama antara container dan VM adalah container *berbagi* kernel sistem host dengan container lain.

Diagram Container

Diagram ini menunjukkan bahwa container hanya mengemas ruang pengguna, bukan kernel atau perangkat keras virtual seperti VM. Setiap container mendapatkan ruang penggunanya sendiri yang terisolasi, memungkinkan banyak container berjalan di satu host machine. Anda dapat melihat bahwa semua arsitektur level sistem operasi dibagi di antara container. Satu-satunya bagian yang dibuat dari awal adalah tempat sampah dan perpustakaan. Inilah mengapa container sangat ringan.

Dari mana Docker berasal?

Docker adalah proyek open Source berdasarkan container Linux. Buat container di atas sistem operasi menggunakan fitur kernel Linux seperti NameSpace dan Control groups.

container bukanlah hal baru. Google telah menggunakan teknologi penampungnya sendiri selama bertahun-tahun. Teknologi container Linux lainnya termasuk Solaris Zones, BSD jails, dan LXC, yang telah ada selama bertahun-tahun.

Jadi mengapa Docker tiba-tiba mendapatkan momentum?

1. Kemudahan penggunaan: Docker memudahkan siapa saja, termasuk pengembang, sysadmin, dan arsitek, untuk memanfaatkan container guna membangun dan menguji aplikasi portabel dengan cepat. Hal ini memungkinkan siapa saja untuk mengemas aplikasi mereka di laptop mereka, sehingga aplikasi tersebut berjalan tidak berubah di cloud publik, cloud pribadi, dan bahkan bare metal. Slogannya adalah "bangun sekali, jalankan di mana saja".

2. Kecepatan: Docker Container sangat ringan dan cepat. container menggunakan lebih sedikit sumber daya karena hanya merupakan lingkungan kotak pasir yang berjalan di atas kernel. Docker Container dapat dibuat dan dijalankan dalam hitungan detik, sedangkan VM harus boot ke sistem operasi virtual penuh setiap saat, yang dapat memakan waktu.

3. Docker Hub: Pengguna Docker juga mendapat manfaat dari ekosistem Docker Hub yang berkembang, yang dapat dianggap sebagai "app store untuk Docker Image". Docker Hub memiliki puluhan ribu Image publik buatan komunitas yang siap digunakan. Sangat mudah menemukan Image yang sesuai dengan kebutuhan Anda, langsung tarik ke bawah, dan gunakan dengan sedikit atau tanpa modifikasi.

4. Modularitas dan skalabilitas: Docker memudahkan untuk membagi fungsionalitas aplikasi ke dalam container individual. Misalnya, Anda dapat menjalankan database Postgres di satu container, server Redis di container lain, dan aplikasi Node.js di container lain. Docker memudahkan untuk menautkan container ini bersama-sama untuk membuat aplikasi, membuatnya lebih mudah untuk menskalakan atau memperbarui komponen secara mandiri di masa mendatang.

jadi, siapa yang tidak suka paus Docker? ;)

Konsep dasar Docker

Sekarang setelah Anda memiliki Imagean besarnya, mari kita telusuri dasar-dasar Docker satu per satu.

Container

Docker Engine adalah lapisan tempat Docker berjalan. Ini adalah runtime ringan dan alat yang mengelola container, Image, membangun, dan lainnya. Ini berjalan secara native pada sistem Linux dan terdiri dari:

  1. Daemon Docker yang berjalan di komputer host.
  2. Docker Client yang berkomunikasi dengan daemon Docker untuk menjalankan perintah.
  3. REST API untuk interaksi jarak jauh dengan Docker Daemon.
Docker Client

Docker Client adalah sesuatu yang berkomunikasi sebagai pengguna akhir Docker. Anggap saja sebagai UI Docker. Misalnya, ketika Anda melakukan.

docker build iampeekay/someImage .

Berkomunikasi dengan Docker Client, yang mengkomunikasikan instruksi ke daemon Docker.

Daemon Docker

Daemon Docker benar-benar mengeksekusi perintah yang dikirim ke Docker Client, termasuk membangun, menjalankan, dan mendistribusikan container. Docker Daemon berjalan di host machine, tetapi pengguna tidak pernah berinteraksi dengannya secara langsung. Docker Client juga dapat berjalan di host machine, tetapi tidak diperlukan. Itu dapat berjalan di komputer lain dan berkomunikasi dengan daemon Docker yang berjalan di host machine.

Dockerfile

Dockerfile adalah tempat Anda menulis instruksi untuk membuat Docker Image Anda. Instruksi ini adalah:

  • RUN apt-get y install some-package: Untuk menginstal paket perangkat lunak
  • EXPOSE 8000: mengekspos port
  • Lewati variabel lingkungan ENV ANT_HOME /usr/local/apache-ant

Seperti. Setelah menyiapkan Dockerfile, Anda dapat membuat image menggunakan perintah docker build. Berikut adalah contoh Dockerfile:

# Start with ubuntu 14.04
FROM ubuntu:14.04

MAINTAINER preethi kasireddy [email protected]

# For SSH access and port redirection
ENV ROOTPASSWORD sample

# Turn off prompts during installations
ENV DEBIAN_FRONTEND noninteractive
RUN echo "debconf shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
RUN echo "debconf shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections

# Update packages
RUN apt-get -y update

# Install system tools / libraries
RUN apt-get -y install python3-software-properties \
    software-properties-common \
    bzip2 \
    ssh \
    net-tools \
    vim \
    curl \
    expect \
    git \
    nano \
    wget \
    build-essential \
    dialog \
    make \
    build-essential \
    checkinstall \
    bridge-utils \
    virt-viewer \
    python-pip \
    python-setuptools \
    python-dev

# Install Node, npm
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs

# Add oracle-jdk7 to repositories
RUN add-apt-repository ppa:webupd8team/java

# Make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list

# Update apt
RUN apt-get -y update

# Install oracle-jdk7
RUN apt-get -y install oracle-java7-installer

# Export JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-7-oracle

# Run sshd
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo "root:$ROOTPASSWORD" | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

# Expose Node.js app port
EXPOSE 8000

# Create tap-to-android app directory
RUN mkdir -p /usr/src/my-app
WORKDIR /usr/src/my-app

# Install app dependencies
COPY . /usr/src/my-app
RUN npm install

# Add entrypoint
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

CMD ["npm", "start"]
Docker Image

Image adalah template hanya-baca yang dibangun dari sekumpulan instruksi di Dockerfile. Image tersebut menentukan seperti apa tampilan aplikasi terpaket dan dependensinya serta proses apa yang harus dijalankan saat startup.

Docker Image dibangun menggunakan Dockerfile. Setiap instruksi di Dockerfile menambahkan "lapisan" baru ke Image. Lapisan mewakili bagian dari sistem file Image yang menambah atau mengganti lapisan di bawahnya. Lapisan adalah kunci struktur Docker yang ringan namun kuat. Docker menggunakan Union File System untuk mencapai ini.

Union File Systems

Docker menggunakan Union File Systems untuk membuat image. Union File System dapat dianggap sebagai sistem file yang dapat ditumpuk. Ini berarti bahwa file dan direktori dari sistem file yang terpisah (disebut cabang) dapat dilapisi secara transparan untuk membentuk sistem file tunggal.

Isi direktori dengan jalur yang sama di cabang overlay dianggap sebagai satu direktori gabungan, sehingga tidak perlu membuat salinan terpisah untuk setiap lapisan. Sebagai gantinya, Anda dapat memberi mereka semua penunjuk ke sumber daya yang sama. Jika Anda perlu memodifikasi lapisan tertentu, buat salinan dan ubah salinan lokal, biarkan yang asli tidak berubah. Beginilah cara sistem file *tampak* dapat ditulisi tanpa benar-benar mengizinkan penulisan. (Yaitu, sistem "copy-on-write".)

Sistem berlapis memiliki dua keunggulan utama:

  1. Tanpa kloning:Lapisan membantu menghindari duplikasi set file lengkap setiap kali Anda membuat dan menjalankan penampung baru dengan Image, membuat contoh penampung Container menjadi sangat cepat dan murah.
  2. Pemisahan lapisan: Perubahan lebih cepat dieksekusi. Saat Anda memodifikasi Image, Docker menyebarkan pembaruan hanya ke lapisan yang telah berubah.
volume

Volume adalah bagian "data" dari container dan diinisialisasi saat container dibuat. Volume memungkinkan Anda untuk bertahan dan berbagi data container. Volume data terpisah dari sistem file Union default dan ada sebagai direktori dan file reguler di sistem file host. Oleh karena itu, menghancurkan, memperbarui, atau membangun kembali penampung tidak akan mengubah volume data. Jika Anda ingin memperbarui volume, ubah volume secara langsung. (Sebagai bonus tambahan, volume data dapat dibagikan dan digunakan kembali di beberapa container, yang cukup keren.)

Docker Container

Seperti dijelaskan di atas, Docker Container membungkus perangkat lunak aplikasi ke dalam kotak tak terlihat yang berisi semua yang dibutuhkan aplikasi untuk dijalankan. Ini termasuk sistem operasi, kode aplikasi, runtime, alat sistem, perpustakaan sistem, dll. Docker Container dibuat dari Docker Image. Karena Image bersifat read-only, Docker menambahkan sistem file read-write di atas sistem file read-only gambar untuk membuat container.

image docker

Selain itu, saat Anda membuat container, Docker membuat antarmuka jaringan sehingga container dapat berkomunikasi dengan host lokal, melampirkan alamat IP yang tersedia ke container, dan alamat IP yang Anda tentukan untuk menjalankan aplikasi saat Anda menentukan image.

Setelah berhasil membuat container, Anda dapat menjalankannya di lingkungan apa pun tanpa modifikasi apa pun.

Klik dua kali "container"

Fiuh! Ini memiliki banyak bagian yang bergerak. Satu hal yang selalu membuat saya tertarik adalah bagaimana container sebenarnya diimplementasikan. Terutama karena tidak ada batas infrastruktur abstrak di sekitar container. Setelah banyak membaca, semuanya masuk akal, jadi saya pikir saya akan menjelaskannya di sini! :)

Istilah "container" sebenarnya hanyalah konsep abstrak yang menjelaskan bagaimana beberapa fitur berbeda bekerja sama untuk memvisualisasikan sebuah "container". Mari kita lihat sekilas:

Namespaces

NameSpace memberi container pandangan mereka sendiri tentang sistem Linux yang mendasarinya, membatasi apa yang dapat mereka lihat dan akses. Saat Anda menjalankan container, Docker membuat NameSpace untuk digunakan oleh container tertentu.

Kernel yang digunakan Docker memiliki beberapa tipe NameSpace yang berbeda. Sebagai contoh:

  • NET: Menyediakan container dengan tampilan mereka sendiri dari tumpukan jaringan sistem (mis. perangkat jaringan mereka sendiri, alamat IP, tabel perutean IP, direktori /proc/net, port number, dll.).

  • PID: PID adalah singkatan dari Process ID. Jika Anda pernah menjalankan ps aux di baris perintah untuk melihat proses apa yang sedang berjalan di sistem Anda, Anda akan melihat kolom bernama "PID". Namespace PID menyediakan penampung dengan tampilan tercakup prosesnya sendiri yang dapat dilihat dan berinteraksi dengannya, termasuk init terpisah (PID 1) yang merupakan "leluhur dari semua proses".

  • MNT: Menyediakan container dengan tampilan "mount" mereka sendiri pada sistem. Jadi proses di NameSpace mount yang berbeda memiliki tampilan hierarki sistem file yang berbeda.

  • UTS: UTS adalah singkatan dari UNIX Time Sharing System. Ini memungkinkan proses untuk mengidentifikasi pengidentifikasi sistem (nama host, nama domain, dll.). UTS memungkinkan container untuk memiliki nama host dan nama domain NIS sendiri, terlepas dari container dan sistem host lainnya.

  • IPC: IPC adalah singkatan dari InterProcess Communication. NameSpace IPC bertanggung jawab untuk mengisolasi sumber daya IPC di antara proses yang berjalan dalam setiap container.

  • USER: Namespace ini digunakan untuk memisahkan user dalam setiap container. Ia bekerja dengan mengizinkan container untuk memiliki tampilan rentang uid (user id) dan gid (group id) yang berbeda dibandingkan dengan sistem host. Akibatnya, uid dan gid dari suatu proses dapat berbeda di dalam dan di luar NameSpace pengguna, dan juga memungkinkan bagi suatu proses untuk memiliki pengguna yang tidak memiliki hak istimewa di luar penampung tanpa mengorbankan hak akses root di dalam penampung.

Docker menggunakan NameSpace ini bersama-sama untuk memulai pembuatan container secara terpisah. Fitur berikut ini disebut Control groups.

Control groups

Control groups (juga disebut cgroups) adalah fitur kernel Linux yang memisahkan, memprioritaskan, dan memperhitungkan penggunaan sumber daya (CPU, memori, disk I/O, jaringan, dll.) dari sekumpulan proses. Dalam pengertian ini, cgroups memastikan bahwa Docker Container hanya menggunakan sumber daya yang mereka butuhkan dan, jika perlu, menetapkan batasan pada sumber daya yang dapat digunakan oleh container. Cgroups juga mencegah satu container menghabiskan salah satu sumber daya ini dan menjatuhkan seluruh sistem.

Terakhir, sistem file gabungan adalah fitur lain yang digunakan Docker.

Sistem File Union Terpisah:

Saya menjelaskannya di bagian Docker Image di atas :)

Itulah yang dimaksud dengan Docker Container (tentu saja ada masalah dengan detail implementasi, seperti bagaimana interaksi antara berbagai komponen dikelola).

Masa depan Docker: Docker dan VM akan sama-sama exist

Docker mendapatkan momentum, tetapi saya tidak melihatnya sebagai ancaman nyata bagi VM. container akan terus meningkat popularitasnya, tetapi ada banyak kasus penggunaan di mana VM lebih cocok.

Misalnya, jika Anda perlu menjalankan banyak aplikasi di banyak server, mungkin masuk akal untuk menggunakan VM. Di sisi lain, Docker memiliki beberapa keunggulan menarik saat Anda perlu menjalankan banyak "salinan" dari satu aplikasi.

Selain itu, container memungkinkan Anda untuk membagi aplikasi Anda menjadi lebih fungsional, bagian-bagian terpisah untuk memisahkan masalah, tetapi mereka juga meningkatkan jumlah bagian untuk dikelola dan dapat menjadi berat.

Keamanan juga menjadi perhatian dengan Docker Container. container berbagi kernel yang sama, sehingga penghalang di antara keduanya tipis. VM penuh hanya dapat mengeluarkan hypercall ke hypervisor host, sementara Docker Container dapat membuat syscall ke kernel host, meningkatkan permukaan serangan. Jika keamanan sangat penting, pengembang lebih cenderung memilih VM yang diisolasi oleh perangkat keras abstrak, membuat interferensi timbal balik jauh lebih sulit.

Tentu saja, masalah seperti keamanan dan manajemen pasti akan berkembang karena container lebih banyak diekspos dalam produksi dan mendapat lebih banyak pengawasan dari pengguna. Ini untuk bernapas para pengembang.

Kesimpulan

Saya harap Anda belajar lebih banyak tentang Docker dan memiliki pengetahuan yang Anda perlukan untuk menggunakannya dalam proyek Anda suatu hari nanti. Seperti biasa, jika saya membuat kesalahan, atau jika ada sesuatu yang membantu, beri saya komentar! :)