Ako vytvoriť obrázky Docker pomocou súboru Docker na Ubuntu 22.04 LTS
Tento návod existuje pre tieto verzie OS
- Ubuntu 22.04 (Jammy Jellyfish)
- Ubuntu 20.04 (Focal Fossa)
- Ubuntu 18.04 (Bionic Beaver)
- Ubuntu 16.04 (Xenial Xerus)
Na tejto stránke
- Úvod do príkazu Dockerfile
- Krok 1 – Nainštalujte Docker na Ubuntu 22.04
- Krok 2 - Vytvorte Dockerfile a ďalšie konfigurácie
- Krok 3 – Vytvorte nový vlastný a spustite nový kontajner
- Krok 4 – Testovanie
Docker je virtualizácia na úrovni operačného systému, ktorá je primárne zameraná na vývojárov a správcov systému. Docker uľahčuje vytváranie a nasadzovanie aplikácií v izolovanom prostredí.
Dockerfile je skript, ktorý obsahuje kolekcie príkazov a inštrukcií, ktoré sa automaticky vykonajú jeden po druhom v prostredí Docker, aby sa vytvoril nový obrázok Docker.
Tento tutoriál vám ukáže, ako vytvoriť svoj vlastný obrázok Docker pomocou súboru Docker. Podrobne vysvetľujeme, ako vytvoriť svoj vlastný obrázok Docker pomocou súboru Dockerfile.
Predpoklady
Pre túto príručku použijeme Ubuntu 22.04 s 1 GB RAM, 25 GB voľného miesta na disku a 2 procesory. Tiež použijeme Ubuntu 22.04 ako základný obraz na vytvorenie vlastného obrazu Docker.
Úvod do príkazu Dockerfile
Dockerfile je skript, ktorý obsahuje všetky príkazy na vytvorenie obrazu Docker. Súbor Dockerfile obsahuje všetky pokyny, ktoré sa použijú na vytvorenie obrazu Docker pomocou príkazu „docker build“.
Pred vytvorením svojho prvého súboru Dockerfile by ste sa mali oboznámiť s pokynmi pre Dockerfile. Nižšie sú uvedené niektoré pokyny pre Dockerfile, ktoré musíte poznať.
OD
Nastavte základný obrázok pre nový obrázok, ktorý chcete vytvoriť. Inštrukcia FROM inicializuje novú fázu zostavenia a musí byť umiestnená v hornej časti súboru Dockerfile.
LABEL
Pomocou tejto inštrukcie môžete pridať ďalšie informácie o svojom obrázku Docker, ako je verzia, popis, správca atď. Inštrukcia LABEL je pár kľúč – hodnota, ktorý vám umožňuje pridať viacero označení a viacriadkových hodnôt.
RUN
Táto inštrukcia sa používa na vykonanie príkazu počas procesu zostavovania obrazu docker. Môžete si nainštalovať ďalšie balíčky potrebné pre vaše obrazy Docker.
PRIDAŤ
Inštrukcia ADD sa používa na kopírovanie súborov, adresárov alebo vzdialených súborov z URL do vašich obrázkov Docker, z 'src' do absolútnej cesty 'dest'. Môžete tiež nastaviť predvolené vlastníctvo súboru.
ENV
Inštrukcia ENV definuje premennú prostredia, ktorá môže byť použitá počas fázy zostavovania a môže byť v mnohých inline nahradená.
CMD
Inštrukcia CMD definuje predvolený príkaz, ktorý sa má vykonať pri spustení kontajnera. A súbor Dockerfile musí obsahovať iba jednu inštrukciu CMD a ak existuje viacero CMD, spustí sa posledná inštrukcia CMD.
VYSTAVIŤ
Táto inštrukcia odkryje kontajnerový port na špecifických sieťových portoch za behu. Predvoleným vystaveným protokolom je TCP, ale môžete určiť, či ide o TCP alebo UDP.
ARG
Inštrukcia ARG sa používa na definovanie premennej, ktorú môže používateľ odovzdať v zabudovanom čase. Túto inštrukciu môžete použiť v docker 'build command' počas doby zostavovania pomocou možnosti '--build-arg variable=value' a možno ju preniesť cez súbor Dockerfile. Môžete tiež použiť viacero ARG v súbore Dockerfile.
VSTUPNÝ BOD
Inštrukcia ENTRYPOINT sa používa na definovanie prvého a predvoleného príkazu, ktorý sa vykoná, keď je kontajner spustený. Definujte príkaz na spustenie vašej aplikácie pomocou inštrukcie ENTRYPOINT.
WORKDIR
Inštrukcia WORKDIR sa používa na definovanie predvoleného pracovného adresára vášho obrazu Docker. Pokyny RUN, CMD, ENTRYPOINT a ADD sa riadia pokynmi WORKDIR. Do súboru Dockerfile môžete pridať viacero inštrukcií WORKDIR, a ak neexistuje, vytvorí sa automaticky.
POUŽÍVATEĽ
Inštrukcia USER sa používa na definovanie predvoleného používateľa alebo gid pri spustení obrazu. RUN, CMD a ENTRYPOINT sa riadia pokynmi USER v súbore Dockerfile.
VOLUME
Reklama s inštrukciou VOLUME používaná na povolenie prístupu/prepojeného adresára medzi kontajnerom a hostiteľským počítačom.
Teraz začnime vytvárať prvý súbor Dockerfile.
Krok 1 – Nainštalujte Docker na Ubuntu 22.04
Pred vytvorením súboru Dockerfile nainštalujeme Docker do nášho systému Ubuntu 22.04, ktorý je štandardne dostupný v úložisku Ubuntu.
Aktualizujte zoznam všetkých balíkov v úložisku Ubuntu a nainštalujte Docker pomocou príkazu apt nižšie.
sudo apt update
sudo apt install docker.io
Po dokončení inštalácie spustite službu Docker a pridajte ju do zavádzania systému.
systemctl start docker
systemctl enable docker
Teraz skontrolujte službu Docker pomocou príkazu nižšie.
systemctl status docker
Služba Docker je spustená a spustená na Ubuntu 22.04.
Potom spustite príkaz docker nižšie, aby ste sa uistili, že inštalácia je správna.
docker run hello-world
Nižšie je uvedený výsledok, ktorý získate.
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Ako môžete vidieť, dostanete správu Hello World od Dockera a inštalácia Docker na Ubuntu 22.04 bola úspešne dokončená.
Krok 2 - Vytvorte Dockerfile a ďalšie konfigurácie
V tomto kroku vám ukážeme, ako vytvoriť vlastný obrázok Docker pre vašu aplikáciu pomocou súboru Dockerfile. Vytvoríme nový vlastný obrázok Docker založený na obrázku Ubuntu 22.04 pre služby PHP-FPM a Nginx a potom spustíme nový kontajner pomocou jednoduchého skriptu phpinfo.
Najprv vytvorte nový adresár projektu a vytvorte prázdny súbor Dockerfile.
mkdir -p nginx-image
cd nginx-image/
touch Dockerfile
Teraz upravte skript 'Dockerfile' pomocou vlastného editora (v tomto príklade používame nano).
nano Dockerfile
V hornej časti riadku pridajte základný obrázok Ubuntu 22.04 pomocou inštrukcie FROM, ako je uvedené nižšie.
# Download base image ubuntu 22.04
FROM ubuntu:22.04
Teraz pridajte podrobné informácie o vlastnom obrázku pomocou inštrukcie LABEL.
# LABEL about the custom image
LABEL maintainer="[email "
LABEL version="0.1"
LABEL description="This is a custom Docker Image for PHP-FPM and Nginx."
Pri inštalácii balíkov apt pomocou premennej prostredia 'DEBIAN_FRONTEND=noninteractive' preskočíme akýkoľvek interaktívny krok po inštalácii.
# Disable Prompt During Packages Installation
ARG DEBIAN_FRONTEND=noninteractive
Potom pred inštaláciou akýchkoľvek balíkov spustite príkaz „apt update“.
# Update Ubuntu Software repository
RUN apt update
Teraz nainštalujte balíky Nginx, PHP-FPM a supervízor. Po dokončení inštalácie odstráňte vyrovnávaciu pamäť všetkých balíkov, aby sa zmenšila veľkosť vlastného obrazu.
# Install nginx, php-fpm and supervisord from ubuntu repository
RUN apt install -y nginx php-fpm supervisor
RUN rm -rf /var/lib/apt/lists/*
RUN apt clean
Definujte novú premennú prostredia, ktorú možno odovzdať vlastnému obrázku.
# Define the ENV variable
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/8.1/fpm/php.ini
ENV nginx_conf /etc/nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.conf
Teraz skopírujte predvolenú konfiguráciu Nginx do premennej 'nginx_vhost', nahraďte konfiguráciu PHP 'cgi.fix_pathinfo=1' za 'cgi.fix_pathinfo=0' v konfiguračnom súbore php.ini a potom pridajte možnosť 'daemon off' do predvolená premenná 'nginx_conf'.
# Enable PHP-fpm on nginx virtualhost configuration
COPY default ${nginx_vhost}
RUN sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' ${php_conf} && echo "\ndaemon off;" >> ${nginx_conf}
Skopírujte vlastnú konfiguráciu supervízora do premennej 'supervisor_conf'.
#Copy supervisor configuration
COPY supervisord.conf ${supervisor_conf}
Vytvorte nový adresár pre súbor sock súborov PHP-FPM, zmeňte vlastníctvo koreňového adresára webu '/var/www/html' a adresára PHP-FPM '/run/php' na predvoleného používateľa 'www-data'.
RUN mkdir -p /run/php
RUN chown -R www-data:www-data /var/www/html
RUN chown -R www-data:www-data /run/php
Definujte zväzok pre vlastný obraz, aby sme mohli pripojiť všetky tieto adresáre k hostiteľskému počítaču.
# Volume configuration
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
Teraz pridajte skript 'start.sh' a definujte predvolený príkaz kontajnera pomocou inštrukcie CMD, ako je uvedené nižšie.
# Copy start.sh script and define default command for the container
COPY start.sh /start.sh
CMD ["./start.sh"]
A nakoniec otvorte predvolené porty HTTP a HTTPS na kontajneri pomocou inštrukcie EXPOSE.
# Expose Port for the Application
EXPOSE 80 443
Uložiť a zavrieť.
Nižšie je uvedený úplný skript Dockerfile, ktorý sme práve vytvorili.
# Download base image ubuntu 22.04
FROM ubuntu:22.04
# LABEL about the custom image
LABEL maintainer="[email "
LABEL version="0.1"
LABEL description="This is a custom Docker Image for PHP-FPM and Nginx."
# Disable Prompt During Packages Installation
ARG DEBIAN_FRONTEND=noninteractive
# Update Ubuntu Software repository
RUN apt update
RUN apt upgrade -y
# Install nginx, php-fpm and supervisord from ubuntu repository
RUN apt install -y nginx php-fpm supervisor
RUN rm -rf /var/lib/apt/lists/*
RUN apt clean
# Define the ENV variable
ENV nginx_vhost /etc/nginx/sites-available/default
ENV php_conf /etc/php/8.1/fpm/php.ini
ENV nginx_conf /etc/nginx/nginx.conf
ENV supervisor_conf /etc/supervisor/supervisord.conf
# Enable PHP-fpm on nginx virtualhost configuration
COPY default ${nginx_vhost}
RUN sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' ${php_conf} && echo "\ndaemon off;" >> ${nginx_conf}
# Copy supervisor configuration
COPY supervisord.conf ${supervisor_conf}
RUN mkdir -p /run/php
RUN chown -R www-data:www-data /var/www/html
RUN chown -R www-data:www-data /run/php
# Volume configuration
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
# Copy start.sh script and define default command for the container
COPY start.sh /start.sh
CMD ["./start.sh"]
# Expose Port for the Application
EXPOSE 80 443
Ďalej vytvoríme dodatočnú konfiguráciu pre Nginx, supervízor a skript start.sh.
„Predvolená“ konfigurácia virtuálneho hostiteľa Nginx bude obsahovať sekciu pre PHP-FPM. V skutočnosti môžete skript PHP spustiť pomocou vlastného obrázka bez akýchkoľvek zmien.
Pomocou editora vytvorte novú „predvolenú“ konfiguráciu virtuálneho hostiteľa Nginx.
nano default
Vložte do nej nasledujúcu konfiguráciu.
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/php8.1-fpm.sock;
}
}
Uložiť a zavrieť.
Ďalej vytvoríme konfiguráciu 'supervisrod.conf', ktorá obsahuje programy Nginx aj PHP-FPM, ktoré sa budú spúšťať automaticky.
Pomocou editora vytvorte súbor 'supervisrod.conf'.
nano supervisord.conf
Vložte do nej nasledujúcu konfiguráciu.
[unix_http_server]
file=/dev/shm/supervisor.sock ; (the path to the socket file)
[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
user=root ;
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///dev/shm/supervisor.sock ; use a unix:// URL for a unix socket
[include]
files = /etc/supervisor/conf.d/*.conf
[program:php-fpm8.1]
command=/usr/sbin/php-fpm8.1 -F
numprocs=1
autostart=true
autorestart=true
[program:nginx]
command=/usr/sbin/nginx
numprocs=1
autostart=true
autorestart=true
Uložiť a zavrieť.
Teraz vytvorte skript 'start.sh' pomocou editora obsahujúceho príkaz supervízor na spustenie.
nano start.sh
Vložte do nej nasledujúcu konfiguráciu.
#!/bin/sh
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
Uložiť a zavrieť.
Urobte skript 'start.sh' spustiteľným.
chmod +x start.sh
V dôsledku toho bola vytvorená všetka konfigurácia pre náš vlastný obrázok Docker, nižšie sú všetky konfigurácie, ktoré sme vytvorili.
ls -la
Teraz sme pripravení vytvoriť nový vlastný obrázok založený na týchto konfiguráciách.
Krok 3 – Vytvorte nový vlastný a spustite nový kontajner
Ak chcete vytvoriť vlastný obrázok Docker, prejdite do adresára projektu „nginx-image“ a spustite príkaz „docker build“ ako je uvedené nižšie.
docker build -t nginx-image .
Príkaz stiahne základný obrázok Ubuntu 22.04 a vytvorí nový vlastný obrázok s názvom 'nginx-image.
Po dokončení celého procesu skontrolujte zoznam dostupných obrazov Docker vo vašom systéme pomocou nasledujúceho príkazu.
docker image ls
Nižšie je uvedený výsledok, ktorý získate.
Ako je možné vidieť, bol vytvorený nový vlastný obrázok Docker „nginx-image“.
Ďalej spustíme nový kontajner Docker založený na 'nginx-image'.
Na svojom lokálnom počítači vytvorte nový adresár s názvom '/var/webroot', ktorý sa bude používať na ukladanie všetkých webových súborov.
mkdir -p /var/webroot
Teraz vytvorte nový kontajner s názvom test-container pomocou príkazu docker run nižšie.
docker run -d -v /var/webroot:/var/www/html -p 8080:80 --name test-container nginx-image
Poznámka:
- --name test-container nginx-image=Vytvoríme nový kontajner s názvom 'test-container', založený na dockerovom obrázku 'nginx-image'.
- -p 8080:80=kontajner testovacieho kontajnera spustený na porte 8080 na hostiteľskom počítači.
- -v /var/webroot:/var/www/html=adresár /var/webroot na hostiteľskom počítači prepíšte adresár /var/www/html v kontajneri.
Potom skontrolujte všetky spustené kontajnery vo vašom systéme pomocou nasledujúceho príkazu.
docker ps
Nižšie je uvedený výsledok, ktorý získate.
Výsledkom je, že nový kontajner s názvom 'test-container' na základe 'nginx-image' a odhalenie portu 8080 je v prevádzke.
Krok 4 – Testovanie
Aby sme sa uistili, že kontajner beží správne, vytvoríme nový súbor index.html a phpinfo v koreňovom adresári hostiteľského počítača '/webroot'. Pretože adresár '/var/webroot' je pripojený do adresára kontajnera '/var/www/html'.
Vytvorte súbor index.html v adresári '/webroot' pomocou nasledujúceho príkazu.
echo '<h1>Nginx and PHP-FPM 8.1 inside Docker Container with Ubuntu 22.04 Base Image</h1>' > /var/webroot/index.html
Teraz otestujte prístup k svojmu kontajneru pomocou príkazu curl na porte 8080.
curl server-ip:8080
curl -I server-ip:8080
V dôsledku toho získate predvolenú stránku index.html, ktorú sme práve vytvorili.
Potom vytvorte nový súbor PHP 'info.php' v adresári '/webroot', aby ste sa uistili, že služba PHP-FPM beží.
Vytvorte súbor 'info.php' pomocou nasledujúceho príkazu.
echo '<?php phpinfo(); ?>' > /var/webroot/info.php
Potom otvorte webový prehliadač a zadajte IP adresu servera s portom '8080', za ktorým nasleduje cesta k súboru 'info.php'.
http://server-ip:8080/info.php
Teraz získate stránku phpinfo, ako je uvedené nižšie.
Ako je možné vidieť, „testovací kontajner“ úspešne načítal PHP skript.
Výsledkom je, že sme úspešne vytvorili nový vlastný obrázok Docker a na jeho základe sme bez chyby spustili nový kontajner.