Sebenarnya saya telat ya menulis artikel ini, karena saya malah sudah membahas container orchestration wkwkwk. Jadi saya menulis ini dikarenakan ada seseorang yang meminta saya untuk dijelaskan tentang Docker, dia seorang programmer yang baru saja mendapat pekerjaan dan perusahaannya (mungkin) menuntut dia agar bisa menguasai Docker. Sekarang yang jadi pertanyaan, “Kenapa seorang programmer harus memahami Docker?”, jawabannya adalah (menurut saya) dikarenakan konsep Microservices yang kian populer kontainerisasi menjadi sesuatu yang penting didalam suatu instansi/perusahaan, sebenarnya ada seorang DevOps yang akan mengurus tentang kontainerisasi, namun programmer pun akan dipaksa bekerja dalam environment kontainer tersebut yang menghasilkan statement bahwa programmer pun juga harus mengenal atau menguasai kontainerisasi dalam konteks artikel ini yaitu Docker. Atau dalam kasus lain, dikantornya mungkin dia adalah Programmer Superman.
Apa itu Docker dan Apa perbedaannya dengan VM
Seperti yang sudah saya singgung sebelumnya tentang kontainerisasi, Docker merupakan sebuah tempat yang menampung program beserta library, file konfigurasi, dll. Kontainer ini berbeda dengan virtual machine yang mana perbedaanya terdapat pada penggunnan sistem operasi pada masing-masing nodenya. Virtualisasi berjalan diatas hypervisor dan guest OS, docker dapat menjalankan aplikasi langsung tanpa kedua hal tersebut.
Lebih jelasnya perhatikan bagan berikut :
Kenapa Pakai Docker?
- Ya… seperti yang sudah anda baca diatas, daripada kita menggunakan VM untuk aplikasi berbasis microservices, yang harus melakukan installasi OS, Aplikasi, library, dll. Lebih baik menggunakan container.
- VM juga saya rasa terlalu boros dalam hal resources terutama storage. Jadi kehadiran docker sangat membantu kita.
- Untuk Docker sendiri menurut saya penggunaannya simpel dan perintah-perintahnya mudah dipahami (namun docsnya lumayan sampah).
- Docker bersifat Open source dibawah lisensi Apache Versi 2.0 yang bisa dipergunakan secara gratis.
Komponen Docker
Terdapat beberapa komponen pada Docker yang saling membutuhkan satu sama lain. Diantaranya adalah :
- Docker Image : merupakan sebuah template yang bersifat read-only, di dalamnya akan terdapat sistem operasi beserta aplikasi. Image dasar dapat dibuat sendiri dengan menambahkan aplikasi yang dibutuhkan ke dalam Dockerfile dan hasilnya dapat kita simpan ke Registry.
- Docker Container : merupakan runtime instance dari Docker image. Container mengandung seluruh kebutuhan untuk aplikasi sehingga aplikasi dapat berjalan dengan cara yang terisolasi.
- Docker Registry : merupakan komponen penyimpanan untuk Docker image. Berupa repository yang dapat diatur public maupun private, untuk kepentingan kolaborasi bersama orang lain. Docker Hub merupakan repository cloud yang disediakan oleh Docker secara gratis. Docker Hub sendiri adalah repository yang bersifat public. Jika ingin private, mungkin kalian dapat mencoba Gitlab, Bitbucket, dll.
- Dockerfile : berupa file yang mengandung serangkaian instruksi tentang bagaimana membangun Docker Image. Docker image tersebut mengandung setiap kode dengan dependensinya. Contoh Dockerfile yang sederhana dengan image
node.js versi 10
.
1
2
3
4
5
|
FROM node:10
WORKDIR /usr/app
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
|
Pelajari Dulu Basic Commandnya
Basic Command ini sebenarnya, perintah-perintah Docker yang sering digunakan saja, untuk perintah-perintah yang lain silahkan kalian explore sendiri ya. Saya sengaja menuliskannya berurutan, agar kalian mudah untuk mempelajarinya terutama step-by-step
nya. Langsung saja, berikut adalah listnya :
Mengunduh Docker Image
Kita bisa mengunduh Docker image dari registry dengan perintah Docker Pull. Commandnya sangat sederhana, sebagai contoh saya ingin mengunduh image nginx
dengan tag latest.
1
|
docker pull nginx:latest
|
Melihat daftar image yang dimiliki
1
2
3
|
docker images
# Atau
docker image ls
|
Mengganti nama/tag image
Ini biasanya berfungsi saat kita ingin mengunggah image ke registry docker hub. Dalam docker hub, image yang diunggah harus berformat <username>/<nama_image>
. Berikut contoh perintahnya.
1
2
3
|
docker tag <nama_image>:<tag> <username>/<nama_image>:<tag>
# Contoh
docker tag nginx:latest leon0408/nginx:10.0
|
Menghapus Image
1
2
3
4
|
# Delete 1 image
docker image rm nginx:latest
# Delete semua image yang tidak terpakai
docker image prune -a
|
Membuat Docker Image
Untuk langkah ini, sebenarnya kita harus punya Dockerfile terlebih dahulu. Anyway… Berikut perintahnya.
1
2
3
|
docker build -t <nama_image> <direktori_dockerfile>
# Contoh
docker build -t aplikasi_kasir .
|
Membuat Container
1
2
3
|
docker container create --name <nama_container> -p <port_yang_dikeluarkan>:<port_container> <nama_image>
# Contoh
docker container create --name server-nginx -p 80:80 nginx
|
Menjalankan Container
1
2
3
|
docker start <nama_container>
# Contoh
docker start server-nginx
|
Membuat sekaligus Menjalankan Container
Sebenarnya ada cara untuk membuat container sekaligus menjalankannya, yaitu dengan menggunakan perintah docker run
. Jika kalian lihat perintah dibawah terdapat -d
, itu berfungsi agar container berjalan di backgroud. Karena defaultnya, dengan perintah ini container akan berjalan dengan menampilkan log.
1
2
3
|
docker run -d -p <port_yang_dikeluarkan>:<port_container> --name <nama_container> <nama_image>
# Contoh
docker run -d -p 81:80 --name server-nginx-2 nginx
|
Lalu bisa kalian cek dengan membuka browser, lalu memasukkan URL http://localhost:81.
Melihat Container
1
2
3
4
5
6
7
|
# Melihat Container yang berjalan
docker ps
# Melihat semua Container
docker ps -a
# Output
dd8749428a66 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:81->80/tcp server-nginx-2
54a5c626a82b nginx "/docker-entrypoint.…" 4 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp server-nginx
|
Stop & Restart Container
1
2
3
4
|
# Stop
docker stop <nama_container>
# Restart
docker restart <nama_container>
|
Menghapus Container
Untuk menghapus kontainer, posisi kontainer harus dalam keadaan mati/stopped. Jika ingin menghapus kontainer yang sedang berjalan secara paksa, kalian bisa menambahkan flag -f
.
1
2
3
|
docker container rm <nama_container>
# Atau
docker rm <nama_container>
|
Login Registry
Sebagai contoh, disini saya login ke registry docker hub, dengan akun saya sendiri.
1
2
3
4
5
6
7
8
9
10
11
|
# Command
docker login
# Login Prompt
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: leon0408
Password:
WARNING! Your password will be stored unencrypted in /home/dark/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
|
Push Image ke Registry
Jika kalian bingung kenapa imagenya tidak bisa diunggah karena tadi bacanya di skip-skip. Mending kalian baca lagi perintah untuk mengganti nama image.
1
2
3
|
docker push <nama_image>:<tag>
# Contoh
docker push leon0408/nginx:10.0
|
Penutup
Menurut saya sampai disitu saja penjelasan dari saya. Jika ada tambahan atau pertanyaan, silahkan tampung pada kolom komentar. Sekian dan terimakasih…
Referensi