Tutorial Docker— #6 Dockerfile
Seri Belajar Docker dalam Bahasa Indonesia
Halo, bagi kalian yang belum paham mengenai Docker bisa membaca artikel sebelumnya:
Format dari Dockerfile
Sebelumnya, kita sudah mengetahui arsitektur dari Docker mulai dari Docker client, engine, dan registry.
Nah, dalam Docker engine terdapat container untuk membungkus app yang akan kita running. Tapi sebelum itu, tau ngga isi dari Docker engine?
Docker engine berisikan Dockerfile untuk membangun app (build), Docker image yang berupa app (ship), dan Container untuk menjalankan app terbseut (run).
Dockerfile
Fungsi dari dockerfile yaitu:
- Kumpulan command untuk menginstruksikan Docker engine
- Fitur utama untuk berinteraksi dengan Docker
- Setiap command membentuk suatu layer
- Setiap layer bisa digunakan ulang oleh Docker (Cache & Reuse)
Supaya kalian paham, gua jabarkan urutan sebagian command dockerfile yang akan kita pelajari
- Fundamental Instructions
FROM
ARG
- Configuration Instructions
RUN
ADD | COPY
ENV
- Execution Instructions
CMD
ENTRYPOINT
EXPOSE
Fundamental Instructions
Menulis kode untuk Docker
Perintah Linux dan Docker Dasar
- Menunjukkan direktori saat ini
$ pwd
/home/gipey
- Mengurutkan direktori dari A-Z
$ tree -L 1
.
├── Desktop
├── Documents
├── Downloads
├── javasharedresources
├── Music
├── Pictures
├── Public
├── snap
├── Templates
└── Videos10 directories, 0 files
- Cari folder CC_Docker berdasarkan tutorial yang gua cantumin direfensi
$ cd Downloads
$ ls
CC_Docker$ cd CC_Docker
$ tree -l -d
.
├── S2
│ ├── D1
│ ├── D2
│ ├── D6
│ └── D7
└── S66 directories
Catatan:
ls (menampilkan list direktori, posisi horizontal)
-L atau -l (menampilkan list direktori, posisi vertikal)
-d (Menampilkan subdirektori)
tree (menampilkan list dan sublist secara bersamaan)
- Masuk ke direktori D1, buat sebuah file dengan nama Dockerfile
$ cd CC_Dcoker/S2/D1
$ pwd
CC_Dcoker/S2/D1$ touch Dockerfile
$ ls
Dockerfile
- Tambah beberapa command didalam Dockerfile
$ nano DockerfileARG CODE_VERSION=20.04FROM ubuntu:${CODE_VERSION}RUN apt-get update -yCMD ["bash"]
Catatan:
ARG CODE_VERSION (Versi yang akan kita pakai)
FROM ubuntu:$(CODE_VERSION) (Pull image Ubuntu 20.04 dari Docker hub)
RUN apt-get (Setelah RUN, yaitu command linux biasa secara opsional)
CMD [“bash”] (Bahasa yang dipakai, yaitu bash script)
- Gunakan Docker build
$ pwd
/CC_Docker/S2/D1
$ docker build -t img_from .
- Verifikasi
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
img_from latest 7fxxxxxxxxxx 18 seconds ago 100MB
<none> <none> dfxxxxxxxxxx 4 minutes ago 100MB
ubuntu 20.04 f6xxxxxxxxxxx 4 weeks ago 72.9MB
hello-world latest bfxxxxxxxxxx 13 months ago 13.3kB
Configuration Instructions
- Saatnya kita pindah ke direktori D2 sekaligus membuat file dengan nama Dockerfile
$ cd CC_Docker/S1/D2
$ touch Dockerfile
- Tambah beberapa command didalam Dockerfile
$ nano DockerfileFROM ubuntu:20.04RUN apt-get update && apt-get install -y curl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*RUN mkdir /home/docker_codes_trialENV USER gipey
ENV SHELL /bin/bash
ENV LOGNAME gipeyCMD ["bash"]
Catatan:
FROM ubuntu:20.04 (mengambil dari image yang kita pull)
RUN mkdir /home/docker_code(direktori yang menjadi tujuan)
- Gunakan Docker build
$ pwd
/CC_Docker/S2/D2
$ docker build -t img_run-env .
- Menjalankan container dalam Docker
$ docker run -itd --name cont_run-env img_run-env
Catatan:
- -name cont_run-env (nama kontainernya)
- Lihat container yang sedang berjalan
$ docker ps- a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7exxxxxxxxxx img_run-env "bash" 5 seconds ago Up 5 seconds cont_run-env
- Menjalankan image (Ubuntu 20.04) yang berada didalam container cont_run-env
$ docker exec -it cont_run-env bash
Expose Instructions (Nginx Web-server)
- Saatnya kita pindah ke direktori D6 sekaligus membuat file dengan nama Dockerfile
$ cd CC_Docker/S1/D6
$ touch Dockerfile
- Tambah beberapa command didalam Dockerfile
$ nano DockerfileFROM ubuntu:20.04RUN apt-get update && apt-get install nginx -y \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*EXPOSE 80CMD ["nginx", "-g", "daemon off;"]
Catatan:
EXPOSE 80 (Docker port listening, http)
- Gunakan Docker build
$ pwd
/CC_Docker/S2/D6
$ docker build -t img_expose .
- Verifikasi
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
img_expose latest bbxxxxxxxxxx 13 seconds ago 132MB
img_run-env latest baxxxxxxxxxxx 32 minutes ago 89.1MB
img_from latest 7fxxxxxxxxxx 43 minutes ago 100MB
<none> <none> dfxxxxxxxxxx 47 minutes ago 100MB
ubuntu 20.04 f6xxxxxxxxxxx 4 weeks ago 72.9MB
hello-world latest bfxxxxxxxxxx 13 months ago 13.3k
- Menjalankan container dalam Docker
$ docker run -itd --rm --name cont_expose -p 8080:80 img_expose
Catatan:
8080:80 (80 milik Nginx berupa HTTP dan 8080 milik Docker container secara default)
- Lihat container yang sedang berjalan
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15xxxxxxxxxx img_expose "nginx -g 'daemon of…" 42 seconds ago Up 41 seconds 0.0.0.0:8080->80/tcp cont_expose
7exxxxxxxxxx img_run-env "bash" 31 minutes ago Up 31 minutes cont_run-env
11xxxxxxxxxx hello-world "/hello" 29 hours ago Exited (0) 29 hours ago unruffled_herschel
- Silahkan coba menjalankannya lewat browser
Apache Web-server Demo
- Stop process untuk Nginx sebelum memakai Apache karena web-server ini menggunakan port yang sama(8080:80)
$ docker container stop cont_expose
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7exxxxxxxxxx img_run-env "bash" 48 minutes ago Up 48 minutes cont_run-env
11xxxxxxxxxx hello-world "/hello" 29 hours ago Exited (0) 29 hours ago unruffled_herschel
- Saatnya kita pindah ke direktori D7 sekaligus membuat file dengan nama Dockerfile
$ cd CC_Docker/S1/D7
$ touch Dockerfile
- Tambah beberapa command didalam Dockerfile
$ nano DockerfileFROM ubuntu:20.04ARG DEBIAN_FRONTEND=noninteractiveRUN apt-get update && apt-get install apache2 -y \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENV TZ=Asia/Jakarta
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2EXPOSE 80CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
- Gunakan Docker build
$ pwd
/CC_Docker/S2/D7
$ docker build -t img_apache .
- Verifikasi
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
img_apache latest faxxxxxxxxxx About a minute ago 186MB
img_expose latest bbxxxxxxxxxx About an hour ago 132MB
img_run-env latest baxxxxxxxxxx 2 hours ago 89.1MB
img_from latest 7fxxxxxxxxxx 2 hours ago 100MB
ubuntu 20.04 f6xxxxxxxxxxx 4 weeks ago 72.9MB
hello-world latest bfxxxxxxxxxx 13 months ago 13.3kB
- Menjalankan container dalam Docker
$ docker run -itd --rm --name cont_apache -p 8080:80 img_apache
Catatan:
8080:80 (80 milik Nginx berupa HTTP dan 8080 milik Docker container secara default)
- Lihat container yang sedang berjalan
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15xxxxxxxxxx img_expose "nginx -g 'daemon of…" 42 seconds ago Up 41 seconds 0.0.0.0:8080->80/tcp cont_expose
7exxxxxxxxxx img_run-env "bash" 31 minutes ago Up 31 minutes cont_run-env
11xxxxxxxxxx hello-world "/hello" 29 hours ago Exited (0) 29 hours ago unruffled_herschel
- Silahkan coba menjalankannya lewat browser
Have a nice day!
Ghifari Nur Athoillah, Mahasiswa di Program Profesi CCIT-Fakultas Teknik Universitas Indonesia