Tugas - 10 Docker Image
Apa itu docker image
Docker adalah aplikasi open source untuk menyatukan file-file yang dibutuhkan sebuah software sehingga menjadi menjadi satu kesatuan yang lengkap dab berfungsi. Data pengaturan dan file pendukung disebut sebagai image. Selanjutnya kumpulan image digabung dalam satu wadah yang disebut Container.
Docker Image adalah sebuah kumpulan root file system dan execution parameter atau command yang digunakan dalam container runtime. Terdiri dari app binaries, dependencies, metada data dan minimum OS
- File – App binaries dan dependencies yang telah kita develop
- Metadata – Informasi detail mengenai image dan bagaimana cara menjalankanya
- Minimum OS – Hanya mengandung binaries OS yang dibutuhkan saja
Image Repository – Docker Hub
Official Docker Image Repository, Docker Hub adalah salah satu cloud service untuk mencari, mendownload dan mengupload docker image. Pertama kita akan membuat akun docker hub https://hub.docker.com/ agar bisa mengupload image ke docker hub, diperlukan login di terminal/command prompt, Untuk login pada docker kita cukup ketikan sintak di bawah ini pada terminal kita.
Bagaimana Mencari Docker Image Yang Baik?
1. Gunakan menu explorer
Kunjungi https://hub.docker.com/search?q=&type=image dan cari image yang kita inginkan, misalkan nginx
2. Official image first
Gunakan image yang official, lalu Lihat jumlah download dan star, semakin besar semakin bagus dan juga Lihat latest modified, semakin baru semakin bagus
3. Image tag
Pilihlah image tag yang sesuai pada Best practice, untuk development gunakan latest tag, untuk production gunakan spesifik tag
4. Pilih base image OS
Pilih base image OS sesuai dengan kebutuhan, jika memungkinkan, pilihlah image OS yang paling kecil, misalkan alpine
Praktikum
1. Download image
2. Melihat Image yang ada di local Komputer
Cukup dengan menjalankan command pada terminal3. Membuat Tag
docker image tag <image_name> <new_image>:<tag_name>
docker image tag : docker image tag nginx username/nginx:latest
4. Push Image
docker image push <image_name>:<tag_name>
docker image push username/nginx:latest
Apa itu Dockerfile dan bagaimana code nya?
Dockerfile adalah file yang perlu kita buat dan berisi mengenai code-code atau command yang perlu dijalankan supaya bisa mem-build dan me-run image
1. FROM
Ini adalah base image OS, Bisa menggunakan speisifk tag : https://hub.docker.com/_/nginx
2. RUN
Setiap menjalankan command line, awalai dengan RUN, RUN adalah arbitrary shell command
3. EXPOSE dan ENV
EXPOSE digunakan untuk open port pada virtual network, sehingga bisa di baca oleh Host OS. ENV digunakan untuk men-setting environtment variable
4. CMD
Command yang akan dijalankan ketika menjalankan docker container
# NOTE: this example is taken from the default Dockerfile for the official nginx Docker Hub Repo
# https://hub.docker.com/_/nginx/
# NOTE: This file is slightly different than the video, because nginx versions have been updated
# to match the latest standards from docker hub... but it's doing the same thing as the video
# describes
FROM debian:stretch-slim
# all images must have a FROM
# usually from a minimal Linux distribution like debian or (even better) alpine
# if you truly want to start with an empty container, use FROM scratch
ENV NGINX_VERSION 1.13.6-1~stretch
ENV NJS_VERSION 1.13.6.0.1.14-1~stretch
# optional environment variable that's used in later lines and set as envvar when container is running
RUN apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y gnupg1 \
&& \
NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
found=''; \
for server in \
ha.pool.sks-keyservers.net \
hkp://keyserver.ubuntu.com:80 \
hkp://p80.pool.sks-keyservers.net:80 \
pgp.mit.edu \
; do \
echo "Fetching GPG key $NGINX_GPGKEY from $server"; \
apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \
done; \
test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \
apt-get remove --purge -y gnupg1 && apt-get -y --purge autoremove && rm -rf /var/lib/apt/lists/* \
&& echo "deb http://nginx.org/packages/mainline/debian/ stretch nginx" >> /etc/apt/sources.list \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y \
nginx=${NGINX_VERSION} \
nginx-module-xslt=${NGINX_VERSION} \
nginx-module-geoip=${NGINX_VERSION} \
nginx-module-image-filter=${NGINX_VERSION} \
nginx-module-njs=${NJS_VERSION} \
gettext-base \
&& rm -rf /var/lib/apt/lists/*
# optional commands to run at shell inside container at build time
# this one adds package repo for nginx from nginx.org and installs it
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
# forward request and error logs to docker log collector
EXPOSE 80 443
# expose these ports on the docker virtual network
# you still need to use -p or -P to open/forward these ports on host
CMD ["nginx", "-g", "daemon off;"]
# required: run this command when container is launched
# only one CMD allowed, so if there are multiple, last one wins
Bagaimana Cara Membuat Docker File
1. Kita akan membuat custome nginx image melalui Dockerfile
2. Buat folder baru dengan nama custom-nginx
3. Create docker file – custom-nginx/Dockerfile
# NOTE: this example is taken from the default Dockerfile for the official nginx Docker Hub Repo
# https://hub.docker.com/_/nginx/
# NOTE: This file is slightly different than the video, because nginx versions have been updated
# to match the latest standards from docker hub... but it's doing the same thing as the video
# describes
FROM debian:stretch-slim
# all images must have a FROM
# usually from a minimal Linux distribution like debian or (even better) alpine
# if you truly want to start with an empty container, use FROM scratch
ENV NGINX_VERSION 1.13.6-1~stretch
ENV NJS_VERSION 1.13.6.0.1.14-1~stretch
# optional environment variable that's used in later lines and set as envvar when container is running
RUN apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y gnupg1 \
&& \
NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
found=''; \
for server in \
ha.pool.sks-keyservers.net \
hkp://keyserver.ubuntu.com:80 \
hkp://p80.pool.sks-keyservers.net:80 \
pgp.mit.edu \
; do \
echo "Fetching GPG key $NGINX_GPGKEY from $server"; \
apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \
done; \
test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \
apt-get remove --purge -y gnupg1 && apt-get -y --purge autoremove && rm -rf /var/lib/apt/lists/* \
&& echo "deb http://nginx.org/packages/mainline/debian/ stretch nginx" >> /etc/apt/sources.list \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y \
nginx=${NGINX_VERSION} \
nginx-module-xslt=${NGINX_VERSION} \
nginx-module-geoip=${NGINX_VERSION} \
nginx-module-image-filter=${NGINX_VERSION} \
nginx-module-njs=${NJS_VERSION} \
gettext-base \
&& rm -rf /var/lib/apt/lists/*
# optional commands to run at shell inside container at build time
# this one adds package repo for nginx from nginx.org and installs it
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
# forward request and error logs to docker log collector
EXPOSE 80 443
# expose these ports on the docker virtual network
# you still need to use -p or -P to open/forward these ports on host
CMD ["nginx", "-g", "daemon off;"]
# required: run this command when container is launched
# only one CMD allowed, so if there are multiple, last one wins
6. Code tersebut akan membuat image dengan nama custom-nginx:latest berdasarakan pada file custom-nginx/Dockerfile
7. Kita juga bisa memberikan tag dengan menjalankan command docker
8. Secara default docker akan membaca file Dockerfile, kita bisa membuat custom docker file name, misalkan kita membuat dockerfile dengan nama custom-nginx/DockerfileCustom Untuk mem-build nya gunakan command ini:
docker image build –f DockerfileCustom -t custom-nginx
9. Untuk pertama kali build, kalua image FROM nya belum ada di local maka akan mendownload dulu dari Docker Hub
10. Docker akan meng-cache FROM base image command-command yang dijalankan, sehingga ketika melakukan build selanjutnya akan menjadi lebih cepat.Untuk melihat image yang sudah di build gunakan command docker image ls
Membuat Web App Image
1. Kita akan membuat dan menjalankan web app dengan menggunakan docker
2. Buat folder baru dengan nama nginx-web-app
3. Create file Dockerfile dan Index.html , disini saya menambahkan stylenya juga
FROM nginx:latest
WORKDIR /usr/share/nginx/html
COPY index.html index.html
COPY main.css main.css
Docker File
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Hello World</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" type="text/css" media="screen" href="main.css" />
</head>
<body>
<div class="parent">
<div class="child">
<div>
<code>Docker Container Run</code><br />
Hello World
</div>
</div>
<div class="child">This is web app in docker</div>
</div>
</body>
</html>
index.html
4. Build image: docker image build -t nginx-web-app .
5. Lihat image yang barusan dibuild: docker image ls
6. Run container: docker container run -p 80:80 --rm nginx-web-app
7. Pada browser buka http://localhost atau http://127.0.0.1
8. Halaman tersebut akan berisi file index.html
10. Push image ke dokcer hub: docker image push nginx-web-app:latest Dockerize Lumen App
Kita akan membuat dan menjalankan lume app dengan menggunakan docker
1. Buat project baru:
composer create-project --prefer-dist laravel/lumen lumen-app
2. Create file Dockerfile
FROM php:7.4.16-fpm
RUN apt-get update -y && apt-get-install -y libmcrypt-dev libonig-dev openssl zip unzip git
RUN docker-php-ext-install pdo pdo_mysql_mbstring
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
WORKDIR /app
COPY . /app
RUN composer install
CMD ["php", "-S", "0.0.0.0:8000", "-t", "public"]
EXPOSE 8000
3. Build image:
docker image build -t lumen-app .
7. Menyiapkan tagging untuk push:
docker image tag lumen-app:latest <username>/lumen-app:latest
8. Push image ke dokcer hub:
docker image push <username>/lumen-app:latest