Tutorial Docker— #7 Docker Images dan Containers
Seri Belajar Docker dalam Bahasa Indonesia
Halo, bagi kalian yang belum paham mengenai Docker bisa membaca artikel sebelumnya:
Saatnya kita memperdalam lagi yah, pembahasan mengenai Docker images.
Docker Images
Pengertiannya secara singkat yaitu kumpulan dari beberapa commands/instructions yang terstruktur.
Docker images punya 2 tingkatan, top layer dan common layer (layer yang tepat berada di bawah “top layer”). Top layer menggunakan permission Read-Write (RW) sedangkan common layer menggunakan permission Read-Only (RO).
Kalo kalian tau, setiap images dan containers secara default punya nickname dan ID yang selalu berbeda (unique) diambil dari Docker Hub.
Docker Hub sebagai cloud service dan kumpulan images dari berbagai developer termasuk official partner dari Docker (MySQL, mongoDB, Laravel, Nginx, Apache, dll)
Docker Hub
Kita bisa akses Docker Hub disini. Berbagai aktifitas seperti push dan pull bisa dilakukan oleh pengguna Docker client seperti kita saat ini.
Ngga perlu basa-basi. yuk kita mulai tutorial menggunakan Docker Hub.
Overview
- Buka Docker Hub
- Daftar/masukkan email dan password
- Dashboard meliputi repository, images, organization, dan audit logs
Search
Karena daritadi menggunakan Web based, yuk saatnya kita pindah ke CLI untuk merasakan mencari images dengan Docker command
- Kita coba mencari images dan containers dari official repository dengan klik explore di navbar
- Selanjutnya, kita akan menggunakan terminal. Coba mencari images python
$ docker search pythonatau$ docker search python:3.6
Catatan:
python (kalo hanya ARG python maka docker membaca versi latest)
python=3.6 (docker membaca python versi 3.6)
- Gunakan filter untuk mencari keyword tertentu
$ docker search --filter "is-official=true" python
Catatan:
- -filter “keyword yang ingin difilter” <nama images>
is-official=true (official dari nama kolom nya. True adalah sebuah nilai seperti true/false
- Memunculkan images
$ docker images
- Memunculkan images yang lebih spesifik (contohnya ubuntu)
$ docker images ubuntuatau$ docker images ubuntu:18.04
Catatan:
ubuntu:18.04 (nama images beserta tag/versi nya)
Push & Pull
Pull
Bisa dikatakan pull mirip dengan download. Jadi, kita akan mengambil images dari Docker Hub ke Docker Host PC kita.
- Pull images Nginx dengan tag latest
$ docker pull nginx:latest
- Pull images Nginx dengan seluruh tag yang tersedia di Docker Hub
$ docker pull --all-tags nginx
Push
Kita pun bisa push/upload images dan container ke Docker Hub
- Buat repository di Docker Hub
- Beri nickname dan description pada repository yang akan kita buat
- Atur privileges, repository nya akan dimunculkan ke public atau private
- Sekarang, Docker pun bisa terintegrasi dengan Github dan Bitbucket (opsional) dan tekan create
- Berikut tampilan dari admin yaitu kita sendiri, akan ada Docker push command untuk upload dari Docker Host/Machine yang kita pake sekarang ke Docker Hub
- Berikut tampilan dari publik. Publik bisa pull/download repository sesuka hati ke Docker Host nya
- Saatnya kita push suatu images ke Docker Hub. Buka CLI dan login ke Docker Hub
$ docker login
- Kita membuat images baru terlebih dahulu
$ docker tag nginx:latest gipeypey/ubuntu_gipey:cc-nginx
Catatan:
gipeypey
(nama akun Docker Hub)
ubuntu_gipey
(nama repository)
cc-nginx
(custom tag/versi untuk images kita yang baru)
- Push images ke Docker Hub
$ docker push gipeypey/ubuntu_gipey:cc-nginx
- Cek Docker Hub
Inspect & History
Sebelumnya, kita udah mencoba variasi command dari docker images
.Nah supaya lebih detail setiap images, maka kita bisa menggunakan argumen inspect
dan history
Inspect
Command inspect akan memunculkan informasi yang detail dari setiap object dalam images yang terdaftar di Docker Engine milik kita. inspect
akan lebih berguna kalau digunakan untuk debugging
- Melihat images dengan nama yang spesifik
$ docker images ubuntu
- Gunakan command
inspect
untuk melihat informasi detail dari image tersebut dalam bentuk JSON array
$ docker inspect ubuntu:20.04
Catatan:
id (image id dari ubuntu:latest)
RepoTags (versi dari image ubuntu)
RepoDigests (64 bit hex number)
Container (container identifier)
Container config (configuration detail tentang image tersebut)
Architecture (arsitektur dari images tersebut)
OS (ubuntu keluarga dari Linux)
- Karena informasi tersebut sangat banyak, maka kita bisa filter dengan cara
$ docker inspect --format "{{.RepoTags}} : {{.RepoDigests}}" ubuntu:20.04
Catatan:
{{.RepoTags}}
(salah satu dari variable kunci dalam informasi images)
- atau convert format tersebut menjadi sebuah file .txt dengan cara
$ docker inspect --format "{{json .Config}}" ubuntu > inspect_report_ubuntu.txt
Catatan:
ubuntu (images yang sesuai di command
docker images
)inspect_report_ubuntu.txt (nama dan ekstensi file)
History
docker history
akan menampilkan log (created by) dalam sebuah images.
- Kita coba menggunakan history dengan img_apache yang sudah kita install beberapa waktu lalu
$ docker image history img_apache
Pruning & Removing Images
Remove
- Hapus image menggunakan
rm
$ docker rm nginx:latest
- Hapus image menggunakan
rmi
untuk image ID
$ docker rmi 35c43ace9216
Jika kalian menggunakan
-- all-tags
akan terhapus image yang memiliki ID yang sama
Docker Container
Container Run V.S Create
Daritadi kita sudah belajar membuat images, push & pull, filtering, dll. Tapi, kita lupa dengan container yang pernah kita buat pada materi sebelumnya. Nah, saat nya kita belajar container lebih dalam.
- Membuat container sekaligus terdapat images dengan nama custom untuk images busybox
$ docker container create -it --name cc-busybox-1 busybox:latest
Catatan:
Created (status yang baru saja dibuat, belum running)
-it
(images yang sesuai di commanddocker images
)
- -name cc-busybox
(nama custom yaitu cc-busybox-1 untuk container kita)
busybox:latest
(image dari Docker Hub)
- Membuat container, menjalankan, dan sudah terdapat images didalamnya hanya menggunakan satu baris command
$ docker container run -itd --rm --name cc-busybox-2 busybox:latest
Start
- Menjalankan container cc-busybox-1 yang baru saja dibuat dengan status “created”
$ docker container start cc-busybox-1
- Cek kembali
$ docker ps -a
Stop
- Menghentikan container cc-busybox-2
$ docker container stop cc-busybox-2
Catatan:
Yang jadi pertanyaan adalah, mengapa cc-busybox-2 ngga ada di container list?
Coba scroll keatas, kalian sudah eksekusi command
--rm --name cc-busybox-2
, argumen--rm
adalah menghapus container saat ngga dipakai/stop/running supaya storage kita ngga penuh
Restart
- Gunakan restart saat terjadi masalah di container tersebut
$ docker container restart cc-busybox-aatau$ docker container restart --time 5 cc-busybox-a
Catatan:
--time 5
(buffer selama 5 detik)
Rename
- Kalo kalian pengen ubah nama container karena suatu hal, gunakan command dibawah ini
$ docker container rename cc-busybox-1 busybox1
Catatan:
cc-busybox-1
(nama container yang saat ini)
busybox1
(nama container yang baru)
Attach
Attach
berguna untuk melihat standard I/O dan standard error di Docker client
- Masuk ke environment pada container
busybox1
$ docker container attach busybox1
- Saat environment ditutup menggunakan command
exit
, maka container tersebut akan berhenti process nya
Execute
- Menggunakan command exec harus dalam keadaan container sedang running
$ docker container start busybox1
exec
berguna saat kita hanya mengeksekusi satu command saja dan ngga akan memberhentikan process dari container
$ docker exec -it busybox1 pwd
Catatan:
pwd
(salah satu command linux, kalian bisa menggunakan command lainnya)
Port Mapping
Pada materi sebelumnya, kita sudah mencoba port mapping pada Expose Configuration. Port mapping bertujuan untuk mengubah port pada container.
- Port mapping pada Expose Configuration
$ docker container run -itd --name cont_nginx -p 8080:80/tcp img_expose
Catatan:
cont_nginx
(nama custom untuk container)
-p 8080:80/tcp
(port default container yaitu 8080 dan 80 adalah port untuk HTTP)Apa jadinya jika port mapping command hanya
-P
? maka, docker akan memberikan random port container secara otomatis
- Cara melihat port yang digunakan oleh container
$ docker container port cont_expose
80/tcp -> 0.0.0.0:8080
Clean Up
- Menghapus container dengan
rm
$ docker container rm cont_expose cont_run-env hello-world busybox1atau$ docker container rm be1c6c7fe697
Catatan:
Saat menghapus container, harus dalam keadaan berhenti/stop process
- Kalau masih mau menghapus container saat keadaan running/up gunakan
--force
$ docker container rm cont_expose --force
- Gunakan banner/notification saat container tersebut dihapus
$ docker container kill --signal=SIGTERM cont_expose
- Menghapus seluruh container yang ngga terpakai (exited & dangling)
$ docker container prune
Have a nice day!
Ghifari Nur Athoillah, Mahasiswa di Program Profesi CCIT-Fakultas Teknik Universitas Indonesia