Docker adalah virtualisasi tingkat sistem operasi yang terutama ditujukan untuk pengembang dan sysadmin. Docker mempermudah pembuatan dan penerapan aplikasi di lingkungan yang terisolasi.
Dockerfile adalah skrip yang berisi kumpulan perintah dan instruksi yang akan dieksekusi secara otomatis secara berurutan di lingkungan buruh pelabuhan untuk membangun image buruh pelabuhan baru.
Dalam tutorial ini, kami akan menunjukkan cara membuat gambar Docker Anda sendiri dengan Dockerfile. Kami akan menjelaskan detail terkait Dockerfile agar Anda dapat membangun image Docker Anda sendiri.
Prasyarat
Untuk panduan ini, kami akan menggunakan Ubuntu 18.04 dengan 1GB RAM, 25 GB ruang disk kosong, dan 2 CPU. Selain itu, kami akan menggunakan Ubuntu 18.04 sebagai gambar dasar untuk membuat gambar Docker khusus.
Pengantar Perintah Dockerfile
Dockerfile adalah skrip yang berisi semua perintah untuk membangun image Docker. Dockerfile berisi semua instruksi yang akan digunakan untuk membuat image Docker dengan perintah 'docker build'.
Sebelum membuat Dockerfile pertama Anda, Anda harus terbiasa dengan instruksi Dockerfile. Di bawah ini beberapa instruksi Dockerfile yang harus Anda ketahui.
DARI
Atur gambar dasar untuk gambar baru yang ingin Anda buat. Instruksi FROM akan menginisialisasi tahap build baru dan harus ditempatkan di bagian atas Dockerfile.
LABEL
Dengan instruksi ini, Anda dapat menambahkan informasi tambahan tentang image Docker Anda, seperti versi, deskripsi, pengelola, dll. Instruksi LABEL adalah pasangan nilai kunci yang memungkinkan Anda menambahkan beberapa label dan nilai multi-baris.
JALANKAN
Instruksi ini digunakan untuk menjalankan perintah selama proses pembuatan gambar buruh pelabuhan. Anda dapat menginstal paket tambahan yang diperlukan untuk image Docker Anda.
TAMBAHKAN
Instruksi ADD digunakan untuk menyalin file, direktori, atau file jarak jauh dari URL ke gambar Docker Anda, dari 'src' ke jalur absolut 'tujuan'. Selain itu, Anda dapat mengatur kepemilikan default file Anda.
ENV
Instruksi ENV digunakan untuk mendefinisikan variabel lingkungan yang dapat digunakan selama tahap pembuatan dan juga dapat diganti sebaris di banyak variabel.
CMD
Instruksi CMD digunakan untuk menentukan perintah default yang akan dijalankan saat menjalankan container. Dan Dockerfile hanya boleh berisi satu instruksi CMD, dan jika ada beberapa CMD, instruksi CMD terakhir akan dijalankan.
EKSPOSE
Instruksi ini digunakan untuk mengekspos port container pada port jaringan tertentu saat runtime. Protokol default yang diekspos adalah TCP, tetapi Anda dapat menentukan apakah TCP atau UDP.
ARG
Instruksi ARG digunakan untuk mendefinisikan variabel yang dapat dilewatkan pengguna pada waktu yang dibangun. Anda dapat menggunakan instruksi ini di docker 'build command' selama waktu build menggunakan opsi '--build-arg variable=value' dan dapat diteruskan melalui Dockerfile. Anda juga dapat menggunakan beberapa ARG di Dockerfile.
ENTRYPOINT
Instruksi ENTRYPOINT digunakan untuk mendefinisikan perintah pertama dan default yang akan dijalankan ketika container sedang berjalan. Tentukan perintah untuk memulai aplikasi Anda dengan instruksi ENTRYPOINT.
DIREKTUR KERJA
Instruksi WORKDIR digunakan untuk menentukan direktori kerja default dari image Docker Anda. Instruksi RUN, CMD, ENTRYPOINT, dan ADD mengikuti instruksi WORKDIR. Anda dapat menambahkan beberapa instruksi WORKDIR pada Dockerfile Anda, dan jika tidak ada, maka akan dibuat secara otomatis.
USER
Instruksi USER digunakan untuk mendefinisikan pengguna atau gid default saat menjalankan gambar. RUN, CMD, dan ENTRYPOINT mengikuti instruksi USER di Dockerfile.
VOLUME
Iklan instruksi VOLUME digunakan untuk mengaktifkan akses/direktori tertaut antara penampung dan mesin host.
Sekarang, mari kita mulai membuat Dockerfile pertama.
Langkah 1 - Instal Docker CE (Edisi Komunitas)
Sebelum membuat Dockerfile, kita akan menginstal Docker CE ke sistem Ubuntu 18.04 kita.
Perbarui indeks paket Ubuntu dan instal beberapa paket menggunakan perintah apt di bawah ini.
sudo apt update
sudo apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
perangkat lunak-properti-umum
Selanjutnya, tambahkan kunci GPG dari repositori Docker resmi.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Selanjutnya, tambahkan repositori Docker CE Community Edition menggunakan perintah berikut.
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stabil"
Perintah akan secara otomatis memperbarui indeks paket lagi.
Selanjutnya, instal paket Docker CE menggunakan perintah apt di bawah ini.
sudo apt install docker-ce docker-ce-cli containerd.io
Setelah semua instalasi selesai, mulai layanan Docker dan tambahkan ke boot sistem.
systemctl start docker
systemctl aktifkan docker
Layanan Docker aktif dan berjalan, sekarang jalankan perintah docker di bawah ini untuk memastikan penginstalan sudah benar.
docker menjalankan hello-world
Di bawah ini adalah hasil yang akan Anda dapatkan.
Halo dari Docker!
Pesan ini menunjukkan bahwa penginstalan Anda tampaknya berfungsi dengan benar.
Untuk membuat pesan ini, Docker melakukan langkah-langkah berikut:
1. Docker klien menghubungi daemon Docker.
2. Daemon Docker menarik image "hello-world" dari Docker Hub.
(amd64)
3. Daemon Docker membuat container baru dari situ image yang menjalankan
yang dapat dieksekusi yang menghasilkan keluaran yang sedang Anda baca.
4. Daemon Docker mengalirkan keluaran tersebut ke klien Docker, yang mengirimkannya
ke terminal Anda.
Untuk mencoba sesuatu yang lebih ambisius, Anda dapat menjalankan wadah Ubuntu dengan:
$ docker run -it ubuntu bash
Berbagi gambar, otomatisasi alur kerja, dan banyak lagi dengan ID Docker gratis :
https://hub.docker.com/
Untuk contoh dan ide lainnya, kunjungi:
https://docs.docker.com/get-started/Seperti yang terlihat, Anda mendapatkan pesan hello-world dari Docker, dan penginstalan Docker CE telah berhasil diselesaikan.
Langkah 2 - Buat Dockerfile dan Konfigurasi Lainnya
Pada langkah ini, kami akan menunjukkan cara membuat image Docker kustom untuk aplikasi Anda menggunakan Dockerfile. Kami akan membuat image Docker kustom baru berdasarkan image Ubuntu 18.04, untuk layanan PHP-FPM dan Nginx, kemudian menjalankan container baru dengan skrip phpinfo sederhana.
Pertama, buat direktori proyek baru dan buat file Docker kosong.
mkdir -p nginx-image; cd nginx-image/
sentuh DockerfileSekarang edit skrip 'Dockerfile' menggunakan editor Anda sendiri (untuk contoh ini kami menggunakan vim).
vim DockerfileDi bagian atas baris, tambahkan gambar dasar gambar Ubuntu 18.04 menggunakan instruksi FROM seperti di bawah ini.
#Unduh gambar dasar ubuntu 18.04
DARI ubuntu:18.04Sekarang tambahkan informasi detail tentang gambar kustom menggunakan instruksi LABEL.
# LABEL tentang gambar khusus
LABEL maintainer="[email protected]"
LABEL version="0.1"
LABEL description="Ini adalah Gambar Docker khusus untuk \
Layanan PHP-FPM dan Nginx."Untuk instalasi paket apt, kami akan melewatkan langkah pasca-instal interaktif apa pun menggunakan variabel lingkungan 'DEBIAN_FRONTEND=noninteractive'.
# Nonaktifkan Prompt Selama Instalasi Paket
ARG DEBIAN_FRONTEND=noninteractiveSelanjutnya, jalankan perintah 'apt update' sebelum menginstal paket apa pun.
# Perbarui repositori Perangkat Lunak Ubuntu
Jalankan pembaruan yang tepatSekarang instal paket Nginx, PHP-FPM, dan supervisor. Setelah semua instalasi selesai, hapus semua cache paket untuk mengurangi ukuran gambar kustom.
# Instal nginx, php-fpm dan supervisor dari repositori ubuntu
Jalankan apt install -y nginx php-fpm supervisor &&\
rm -rf /var/lib/apt/lists/* &&\
tepat bersihTentukan variabel lingkungan baru yang dapat diteruskan pada gambar khusus.
#Tentukan variabel ENV
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/7.2/fpm/php.ini
ENV nginx_conf /etc /nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.confSekarang salin konfigurasi default Nginx ke variabel 'nginx_vhost', ganti konfigurasi PHP 'cgi.fix_pathinfo=1' dengan 'cgi.fix_pathinfo=0' pada file konfigurasi php.ini, lalu tambahkan opsi 'daemon off' ke variabel 'nginx_conf' default.
# Aktifkan PHP-fpm pada konfigurasi nginx virtualhost
COPY default ${nginx_vhost}
Jalankan sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' ${php_conf} &&\
echo "\ndaemon off;">> ${nginx_conf}Salin konfigurasi supervisor kustom ke variabel 'supervisor_conf'.
#Salin konfigurasi supervisor
COPY supervisord.conf ${supervisor_conf}Buat direktori baru untuk file sock PHP-FPM, ubah kepemilikan direktori web-root '/var/www/html' dan direktori PHP-FPM '/run/php' menjadi pengguna default 'www-data'.
Jalankan mkdir -p /run/php &&\
chown -R www-data:www-data /var/www/html &&\
chown -R www-data:www-data / jalankan/phpTentukan volume untuk gambar kustom sehingga kami dapat memasang semua direktori tersebut ke mesin host.
# Konfigurasi volume
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx ", "/var/www/html"]Sekarang tambahkan skrip 'start.sh' dan tentukan perintah container default menggunakan instruksi CMD seperti di bawah ini.
# Salin skrip start.sh dan tentukan perintah default untuk wadah
COPY start.sh /start.sh
CMD ["./start.sh"]Dan yang terakhir, buka port HTTP dan HTTPS default pada container menggunakan instruksi EXPOSE.
# Port Paparan untuk Aplikasi
EXPOSE 80 443Simpan dan tutup.
Di bawah ini adalah script Dockerfile lengkap yang baru saja kita buat.
# Unduh gambar dasar ubuntu 18.04
DARI ubuntu:18.04
# LABEL tentang gambar khusus
LABEL maintainer="[email protected]"
versi LABEL ="0.1"
LABEL description="Ini adalah Gambar Docker khusus untuk \
PHP-FPM dan Layanan Nginx."
# Nonaktifkan Prompt Selama Instalasi Paket
ARG DEBIAN_FRONTEND=noninteractive
# Perbarui repositori Perangkat Lunak Ubuntu
RUN apt update
# Instal nginx, php-fpm dan supervisor dari repositori ubuntu
RUN apt install -y nginx php-fpm supervisor &&\
rm -rf /var/lib/apt/lists/* &&\
apt clean
# Tentukan variabel ENV
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/7.2/fpm/php.ini
ENV nginx_conf /etc/nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.conf
# Aktifkan PHP-fpm pada konfigurasi nginx virtualhost
COPY default ${nginx_vhost}
Jalankan sed -i -e 's/;cgi.fix_pathinfo=1/ cgi.fix_pathinfo=0/g' ${php_conf} &&\
echo "\ndaemon off;">> ${nginx_conf}
# Salin konfigurasi supervisor
COPY supervisord.conf ${supervisor_conf}
Jalankan mkdir -p /run/php &&\
chown -R www-data:www-data /var/www/html &&\
chown -R www-data:www-data /run/php
# Konfigurasi volume
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www /html"]
# Salin skrip start.sh dan tentukan perintah default untuk wadah
COPY start.sh /start.sh
CMD ["./start.sh" ]
# Port Paparan untuk Aplikasi
EXPOSE 80 443Selanjutnya, kita akan membuat konfigurasi tambahan baru untuk Nginx, supervisord, dan skrip start.sh.
Konfigurasi virtualhost Nginx 'default' akan berisi bagian untuk PHP-FPM. Akibatnya, Anda dapat menjalankan skrip PHP menggunakan gambar Kustom tanpa perubahan apa pun.
Buat konfigurasi virtualhost 'default' Nginx baru dengan editor Anda.
default vimRekatkan konfigurasi berikut ke dalamnya.
server {
listen 80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \. php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}Simpan dan tutup.
Selanjutnya, kita akan membuat konfigurasi 'supervisrod.conf' yang berisi program Nginx dan PHP-FPM yang akan berjalan secara otomatis.
Buat file 'supervisrod.conf' menggunakan editor Anda.
vim supervisord.confRekatkan konfigurasi berikut ke dalamnya.
[unix_http_server]
file=/dev/shm/supervisor.sock ; (path ke file socket)
[supervisord]
logfile=/var/log/supervisord.log; (file log utama; default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (maks. byte logfile utama b4 rotasi; default 50 MB)
logfile_backups=10 ; (jumlah pencadangan rotasi file log utama; default 10)
loglevel=info ; (tingkat log;info default; lainnya:debug,peringatkan,trace)
pidfile=/tmp/supervisord.pid; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (mulai di latar depan jika benar; default salah)
minfds=1024 ; (pendeskripsi file startup info detail minimum; default 1024)
minprocs=200 ; (pendeskripsi proses info detail; default 200)
user=root ;
[rpcinterface:supervisor]
supervisor.rpcinterface_factory =supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///dev/shm/supervisor.sock; gunakan unix:// URL untuk soket unix
[include]
files =/etc/supervisor/conf.d/*.conf
[program :php-fpm7.2]
command=/usr/sbin/php-fpm7.2 -F
numprocs=1
autostart=true
autorestart=true
[program:nginx]
command=/usr/sbin/nginx
numprocs=1
autostart=true
autorestart=trueSimpan dan tutup.
Sekarang buat skrip 'start.sh' menggunakan t=editor Anda, skrip tersebut akan berisi perintah supervisord untuk memulai.
vim start.shRekatkan konfigurasi berikut ke dalamnya.
#!/bin/sh
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.confSimpan dan tutup.
Jadikan skrip 'start.sh' dapat dieksekusi.
chmod +x start.shHasilnya, semua konfigurasi untuk image Docker kustom kami telah dibuat, di bawah ini adalah semua konfigurasi yang telah kami buat.
pohon .Sekarang kami siap membuat gambar kustom baru berdasarkan konfigurasi ini.
Langkah 3 - Bangun Kustom Baru dan Jalankan Kontainer Baru
Untuk membuat image khusus Docker, buka direktori proyek 'nginx-image' dan jalankan perintah 'docker build' seperti di bawah ini.
docker build -t nginx-image .Perintah tersebut akan mengunduh gambar dasar Ubuntu 18.04 dan membuat gambar kustom baru dengan nama 'nginx-image.
Setelah semua proses selesai, periksa daftar image Docker yang tersedia di sistem Anda menggunakan perintah berikut.
gambar buruh pelabuhan lsDi bawah ini adalah hasil yang akan Anda dapatkan.
Seperti yang dapat dilihat, image Docker kustom baru 'nginx-image' telah dibuat.
Selanjutnya, kita akan menjalankan container Docker baru berdasarkan 'nginx-image'.
Pada mesin lokal Anda, buat direktori baru bernama 'webroot' yang akan digunakan untuk menyimpan semua file web.
mkdir -p /webrootSekarang buat container baru bernama test-container menggunakan perintah docker run di bawah ini.
docker run -d -v /webroot:/var/www/html -p 8080:80 --name test-container nginx-imageCatatan:
- --name test-container nginx-image =Kami membuat container baru dengan nama 'test-container', berdasarkan gambar buruh pelabuhan 'nginx-image'.
- -p 8080:80 =container test-container berjalan pada port 8080 pada mesin host.
- -v /webroot:/var/www/html =/webroot direktori pada mesin host tulis ulang direktori /var/www/html pada container.
Setelah itu, periksa semua container yang berjalan di sistem Anda menggunakan perintah berikut.
docker ps
Di bawah ini adalah hasil yang akan Anda dapatkan.
Akibatnya, penampung baru bernama 'test-container' berdasarkan 'nginx-image' dan mengekspos port 8080 aktif dan berjalan.
Langkah 4 - Pengujian
Untuk memastikan container berjalan dengan benar, kita akan membuat file index.html dan phpinfo baru pada direktori root '/ webroot' pada mesin host. Karena direktori '/webroot' di-mount ke direktori container '/var/www/html'.
Buat file index.html pada direktori '/webroot' menggunakan perintah berikut.
echo 'Nginx dan PHP-FPM 7.2 di dalam Docker Container dengan Gambar Dasar Ubuntu 18.04
'> /webroot/index.html
Sekarang uji akses container Anda dengan perintah curl pada port 8080.
curl server-ip:8080
curl -I server-ip:8080
Hasilnya, Anda akan mendapatkan halaman index.html default yang baru saja kita buat.
Selanjutnya, buat file PHP baru 'info.php' pada direktori '/webroot' untuk memastikan bahwa layanan PHP-FPM berjalan.
Buat file 'info.php' menggunakan perintah berikut.
echo ''> /webroot/info.php
Selanjutnya, buka browser web Anda dan ketik alamat IP server Anda dengan port '8080' diikuti dengan path file 'info.php'.
http://server-ip:8080/info.php
Sekarang Anda akan mendapatkan halaman phpinfo seperti di bawah ini.
Seperti yang terlihat, 'test-container' berhasil memuat skrip PHP.
Dan sebagai hasilnya, kami telah berhasil membuat image Docker kustom baru dan menjalankan container baru berdasarkan itu dengan kesalahan apa pun.