Kuvia
Docker-kuva on tiedosto, joka rakennetaan yleensä ohjetiedoston nimeltä Dockerfile avulla. Docker-kuva on muuttumaton, eli olemassa olevaa kuvaa ei voida muuttaa, mutta siihen voidaan lisätä uusi kerros ja näin saada muokattu version kuvasta, joka sopii käyttäjälle.
Docker-kontit ovat Docker-kuvien käynnissä olevia instansseja. Välttääksemme sekaannuksia, käydään nopeasti läpi Docker-kuva ja -kontit käyttämällä ruoanlaittoesimerkkiä:
- Dockerfilea voitaisiin pitää ainesosaluettelona.
- Docker-kuvat ovat sekoitettuja ainesosia.
- Docker-kontti on kypsennetty herkullinen ateria: Lopputuote!
Selittääkseni näitä analogioita paremmin, seuraamme muutamia esimerkkejä.
Ensiksi, jotta docker-kuvaa voidaan ajaa, voi käyttää docker-asiakasta isäntäkoneessa (edellyttäen, että se on asennettu):
Tämä lataa (tai lataa) ensin uusimman nginx-kuvan, jos sitä ei ole välimuistissa paikallisesti, etsii sitten ennalta määritetyn aloituspisteen, ja lopulta kontti käynnistetään. Voit käyttää ja katsella nginx-tervetulosivua osoitteesta http://localhost:80
Tuloste voi näyttää seuraavalta:
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
31ce7ceb6d44: Pull complete
f1359798dfe4: Pull complete
4de1e0313830: Pull complete
7745719004b6: Pull complete
0f17732d34d5: Pull complete
0eb0ed12e64c: Pull complete
5836f8c1cebc: Pull complete
Digest: sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
Status: Downloaded newer image for nginx:latest
/docker-entrypoint.sh: /docker-entrypoint.d/ ei ole tyhjä, yritetään suorittaa konfiguraatio
/docker-entrypoint.sh: Etsitään shell-skriptejä /docker-entrypoint.d/
/docker-entrypoint.sh: Käynnistetään /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Haetaan tarkistussumma tiedostosta /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Ota IPv6 käyttöön tiedostossa /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Lähteet /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Käynnistetään /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Käynnistetään /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Kokoonpano valmis; valmiina käynnistykseen
2023/11/08 10:27:14 [tiedoksi] 1#1: "epoll" tapahtumamenetelmä käytössä
2023/11/08 10:27:14 [tiedoksi] 1#1: nginx/1.25.3
2023/11/08 10:27:14 [tiedoksi] 1#1: koostettu gcc 12.2.0 (Debian 12.2.0-14)
2023/11/08 10:27:14 [tiedoksi] 1#1: Käyttöjärjestelmä: Linux 6.4.16-linuxkit
2023/11/08 10:27:14 [tiedoksi] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/11/08 10:27:14 [tiedoksi] 1#1: työläisprosessien käynnistys
2023/11/08 10:27:14 [tiedoksi] 1#1: työläisprosessin käynnistys 29
2023/11/08 10:27:14 [tiedoksi] 1#1: työläisprosessin käynnistys 30
2023/11/08 10:27:14 [tiedoksi] 1#1: työläisprosessin käynnistys 31
2023/11/08 10:27:14 [tiedoksi] 1#1: työläisprosessin käynnistys 32
2023/11/08 10:27:14 [tiedoksi] 1#1: työläisprosessin käynnistys 33
2023/11/08 10:27:14 [tiedoksi] 1#1: työläisprosessin käynnistys 34
2023/11/08 10:27:14 [tiedoksi] 1#1: työläisprosessin käynnistys 35
2023/11/08 10:27:14 [tiedoksi] 1#1: työläisprosessin käynnistys 36
Tämän esimerkin nimi on nginx
, mutta kuten näemme, se laajennetaan ensin muotoon nginx:latest
ja sitten muotoon library/nginx
, eri osat ovat:
-
Jos verkkotunnuksen nimi ei sisälly, docker olettaa, että se on oletusarvoinen julkinen docker-rekisteri,
docker.io
. Mutta on olemassa muita rekistereitä, esimerkiksiimage-registry.apps.2.rahti.csc.fi
on Rahti's yksityinen docker-rekisteri. -
Seuraavaksi on kuvan polku, tässä tapauksessa se on
/library
. Jälleen docker olettaa sen, tämä polku on varattu "virallisille peruskuville", tai toisin sanoen yleisille Linux-jakeluille, joista muut kuvat perustuvat. -
Seuraavaksi on kuvan nimi itse,
nginx
.docker.io/library
sisältää paljon muita "peruskuvia", kutenubuntu
taialpine
. -
Lopuksi on merkintä,
latest
. Tämä on oletusmerkintä kuvalle, mutta kuvalle voidaan antaa mikä tahansa nimi merkinnäksi. Tällä erotetaan saman kuvan versiot toisistaan. Esimerkkejänginx
:istä ovat:stable
,perl
,1.25.3-perl
, ja paljon muuta. Annetun merkinnän sisältö voi muuttua ajan myötä,latest
on aina ajantasaisin versio. Mutta muut merkinnät pysyvät muuttumattomina niiden julkaisun jälkeen.
Docker-hubin virallinen nginx -sivu tarjoaa meille enemmän tietoja siitä, miten virallisen nginx-kuvan eri merkityt versiot on rakennettu.
Edistyneet kuvan sisäiset toiminnot
Monesti Docker-kuvien kirjoittaja ei välttämättä anna yksityiskohtia Dockerfilesta, jota käytettiin Docker-kuvien rakentamiseen. Siksi on hyvä tarkastella kuvia tuntemattomista lähteistä. Voit nähdä kuvan sisäisen yksityiskohtaisen tiedon docker inspect
-työkalun avulla. Tuloste on JSON-objekti, jota voidaan käsitellä tavallisilla työkaluilla, kuten jq
, katso esimerkki tämän sivun alalaidasta.
Tämä mahdollistaa mielenkiintoisten tietojen näkemisen kuvasta, kuten ympäristö, aloituskohta, alkuperäinen komento, kerrokset ja paljon muuta.
$ docker inspect nginx
[
{
"Id": "sha256:81be38025439476d1b7303cb575df80e419fd1b3be4a639f3b3e51cf95720c7b",
"RepoTags": [
"nginx:latest",
"image-registry.apps.2.rahti.csc.fi/tristan-tests/nginx-is:latest"
],
"RepoDigests": [
"nginx@sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6",
],
"Parent": "",
"Comment": "",
"Created": "2023-11-01T13:52:55.281520995Z",
"Container": "3082c1b3b5eb0938cb1973e01eee5a137819918bdf18672e4c831f63d7910708",
"ContainerConfig": {
"Hostname": "3082c1b3b5eb",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.25.3",
"NJS_VERSION=0.8.2",
"PKG_RELEASE=1~bookworm"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
"Image": "sha256:f5bb00b8bc235e00779e82f457d2675944d51e7fe463e94e74090f5ce323477a",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
"DockerVersion": "20.10.23",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.25.3",
"NJS_VERSION=0.8.2",
"PKG_RELEASE=1~bookworm"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "sha256:f5bb00b8bc235e00779e82f457d2675944d51e7fe463e94e74090f5ce323477a",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
"Architecture": "arm64",
"Variant": "v8",
"Os": "linux",
"Size": 192076209,
"VirtualSize": 192076209,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/d4179e5ee53b696e6f9cad24f86eafcff31020e77b6d568f7df510d50dfc50fb/diff:/var/lib/docker/overlay2/505c36a08045e6f9aa6c507058e58e5cc6045ce6bbdeffbf2c80f99b2b179240/diff:/var/lib/docker/overlay2/345a53e995f55fd568056ca8b9a68c9831194d436dd4a24f5fa61724f600014c/diff:/var/lib/docker/overlay2/9a9baa23d9833dff9a5ae3c7aed5ae470983a7fdb19a26592c6d467f0c087e1d/diff:/var/lib/docker/overlay2/a7797fde3caf5df84f82791b0b3eec9cf9e8c5984eb24270477e298777219219/diff:/var/lib/docker/overlay2/8cfb696f133bd10e47254fbaecac86df1f3dd50045dea71e71eb70619458068f/diff",
"MergedDir": "/var/lib/docker/overlay2/a72028575ab69e9c465e706d55c40fd0bc147fa903b9f39bf6f2e4e2f45d1952/merged",
"UpperDir": "/var/lib/docker/overlay2/a72028575ab69e9c465e706d55c40fd0bc147fa903b9f39bf6f2e4e2f45d1952/diff",
"WorkDir": "/var/lib/docker/overlay2/a72028575ab69e9c465e706d55c40fd0bc147fa903b9f39bf6f2e4e2f45d1952/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:70e628269d9fa63e3ddaa5e293bbc8aba5079d63f473f75c310b0c3cf2496f8e",
"sha256:8be85be307c0f740da57a80fcb58eabeb7e4dd875848dbd64836e2cb9e8a8ecb",
"sha256:40bbe6b6e9a4f15a6cd7dfc3f9939bf6b2a518748ba6850ef987a76b5410db84",
"sha256:f2465222d91784d91e1b0db1682d8db6c67204da4f5ba28a24bcc896d7fbe22c",
"sha256:c418f07b4eb5e7776894512117782cbfca9d2a3f705e3f7e316e2081bbb0d9b2",
"sha256:8656e99db5c4d86e22eca336869cfa9e4a84b10c62bcf72bb88426d646c29825",
"sha256:4cb2cea6f808928f49692da26cac2edd879a8eb721af66726a16ad053dd7f96e"
]
},
"Metadata": {
"LastTagTime": "2023-11-08T10:42:14.544035377Z"
}
}
]