Professional Documents
Culture Documents
04 Dockerfile
04 Dockerfile
04 Dockerfile
dr Mihajlo Savić
1/21
Docker i fajl sistem
3/21
docker search
# docker search php
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
php While designed for web development, the PHP … 5902 [OK]
phpmyadmin/phpmyadmin A web interface for MySQL and MariaDB. 1126 [OK]
adminer Database management in a single PHP file. 547 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 214 [OK]
webdevops/php-nginx Nginx with PHP-FPM 197 [OK]
php-zendserver Zend Server - the integrated PHP application… 193 [OK]
webdevops/php-apache-dev PHP with Apache for Development (eg. with xd… 141 [OK]
webdevops/php-apache Apache with PHP-FPM (based on webdevops/php) 117 [OK]
bitnami/php-fpm Bitnami PHP-FPM Docker Image 112 [OK]
phpunit/phpunit PHPUnit is a programmer-oriented testing fra… 82 [OK]
nazarpc/phpmyadmin phpMyAdmin as Docker container, based on off… 61 [OK]
phpipam/phpipam-www phpIPAM is an open-source web IP address man… 50
thecodingmachine/php General-purpose ultra-configurable PHP images 35 [OK]
circleci/php CircleCI images for PHP 33
erikdubbelboer/phpredisadmin Simple web interface to manage Redis databas… 28 [OK]
chialab/php Adding common PHP extensions to some of the … 27 [OK]
bitnami/phpmyadmin Bitnami Docker Image for phpMyAdmin 24 [OK]
devilbox/php-fpm PHP-FPM Docker images based on original PHP … 22
4/21
docker search
# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 14818 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2024 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 813 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 185
linuxserver/nginx An Nginx container, brought to you by LinuxS… 143
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 123 [OK]
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 106 [OK]
bitnami/nginx Bitnami nginx Docker Image 95 [OK]
alfg/nginx-rtmp NGINX, nginx-rtmp-module and FFmpeg from sou… 94 [OK]
jasonrivers/nginx-rtmp Docker images to host RTMP streams using NGI… 89 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co… 67 [OK]
privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 53 [OK]
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 51
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 33
staticfloat/nginx-certbot Opinionated setup for automatic TLS certs lo… 21 [OK]
schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 19 [OK]
nginx/nginx-prometheus-exporter NGINX Prometheus Exporter 17
centos/nginx-112-centos7 Platform for running nginx 1.12 or building … 15
centos/nginx-18-centos7 Platform for running nginx 1.8 or building n… 13
5/21
docker pull
# docker search alpine
Digest: sha256:69e70a79f2d41ab5d637de98c1e0b055206ba40a8145e7bddb55ccc04e13cf8f
docker.io/library/alpine:latest
# docker images
6/21
docker run
# uname -a
Linux sophia 5.4.0-66-generic #74-Ubuntu SMP Wed Jan 27 22:54:38 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
# docker run -it alpine
/ # uname -a
Linux c822ab1ed787 5.4.0-66-generic #74-Ubuntu SMP Wed Jan 27 22:54:38 UTC 2023 x86_64 Linux
/ # exit
# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c822ab1ed787 alpine "/bin/sh" 34 seconds ago Exited (0) 9 seconds ago kind_sanderson
# docker container rm c822ab1ed787
c822ab1ed787
# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# docker run -it --rm alpine
/ # exit
# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#
7/21
docker run
# docker run php -r 'echo "3+5=". 3+5 ."\n";'
3+5=8
# docker run -it alpine
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
540db60ca938: Pull complete
Digest: sha256:69e70a79f2d41ab5d637de98c1e0b055206ba40a8145e7bddb55ccc04e13cf8f
Status: Downloaded newer image for alpine:latest
/ # ip addr ls
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
169: eth0@if170: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # exit
8/21
docker i izmjene fajl sistema
# docker run -it alpine
/ # ls -l /root
total 0
/ # mkdir /root/evome
/ # ls -l /root
drwxr-xr-x 2 root root 4096 Apr 28 21:26 evome
/ # exit
# docker run -it alpine
/ # ls -l /root
total 0
# docker run -it -v $(pwd):/proba alpine
/ # mkdir /proba/da_vidimo
/ # ls -l /proba
drwxr-xr-x 2 root root 4096 Apr 28 21:32 da_vidimo
/ # exit
# docker run -it -v $(pwd):/proba alpine
/ # ls -l /proba
drwxr-xr-x 2 root root 4096 Apr 28 21:32 da_vidimo
/ # exit
# ls -l
drwxr-xr-x 2 root root 4096 Apr 28 23:32 da_vidimo
9/21
docker, pristup mreži i imena kontejnera
# docker run -v $(pwd):/srv -p 8080:8080 php -S 0.0.0.0:8080 -t /srv
# docker run -v /neki/drugi/direktorijum:/srv -p 8081:8080 php -S 0.0.0.0:8080 -t /srv
# docker run -v $(pwd):/srv -d --name=php8081 -p 8081:8080 php -S 0.0.0.0:8080 -t /srv
0623c12eb56b8a1b73432c3439cc26498e625b3f259f31325b033e06a82833d6
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0623c12eb56b php "docker-php-entrypoi…" 4 seconds ago Up 3 seconds 0.0.0.0:8081->8080/tcp php8081
# docker stop php8081
php8081
# docker run -v $(pwd):/srv -d --name=php8081 -p 8081:8080 php -S 0.0.0.0:8080 -t /srv
docker: Error response from daemon: Conflict. The container name "/php8081" is already in use by container
"0623c12eb56b8a1b73432c3439cc26498e625b3f259f31325b033e06a82833d6". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
# docker start php8081
php8081
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0623c12eb56b php "docker-php-entrypoi…" 4 minutes ago Up 5 seconds 0.0.0.0:8081->8080/tcp php8081
# docker stop php8081
php8081
# docker rm php8081
php8081
10/21
Dockerfile
● Dockerfile je fajl koji definiše korake neophodne za
pravljenje slike kontejnera.
● Osnovne ključne riječi unutar Dockerfile:
– FROM definiše sliku iz koje izvodimo našu sliku za kontejner
– MAINTAINER definiše ime i prezime, kao i email osobe
zadužene za održavanje
– RUN izvršava komandu
– ADD dodaje (kopira) fajlove iz host fajl sistema u sliku za
kontejner (npr. naša aplikacija, itd)
– ENV podešava environment varijable
11/21
Dockerfile
● Korisne za automatizaciju jer ne želimo da kucamo iste stvari u
komandnoj liniji bez potrebe
– EXPOSE omogućava pristup određenim mrežnim portovima
– VOLUME omogućava pristup dijelovima fajl sistema hosta iz kontejnera
– LABEL labela za docker image
● Pokretanje programa pri pokretanju kontejnera
– CMD definiše default komandu (i parametre) koja će biti izvršena pri
pokretanju kontejnera (korisnik je može promijeniti pri pozivu)
– ENTRYPOINT slično kao CMD ali nije dozvoljen override
– WORKDIR direktorijum u kojem će se CMD izvršavati
– USER korisnični nalog pod kojim će se izvršavati
12/21
Dockerfile
FROM php:latest
MAINTAINER Mihajlo Savic mihajlo.savic@etf.unibl.org
13/21
docker build
# docker build -t "phpmagick:latest" .
14/21
docker build
FROM phpmagick:latest
MAINTAINER Mihajlo Savic mihajlo.savic@etf.unibl.org
RUN apt-get install -y wget
15/21
docker build
# docker images
16/21
docker history
# docker history fc887bfc694b
...
17/21
docker alati
alias dive="docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive"
dive phpmagickwget:v1
18/21
Multi-stage build
● Klasično koristimo dva (ili više) kontejnera
– Jedan za build
– (Jedan za testiranje)
– Jedan za izvršavanje
● Zašto?
– Jer ne želimo da nam u fazi izvršavanja bude prisutan kompletan
SDK i pomoćni alati (i testovi)
● Napravimo tri Dockerfile fajla
– Može. Nije problem, jedino što nije elegantno.
– Mi volimo da smo elegantni ;)
19/21
Multi-stage Dockerfile
FROM eclipse-temurin:17-jdk-jammy as build
WORKDIR /app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY ./src ./src
RUN ./mvnw clean install -Dmaven.test.skip=true
20/21
Hvala na pažnji
PITANJA?
21/21