8 ΡΠ°ΡΠΎΠ², 2 Π°ΠΊ. Π΄Π½Ρ.
- RAM β₯ 4Gb
- ΠΡΠ°Π²Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π΄ΠΌΠΈΠ½Π° Π΄Π»Ρ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ°
- ΠΠΎΡΡΡΠΏΠ΅Π½ git repo Ρ Π΄Π°Π½Π½ΡΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΠΌ {{ git-repo }}
https://github.com/eugene-krivosheyev/docker
- ΠΠΎΡΡΡΠΏΠ΅Π½ {{ registry-host }}
https://hub.docker.com
(Docker Hub) - ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π° ΡΡΠ΅ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ {{ registry-account }} Π½Π° {{ registry-host }}
- Π£ΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Docker CE ΠΈΠ»ΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² (e.g. Podman)
sudo dnf install -y docker
7:20
- Π΄Π²Π΅ ΡΠ°ΡΡΠΈ ΠΊΡΡΡΠ°: ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π±Π°Π·ΠΎΠ²Π°Ρ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΎΠ»Π΅ΠΉ ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΠΌΡ Π±ΠΎΠ»ΡΡΠ΅ Π² ΡΡΠΎΡΠΎΠ½Ρ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ
- ΠΠ°ΡΠ΅ΠΌ Π½ΡΠΆΠ΅Π½ Docker? ΠΠ΅ΡΠ°ΡΠΎΡΠ° ΠΌΠΎΡΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
- ΠΠ°ΠΊΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΠΈ?
- development environment?
- testing environment?
- production environment?
- ΠΠΈΡΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ) VS ΠΊΠΎΠ½ΡΠ΅ΠΈΜΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡ (ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ)?
- ΠΌΠ΅ΡΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ΅ Π΄Π»Ρ Π³ΠΎΡΡΠ΅Π²ΠΎΠΉ ΠΠ‘
- Π²ΡΠ΅ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ° Π³ΠΎΡΡΠ΅Π²ΠΎΠΉ ΠΠ‘
- overhead ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π³ΠΎΡΡΠ΅Π²ΠΎΠΉ ΠΠ‘
- ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ β ΠΏΡΠΎΡΠ΅ΡΡ ΠΠ‘ "Π½Π° ΡΡΠ΅ΡΠΎΠΈΠ΄Π°Ρ ": ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ΅ΡΡΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ?
- Π‘Ρ Π΅ΠΌΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΠΈ
- dockerd
- docker cli
- disk image provisioning tool (dockercli) and Dockerfile
- disk image
- disk image registries: docker hub and corporate registries
- container = running process + container data (container layer)
puml
@startuml
node "container\nregistry" {
database "disk\nimage" as disk_image
}
node "host" {
rectangle "container" {
component "application"
database "container\nlayer" as layer
}
database "disk" {
database "image"
file "volume"
folder "shared\nfolder" as folder
disk_image - image
}
image --layer
volume -# container
folder -# container
}
container #--# host : "port\nmapping"
@enduml
-
ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ UI
-
docker cli
-
podman cli
-
GUI Π² Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π΅ Π΄Π»Ρ MacOS
-
GUI Π² IDEA
-
...
-
ΠΡΠΎΠ³ΠΎ
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ β ΡΡΠΎ Π½ΠΎΠ²ΡΠΉ ΡΠΊΠ·Π΅ΡΠ½ΠΈΠΊ. ΠΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡΠΉ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ.
-
Given
-
ΡΠ΄Π΅Π»Π°Π½ ΡΠΎΡΠΊ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π° Π΄Π»Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΠΎΠΌΠ΅ΡΠΎΠΊ
-
ΡΠΎΡΠΊ ΠΎΡΠΊΡΡΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Π΄Π»Ρ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΌΠ΅ΡΠΎΠΊ
-
Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Ρ copy+paste Π΄Π»Ρ ΡΠ΅ΡΡΡΡΠΎΠ² ΡΠ°Π·Π΄Π΅Π»Π° Prerequisites ΠΏΠ»Π΅ΠΉΡΡ ΠΎΠ»Π΄Π΅ΡΡ Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ
-
Π‘ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½Ρ ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² Ρ ΡΠ΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠ»Π΅ΠΉ Π² ΠΏΠ°ΡΠ΅
-
Hint: ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΡ ΠΊΠΎΠΌΠ°Π½Π΄ docker cli
-
Hint:
... --help
-
Hint: docker cli reference
-
Hint: ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
Tab
ΠΈβ
Π΄Π»Ρ Π°Π²ΡΠΎΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ -
"ΠΠ°ΠΊ ΠΎΠΏΠΈΡΠ°ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄?"
Π ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅:
- ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
- ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
- ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
- When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "How to check system information?"
docker version # How to check docker and api version?
docker system info # docker info like dokker root folder, plugins
docker system df #docker disk usage
docker events
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
(Π² Π½ΠΎΠ²ΠΎΠΌ ssh shell, ΡΡΠΎΠ±Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π²ΠΈΠ΄Π΅ΡΡ Π²ΡΠ²ΠΎΠ΄
docker events
)
docker logout
open https://hub.docker.com/settings/security # to make Access Token
docker login -u {{ registry-account }} -p {{ access-token }} # login default hub.docker.com registry
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "How to pull image?"
docker image pull alpine
docker system df
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "How to work with containers?"
docker container ls [--all] # SHow all containers default running and -a all
docker container run --name demo -it alpine
/# cat /etc/os-release
/# exit
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker container ls [--all]
docker container rm [--force] demo # --force remove running container
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- Π£ΡΠΏΠ΅ΡΠ½Π° Π»ΠΈ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ docker?
- ΠΠ°ΠΊΠ°Ρ Π²Π΅ΡΡΠΈΡ API?
- ΠΡΠΊΡΠ΄Π° Π²Π·ΡΠ»ΡΡ ΠΎΠ±ΡΠ°Π· Π΄ΠΈΡΠΊΠ°?
- Π‘ΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡΠ° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΎΠ±ΡΠ°Π·?
- Π‘ΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡΠ° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?
- ΠΠ°ΠΊΠ°Ρ Π²Π΅ΡΡΠΈΡ ΠΎΠ±ΡΠ°Π·Π° ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ?
- ΠΠ°ΠΊΠ°Ρ Π³ΠΎΡΡΠ΅Π²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°?
- ΠΠ°Π΄Π°ΡΠ° ΡΡΠ΅Π΄Ρ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²: ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ Π΄ΠΈΡΠΊΠ°
- ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΈΡΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π½Π° Π΄ΠΈΡΠΊ Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ: ΠΎΠ±ΡΠ°Π·
- Π§ΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π½Π° Π΄ΠΈΡΠΊΠ΅ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΈ ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ?
- Π‘ΠΎΡΡΠ°Π² ΠΎΠ±ΡΠ°Π·Π° Π΄ΠΈΡΠΊΠ° (ΠΎΡ
scratch
Π΄ΠΎ prod-ready) - OS libraries
- OS executables
- Application libraries
- Application executables
- Config files
- Data files
$ docker run --rm -it alpine ls
bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
- ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ²:
id
ΠΊΠ°ΠΊ Ρ Π΅Ρ [ΡΠ»ΠΎΡ] ΠΎΠ±ΡΠ°Π·Π°Ρ ΠΎΡΡ/ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ/ΠΈΠΌΡ:ΡΠ΅Π³
Ρ ΠΎΡΡ/ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ/Π³ΡΡΠΏΠΏΠ°/ΠΈΠΌΡ:ΡΠ΅Π³
- ΠΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» ΠΎΠ±ΡΠ°Π·Π° Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ git
docker container run
+ side effects >docker container commit
>docker image push
# ΡΠ΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ "ΡΡΡΠ½ΠΎΠΉ" ΠΠ¦docker image build
>docker image push
>docker image pull
|docker container run
# ΡΡΠ°ΡΠ½ΡΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΠ¦
- Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π·Π° Π½Π° Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅: OverlayFS
- ΠΡΠΈΠ΅ΠΌ copy-on-write Π² OverlayFS
$ docker image ls [--all]
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest b0e47758dc53 6 weeks ago 5.33MB
hello-world latest a29f45ccde2a 19 months ago 9.14kB
$ docker image history ekr26/backend:1.0.0
IMAGE CREATED CREATED BY SIZE COMMENT
e96641ea7cdf 2 days ago COPY dbo-1.0-SNAPSHOT.jar /dbo # buildkit 65.9MB buildkit.dockerfile.v0
<missing> 2 days ago ENTRYPOINT ["java" "-jar" "dbo-1.0-SNAPSHOT.β¦ 0B buildkit.dockerfile.v0
<missing> 2 days ago WORKDIR /dbo 0B buildkit.dockerfile.v0
<missing> 2 days ago RUN /bin/sh -c mkdir -p /dbo # buildkit 0B buildkit.dockerfile.v0
<missing> 2 days ago EXPOSE map[8080/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 5 days ago /bin/sh -c #(nop) ENV JAVA_HOME=/opt/java/o⦠0B
<missing> 5 days ago /bin/sh -c set -eux; apk add --no-cache β¦ 96.9MB
<missing> 5 days ago /bin/sh -c #(nop) COPY multi:b8938281d618ac3β¦ 16.7kB
<missing> 5 days ago /bin/sh -c #(nop) ENV JAVA_VERSION=jdk8u282β¦ 0B
<missing> 5 days ago /bin/sh -c apk add --no-cache tzdata --virtu⦠14.2MB
<missing> 5 days ago /bin/sh -c #(nop) ENV LANG=en_US.UTF-8 LANG⦠0B
<missing> 6 days ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 6 days ago /bin/sh -c #(nop) ADD file:f77db8e5b937d8ebb⦠5.58MB
$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
ββ<missing> Virtual Size: 5.6 MB
β ββ<missing> Virtual Size: 5.6 MB
β ββ<missing> Virtual Size: 5.6 MB
β ββ<missing> Virtual Size: 19.8 MB
β ββ<missing> Virtual Size: 19.8 MB
β ββ<missing> Virtual Size: 19.8 MB
β ββ<missing> Virtual Size: 116.7 MB
β ββ<missing> Virtual Size: 116.7 MB
β ββ<missing> Virtual Size: 116.7 MB
β β ββ<missing> Virtual Size: 116.7 MB
β β ββ<missing> Virtual Size: 116.7 MB
β β ββ<missing> Virtual Size: 136.7 MB
β β ββ<missing> Virtual Size: 136.7 MB
β β ββ3c1355b22f16 Virtual Size: 136.7 MB Tags: training-docker/ekr-stub:1.0.0
β ββ<missing> Virtual Size: 116.7 MB
β ββ<missing> Virtual Size: 116.7 MB
β ββ<missing> Virtual Size: 116.7 MB
β ββ<missing> Virtual Size: 116.7 MB
β ββe96641ea7cdf Virtual Size: 182.6 MB Tags: training-docker/ekr-backend:1.0.0
-
docker image history
+docker image inspect
- ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
docker run -v /var/run/docker.sock:/run/docker.sock -ti -e TERM tomastomecek/sen
- dive
- ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠ»ΠΎΠ΅Π²: 127
-
Given ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
-
When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
-
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker image ls # TODO: ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΠΊΠΈ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² Π΄Π»Ρ Π±ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker image pull alpine
docker image ls
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker image history alpine
docker image inspect alpine
docker image inspect --format='{{.Id}} -> {{.Parent}}' alpine
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker container run --name demo -it alpine
/# touch side-effect.txt
/# exit
docker container diff demo
docker container commit demo {{ registry-account }}/demo
docker image ls
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker image tag {{ registry-account }}/demo:latest {{ registry-account }}/demo:1.0.0
docker image ls
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker image push {{ registry-account }}/demo:1.0.0
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker image ls
docker container rm demo
docker image prune
docker image ls
docker image rm {{ registry-account }}/demo:1.0.0
docker image ls
docker image rm {{ registry-account }}/demo:latest
docker image ls
docker image prune --all
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- ΠΠ°ΠΊΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ°Π·Π°?
- ΠΠ°ΠΊΠΎΠΉ ΡΠ΅Π³ Ρ ΠΎΠ±ΡΠ°Π·Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΌΠΈΡΠΎΠΌ?
- ΠΠ°ΠΊΠΎΠΉ ΡΠ΅Π³ Ρ ΠΎΠ±ΡΠ°Π·Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
pull
? - Π ΡΠ΅ΠΌ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΌΡΡΠ» ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ
rm
? - ΠΡΠ΅Π³Π΄Π° Π»ΠΈ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°Π· ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅
rm
? - Π§ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ prune?
- Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ dangling image?
-
container = running process + container data (container layer)
-
Π§ΡΠΎ Π·Π½Π°ΡΠΈΡ "Π·Π°ΠΏΡΡΠΊ" ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°? Π§ΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΌ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ?
-
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅?
-
Π§ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°?
-
ΠΈΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° (+defaults)
-
disk image
-
virtual network
-
folder | volume mapping
-
entry point (image
entrypoint
override) -
guest environment variables
-
command line arguments (image
cmd
override) -
ΠΠΊΡΡΠ΅ΡΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
-
docker container create
+docker container start
=docker container run
[args]
-
docker container pause
,docker container unpause
-
docker container commit
-
ΠΏΡΠΎΡΠΌΠΎΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²
docker container ls [--all]
-
ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠ°Π±ΠΎΡΠ΅ΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ
-
ΠΏΡΠΎΡΠΌΠΎΡΡ Π»ΠΎΠ³Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
-
docker container stop
-
docker container rm
-
ΠΠ°ΠΏΡΡΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π² ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΠΈ ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ°Ρ :
-d
vs-it
-
Π‘ΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?
-
ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅?
-
ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ c PID 1 (ΠΈΠ· Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ENTRYPOINT + CMD) ΠΈ ΠΏΠΎ Π΅Π³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΡΠΎΠΆΠ΅, ΠΆΠ΅ΡΡΠΊΠΎ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ
-
ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΎΡΠ΅Π½Ρ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ²ΠΎΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ
-
Π² ΡΠ΅Π»ΠΎΠΌ Π²ΡΡ ΡΠΈΠ»ΠΎΡΠΎΡΠΈΡ, ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ ΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ½Ρ Docker ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ "service per container"
-
ΠΈΠ½Π°ΡΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ, ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΡΡ, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΎΠ³ΠΈ, ΡΠ°Π·Π΄Π΅Π»ΡΡΡ ΡΠ΅ΡΡΡΡΡ ΠΈ Π΄Π°Π½Π½ΡΠ΅, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
-
Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π³ΡΡΠΏΠΏΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΡ
-
Given ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
-
[optional]
sudo yum install -y jq
# json cli viewer -
When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠΎΡΠΌΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
-
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ²?"
docker container ls --all
docker container ls --format '{{.ID}} | {{.Names}} | {{.Status}} | {{.Image}}'
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ 'ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΉ' ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?"
docker container run --rm -it alpine # note `--rm`
/# exit
docker container ls
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅?"
docker container run --detach --name proxy --publish 80:80 nginx:1.19.4 # note `--detach`
docker container ls
curl localhost:80
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ 'ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ' ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅ΠΌΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ?"
docker container logs
docker container attach --sig-proxy=false # otherwise detach key `ctrl-c` will stop container
docker container top
docker container exec -it /bin/sh
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°?"
docker container port
docker container inspect [| jq]
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π½Π° ΠΏΠ°ΡΠ·Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?"
docker container pause
docker container unpause
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ Π±Π΅Π· Π·Π°ΠΏΡΡΠΊΠ°?"
docker container create
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?"
docker container start
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ½ΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?"
docker container start
docker container restart
docker container stop # send SIGTERM, and then SIGKILL after grace period
docker container kill # send SIGKILL, or specified signal
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?"
docker container rm --force
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠ΄Π°Π»ΠΈΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?"
docker container rm
docker container prune
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠ·Π½Π°ΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ container data (container layer)?"
docker container diff
docker container commit
- ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΎΠ±ΠΌΠ΅Π½ΡΡΡΡΡ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ?"
docker container cp
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- ΠΠ°ΠΊΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°?
- ΠΠ°ΠΊΠΎΠ΅ ΠΈΠΌΡ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ?
- Π ΡΠ΅ΠΌ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΌΡΡΠ» ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°?
- Π§ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ
prune
? - Π‘ΠΊΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΡ
layers Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°
commit
ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡ ΠΎΠ±ΡΠ°Π·Ρ?
- Π¦Π΅Π½Π½ΠΎΡΡΡ
- Π§ΡΠΎ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ
- Π§ΡΠΎ ΡΠ»ΡΡΡΠΈΡΡ
- ΠΠ°ΠΊΠΈΠ΅ Π²ΠΎΠΏΡΠΎΡΡ Π΄ΠΎΠ·Π°ΠΊΡΡΡΡ
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°: Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ±ΠΎΡΠΊΠ° ΠΎΠ±ΡΠ°Π·Π° "Ρ Π½ΡΠ»Ρ" (30)
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ±ΠΎΡΠΊΠ° β "ΡΡΠΎ Π΄ΡΡΠ³ΠΎΠ΅!"
- ΡΠ°ΡΡΡ CI/CD pipeline:
- ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΠ°ΡΡΠΎΡΠ΅ ΡΠ±ΠΎΡΠΎΠΊ
- ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΠΊΠΎΡΠΎΡΡΠΈ ΡΠ±ΠΎΡΠΎΠΊ
- ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΎΡΡΠΈ
- ΠΠ°ΠΊΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ²Π΅ΡΡΠΈΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ ΠΎΠ±ΡΠ°Π·Π° Π² ΡΠ»ΡΡΠ°Π΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ±ΠΎΡΠΊΠΈ?
- ΠΠΊΡΡΠ΅ΡΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ ΠΎΠ±ΡΠ°Π·Π°
- ΠΠΎΠΌΠ°Π½Π΄Π° ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ°Π·Π°
docker [image] build
- ΠΠΎΠ½ΡΡΠΈΠ΅ build context
- ΠΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ (Π²ΠΊΠ»ΡΡΠ°Ρ
--pull
,--no-cache
)
$ docker image build .
Uploading context 6.76 MB
Step 1/2 : FROM busybox
---> 769b9341d937
Step 2/2 : CMD echo Hello world
---> Using cache
---> 99cc1ad10469
Successfully built 99cc1ad10469
- Π‘ΡΡΡΠΊΡΡΡΠ° Dockerfile ΠΈ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²
- ΠΠ»ΡΡΠ΅Π²ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ Dockerfile
FROM
WORKDIR
ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠ°ΠΏΠΊΡ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈCOPY
andADD
from build context (+.dockerignore
)RUN
(+shell
and preferredexec
forms) andSHELL
for non-default shellENV
ARG
EXPOSE
documentationVOLUME
ENTRYPOINT
andCMD
(+ preferredexec
and similardefault parameters to ENTRYPOINT
,shell
forms)
docker container run [--entrypoint Dockerfile's ENTRYPOINT override] IMAGE [Dockerfile's CMD defaults override]
FROM alpine
ENTRYPOINT ["echo", "Hello"]
CMD ["World"] # 'default parameters to ENTRYPOINT' form
...
$ docker build --tag test .
...
$ docker run --rm test
Hello World
...
$ docker run --rm test Alpine
Hello Alpine
-
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ Π΄Π»Ρ Π±Π°Π·Ρ VS ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ
-
Dockerfile should specify at least one of
CMD
orENTRYPOINT
commands -
ENTRYPOINT
should be defined when using the container as an executable. -
CMD
should be used as a way of defining default arguments for anENTRYPOINT
command or for executing an ad-hoc command in a container -
CMD
will be overridden when running the container with alternative arguments -
If
CMD
is defined from the base image, settingENTRYPOINT
will resetCMD
to an empty value -
ΠΠ΅ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°Π·Π° ΡΠ΅ΡΠ΅Π· ΡΠ΅Π³ΠΈ
-
ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ
:latest
-
semantic versioning
-
unique tags
- Given ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
- ΠΡΠ΄ΡΡΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠ°ΠΏΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΡΠΎΠ·Π΄Π°Π΄ΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΡΠΎΠΉ ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΡΠ°ΠΊΡΠΈΠΊ
application
βββ backend
β βββ Dockerfile
β βββ dbo-1.0-SNAPSHOT-sources.zip
β βββ dbo-1.0-SNAPSHOT.jar
βββ db
β βββ Dockerfile
βββ proxy
β βββ Dockerfile
β βββ nginx.conf
βββ stub
β βββ mappings
β β βββ legacyAccountingSystemResponse.json
β βββ Dockerfile
β βββ wiremock-standalone-2.27.2.jar
βββ docker-compose.yml
- Π‘ΠΎΠ·Π΄Π°Π½Π° ΡΠ°Π±ΠΎΡΠ°Ρ ΠΏΠ°ΠΏΠΊΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°
mkdir application
- When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠΎΡΠΌΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ°Π· Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Dockerfile?"
cd application
cat backend/Dockerfile # check it for reference of new base/Dockerfile
mkdir base
nano base/Dockerfile #TODO describe image that based on CentOS fixed fresh available version and install java-1.8.0-openjdk-headless with `yum install -y`
docker image build --tag {{ registry-account }}/base:1.0.0 ./base # where Dockerfile located
docker image push {{ registry-account }}/base:1.0.0
-
Given
-
ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
-
ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΡΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄
-
Dockerfiles Π΄Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
-
When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠΎΡΠΌΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
-
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ Π·Π°Π΄Π°ΡΡ "ΡΡΠΆΠΎΠΉ" ΠΎΠ±ΡΠ°Π· ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²ΡΠΉ Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ²?"
cd application
nano backend/Dockerfile # TODO fix FROM for new base image
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΎΠΏΠΈΡΠ°ΡΡ provision ΠΎΠ±ΡΠ°Π·Π° Π² Dockerfile?"
cd application/backend
cat Dockerfile # check out application's default configuration
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠΎΠ±ΡΠ°ΡΡ ΡΠ²ΠΎΠΉ ΠΎΠ±ΡΠ°Π· Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° Π±Π°Π·Π΅ Dockerfile?"
cd application
docker image build --tag {{ registry-account }}/backend:1.0.0 ./backend
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΎΠ±ΡΠ°Π· Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ?"
docker login
docker image push
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ "ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΉ" ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π½Π° Π±Π°Π·Π΅ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π·Π° Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ?"
docker container run \
--name backend \
--rm \ # ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΉ: ΡΠ΄Π°Π»ΠΈΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ
--detach \ # -d
--publish 8080:8080 \ # [host address:]8080:8080
--env SPRING_PROFILES_ACTIVE=qa \ # Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
--volume $(pwd)/log:/dbo/log \ # ΠΏΠ°ΠΏΠΊΠ° Π² ΠΊΠΎΠ½Π΅ΠΉΠ½Π΅ΡΠ΅ /dbo/log ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° Π½Π° ΠΏΠ°ΠΏΠΊΡ Π½Π° Ρ
ΠΎΡΡΠ΅ /current-path/log
{{ registry-account }}/backend:1.0.0 \ # ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΈ ΡΠ΅Π³
--spring.profiles.active=qa # ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
curl localhost:8080/dbo/actuator/health
curl -X POST localhost:8080/dbo/actuator/shutdown
docker container ls --all
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- Π ΠΊΠ°ΠΊΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ Dockerfile?
- Π‘ΠΊΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΡ layers Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° ΡΠ±ΠΎΡΠΊΠ° ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡ ΠΎΠ±ΡΠ°Π·Ρ?
- ΠΠΎΠ³Π΄Π° ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?
- Π‘ΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π²Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΎΠΉ ΡΠΊΡΡΠ΅ΡΠ½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ?
- ΠΠ°ΠΊΠΈΠ΅ ΠΏΡΠΈΠΎΡΠΈΠ΅ΡΡ Ρ ΡΡΠΈΡ ΡΠΎΡΠ΅ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ?
- Π§ΡΠΎ ΡΠ»ΡΡΠΈΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
docker run ... --spring.profiles.active=preprod
?
- Π§ΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π»Ρ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ multi-container ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ?
- Π¦Π΅Π»ΠΎΡΡΠ½Π°Ρ ΡΠ±ΠΎΡΠΊΠ° ΠΎΠ±ΡΠ°Π·ΠΎΠ² (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ)
- Π¦Π΅Π»ΠΎΡΡΠ½ΡΠΉ Π·Π°ΠΏΡΡΠΊ, ΡΠ°Π±ΠΎΡΠ° ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅
- ΠΠ°ΠΊΠΈΠ΅ ΡΠ΅ΡΡΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ?
- network
- volumes/folders
- ΠΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΡ:
compose
,swarm
,k8s (+minikube)
ΠΈ ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ - ΠΠ»ΠΈΠ΅Π½ΡΡ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΠΎΠ²: Docker Compose (+build) ΠΈ Docker Stack over Swarm/k8s/minikube (-build)
- ΠΠ΅ΠΌΠΎ
cat docker-compose.yml
-
Given ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
-
When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠΎΡΠΌΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
-
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
cd application/backend
nano Dockerfile # TODO fix active Spring profile to `preprod` instead of `qa`
docker image build --tag {{ registry-account }}/backend:1.0.0 ./backend
cd application/stub
nano Dockerfile # TODO fix FROM for new custom base image
docker image build --tag {{ registry-account }}/stub:1.0.0 ./stub
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
cd application
docker container run \
--detach \
--name db \
--publish 5432:5432 \
--volume db:/var/lib/postgresql/data \
--env POSTGRES_DB=dbo-db \
--env POSTGRES_USER=dbo \
--env POSTGRES_PASSWORD=dbo \
postgres:11-alpine
docker container run \
--detach \
--name stub \
--publish 8888:8888 \
{{ registry-account }}/stub:1.0.0
curl localhost:8888/api/account [| jq]
docker container run \
--detach \
--name backend \
--publish 8080:8080 \
--env SPRING_PROFILES_ACTIVE=preprod \ # Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π² Dockerfile
--env SPRING_DATASOURCE_URL="jdbc:postgresql://$(hostname -i)/dbo-db" \
--env SPRING_DATASOURCE_USERNAME=dbo \
--env SPRING_DATASOURCE_PASSWORD=dbo \
--env SPRING_INTEGRATION_LEGACYACCOUNTINGSYSTEM_BASEURL="http://$(hostname -i):8888/api" \
{{ registry-account }}/backend:1.0.0
curl -H "X-API-VERSION:1" localhost:8080/dbo/actuator/health [| jq]
curl -H "X-API-VERSION:1" localhost:8080/dbo/api/account [| jq]
open http://{{ external host ip }}:8080/dbo/swagger-ui.html
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker container ls [--all]
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker container stop
docker container rm [--force]
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- ΠΠΎ ΠΊΠ°ΠΊΠΎΠΌΡ URL ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π΄ΠΎΡΡΡΠΏ ΠΊ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ?
- Π‘ΠΈΡΡΠ΅ΠΌΠ° ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½Π°?
- ΠΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΡΠΊΡΡΠ΅ΡΠ½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, ΠΊΠ°ΠΊ ΡΠ²ΡΠ·Π°Π½Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ?
- ΠΠ°ΠΊΠΈΠ΅ ΡΠ΅ΡΡΡΡΡ Π±ΡΠ»ΠΈ Π²ΠΈΡΡΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ?
- ΠΠ°ΠΊΠΎΠΉ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ?
- Π§ΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ Π² ΠΎΠ±ΡΠ°Π·Π΅ ΠΏΡΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°?
- ΠΠ°ΠΊ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΠ±ΡΠ°Π·Π΅?
- ΠΠ°ΠΊ ΠΎΡΠΊΠ°ΡΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΠ±ΡΠ°Π·Π΅?
- ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π° Π΄ΠΈΡΠΊΠ΅ Π²Π½Π΅ ΠΎΠ±ΡΠ°Π·Π°?
- Stateful VS Stateless containers
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΠΌΠΈ Π½Π° Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅
- Shared folders ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ FS
cd application
docker container run --volume "$(pwd)"/folder/file:/folder/file:ro # ΠΏΡΡΠΈ Ρ folder Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠ΅, Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ "/"
- Volumes ΠΊΠ°ΠΊ Π±Π»ΠΎΡΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°
cd application
docker container run --volume my_volume:/folder/file:ro # ΠΈΠΌΡ volume Π½Π΅ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ "/"
- ΠΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ»
docker volume
docker volume create
|docker run --volume
|docker build
+ Dockerfiledocker volume ls
docker volume inspect
docker volume rm
|docker volume prune
-
Given ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
-
When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠΎΡΠΌΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
-
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΏΡΠΎΠ±ΡΠΎΡΠΈΡΡ shared folder Ρ Ρ ΠΎΡΡΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ?"
docker container run -v # TODO Π‘Π΄Π΅Π»Π°ΡΡ proxy/Dockerfile Π½Π΅Π½ΡΠΆΠ½ΡΠΌ: ΠΏΡΠΎΠ±ΡΠΎΡΠΈΡΡ nginx.conf ΠΊΠ°ΠΊ read-only ΡΠ°ΠΉΠ» Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ proxy ΠΏΡΠΈ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΠΊΠ΅ (Π½Π΅ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅)
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ volumes/folders ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°?"
docker container inspect # "Mounts"
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΠ΅ volumes?"
docker volume ...
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠ΄Π°Π»ΠΈΡΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ volume?"
docker volume ...
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠΏΡΠ°Π²Π»ΡΡΡ volume ΠΈ shared folder Π² docker-compose?"
cd application
nano docker-compose.yml
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- ΠΠ΄Π΅ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ Ρ ΡΠ°Π½ΡΡΡΡΡ volume?
- Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ "Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅" volume?
- ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠΎΠ²
- ΠΠ°ΡΠΈΠ°Π½ΡΡ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ
- Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½ Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΡ
--name
default hostname--hostname
explicit hostname-
localhost
issue - ΡΠ»ΡΡΠ°ΠΉΡΠ΅ 0.0.0.0
-
Given ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
-
Π ΡΠ»ΡΡΠ°Π΅ podman Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΠΈΠΌΠ΅Π½ Ρ ΠΎΡΡΠΎΠ² Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ±ΡΠ°ΡΡ ΠΈ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ»Π°Π³ΠΈΠ½
dnsname
-
When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠΎΡΠΌΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
-
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΡ?"
docker network ...
docker container run \
--detach \
--network my_deployment \
--name db \
--volume db:/var/lib/postgresql/data \
--env POSTGRES_DB=dbo-db \
--env POSTGRES_USER=dbo \
--env POSTGRES_PASSWORD=dbo \
postgres:11-alpine
docker container run \
--detach \
--network my_deployment \
--name stub \
{{ registry-account }}/stub:1.0.0
docker container run \
--detach \
--network my_deployment \
--name backend \
--env SPRING_PROFILES_ACTIVE=preprod \ # Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π² Dockerfile
--env SPRING_DATASOURCE_URL="jdbc:postgresql://db/dbo-db" \ # hostname instead of external ip is the result of virtualizing network
--env SPRING_DATASOURCE_USERNAME=dbo \
--env SPRING_DATASOURCE_PASSWORD=dbo \
--env SPRING_INTEGRATION_LEGACYACCOUNTINGSYSTEM_BASEURL="http://stub:8888/api" \ # hostname instead of external ip is the result of virtualizing network
{{ registry-account }}/backend:1.0.0
cd application
nano proxy/nginx.conf #TODOs
docker image build --tag {{ registry-account }}/proxy:1.0.0 ./proxy
docker container run \
--detach \
--network my_deployment \
--name proxy \
--publish 80:80 \
{{ registry-account }}/proxy:1.0.0
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΊ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΠ΅ΡΡΠΌ?"
docker network connect
docker network disconnect
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΠ΅ΠΉ?"
docker network ls
docker network inspect
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠ΄Π°Π»ΠΈΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅ΡΡ?"
docker network rm
docker network prune
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΠ΅ΡΡΠΌΠΈ Π² docker-compose?"
cd application
nano docker-compose.yml
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- ΠΠ°ΠΊΠ°Ρ ΡΠ΅ΡΠ΅Π²Π°Ρ ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ?
- ΠΠ»Ρ ΠΊΠ°ΠΊΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΌΠ΅ΠΏΠΏΠΈΠ½Π³ ΠΏΠΎΡΡΠΎΠ²? ΠΠΎΡΠ΅ΠΌΡ Π½Π΅ Π΄Π»Ρ Π²ΡΠ΅Ρ ?
- ΠΠ°ΠΊ ΠΌΡ Π·Π°Π΄Π°Π΅ΠΌ Ρ ΠΎΡΡΡ Π² ΡΠΊΡΡΠ΅ΡΠ½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ? ΠΠΎΡΠ΅ΠΌΡ Π½Π΅ ip?
- ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠΎΠ²
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΠ‘ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
- ΠΡΠΎΡΠΌΠΎΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ²
- ΠΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ CPU
- ΠΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
- ΠΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°
- ΠΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² Π² docker-compose
- ΠΠ°ΠΊ Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- ΠΠ°ΠΊ Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π² swarm ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
Hands-on practice quest #07: networked multi-component stateful application resource-limited containerization (10+5)
-
Given ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
-
When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠΎΡΠΌΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
-
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΏΠΎΠ½ΡΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ²?"
docker stats
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ Π»ΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΡΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°?"
docker container run # ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΏΠΎ CPU ΠΈ ΠΏΠ°ΠΌΡΡΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ OOME
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ Π»ΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΡΡΡΡ Π² docker-compose?"
cd application
nano docker-compose.yml # ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΏΠΎ CPU, ΡΡΠΎΠ± Π½Π΅ Π±Π°Π»ΠΎΠ²Π°Π» ΠΈ ΠΏΠΎ ΠΏΠ°ΠΌΡΡΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ OOME
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- ΠΠ°ΠΊΠΈΠ΅ Π»ΠΈΠΌΠΈΡΡ Π½Π° ΡΠ΅ΡΡΡΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Docker ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ?
- ΠΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΏΡΠΈ OOME ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ?
- ΠΠ°ΠΊ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π·Π°? ΠΠ°ΠΊ ΡΡΠΊΠΎΡΠΈΡΡ ΡΠ±ΠΎΡΠΊΡ ΠΎΠ±ΡΠ°Π·Π°?
- ΠΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ Dockerfile ΠΊΠ°ΠΊ ΡΠ»ΠΎΠΈ ΠΎΠ±ΡΠ°Π·Π°
- ΠΊΠ°ΠΆΠ΄Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ²ΠΎΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ
- RUN, COPY, ADD create layers
- Other instructions create temporary intermediate images, and do not increase the size of the build
docker image build --tag stub ./stub
[+] Building 2.2s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 328B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 34B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:8-jre-slim 1.3s
=> [1/5] FROM docker.io/library/openjdk:8-jre-slim@sha256:0330883ffeb5e14c4c15271004cdf6a2df21e827420b71dca01c34e41a23690d 0.1s
=> => resolve docker.io/library/openjdk:8-jre-slim@sha256:0330883ffeb5e14c4c15271004cdf6a2df21e827420b71dca01c34e41a23690d 0.0s
=> => sha256:5563c7e505fa828bd868ae99f24c5a56bb0bd5488a10184f7175d10f167b0898 1.16kB / 1.16kB 0.0s
=> => sha256:a6c8e47b54ca34cb71f873f586aaac09f73ace9bffe1b5b62eb2b05f8c974deb 7.14kB / 7.14kB 0.0s
=> => sha256:0330883ffeb5e14c4c15271004cdf6a2df21e827420b71dca01c34e41a23690d 320B / 320B 0.0s
=> [internal] load build context 0.4s
=> => transferring context: 20.00MB 0.4s
=> [2/5] RUN mkdir -p /stub/mappings 0.5s
=> [3/5] WORKDIR /stub 0.0s
=> [4/5] COPY mappings/* mappings/ 0.0s
=> [5/5] COPY wiremock-standalone-2.27.2.jar /stub 0.1s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:0a8dfafa48b9c717b862532fe441e8f2db7146a6deb8380768e6a713c75a6da4 0.0s
=> => naming to docker.io/library/stub
- ΠΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²
docker image build --tag stub ./stub
[+] Building 1.9s (11/11) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 328B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 32B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:8-jre-slim 1.8s
=> [auth] library/openjdk:pull token for registry-1.docker.io 0.0s
=> [1/5] FROM docker.io/library/openjdk:8-jre-slim@sha256:0330883ffeb5e14c4c15271004cdf6a2df21e827420b71dca01c34e41a23690d 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 689B 0.0s
=> CACHED [2/5] RUN mkdir -p /stub/mappings 0.0s
=> CACHED [3/5] WORKDIR /stub 0.0s
=> CACHED [4/5] COPY mappings/* mappings/ 0.0s
=> CACHED [5/5] COPY wiremock-standalone-2.27.2.jar /stub 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:1b7c6f374f61947cd1e96233307f4fa56dfc3c0e5fd6bf228b0e7e27803ca011 0.0s
=> => naming to docker.io/library/stub
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ build cache: ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² Π² Dockerfile
- Π‘ΠΎΡΡΠ°Π²Π½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
- ΠΡΠ±ΠΎΡ ΠΎΠ±ΡΠ°Π·Π°-ΠΏΡΠ΅Π΄ΠΊΠ°: Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΡΠ΅ ΠΠ‘, busybox ΠΈ
scratch
-ΠΎΠ±ΡΠ°Π·
Hands-on practice quest #08: build-optimized networked multi-component stateful application resource-limited containerization (15+5)
-
Given ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
-
When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠΎΡΠΌΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
-
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ±ΠΎΡΠΊΡ?"
nano application/backend/Dockerfile # TODO ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ±ΠΎΡΠΊΡ ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠΈ
nano application/proxy/Dockerfile
nano application/stub/Dockerfile
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠ΅ΡΠ΅ΠΌ ΡΠ±ΠΎΡΠΊΠΈ?"
docker builder prune [--all]
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ±ΠΎΡΠΊΠΈ Π² ΠΈΠ·ΠΌΠ΅ΡΡΠ΅ΠΌΡΡ ΠΌΠ΅ΡΡΠΈΠΊΠ°Ρ ?
- ΠΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ security ΡΠΈΡΠΊΠΈ
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ°Π·Ρ: Π±ΡΡΡΡΠ΅Π΅ ΠΈ ΠΌΠ΅Π½ΡΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ + ΠΌΠ΅Π½ΡΡΠ΅ ΡΠΈΡΠΊΠΎΠ²
- ΠΠ°ΠΏΡΡΠΊ Π² rootless mode ΠΈΠ»ΠΈ ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΌΠΈ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠ°Π²
- ΠΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π·Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ
- Π‘ΠΊΠ°Π½Π΅ΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠ΅ΠΉ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π·ΠΎΠ²
docker scan --dependency-tree <image>
- ΠΠΈΠ½ΡΠ΅ΡΡ Π΄Π»Ρ Dockerfile
- COPY Π²ΠΌΠ΅ΡΡΠΎ ADD
- ΠΠΊΠΊΡΡΠ°ΡΠ½ΠΎ Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ + .dockerignore
- Π€ΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ΅Π³ΠΈ Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ°Π·ΠΎΠ² (Semantic versioning vs Unique tags)
-
Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΈ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ
-
ΠΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΠΆΡΡΠ½Π°Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΡΡΡΠΏ ΠΊ Π»ΠΎΠ³Π°ΠΌ
- docker logging drivers
- dedicated logs shared folders/volumes
- remote log collectors
-
ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³
-
ΠΠ°ΡΡΠ΅ΡΠ½ Builder vs "multi-stage build" Π΄Π»Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ ΠΠ: CI/CD pipeline
-
Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅, ΡΡΠΎΠ±Ρ Π² ΠΈΡΠΎΠ³ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ°Π· Π½Π΅ ΡΡΠ΅ΠΊΠ»ΠΈ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
Hands-on practice quest #09: build-optimized networked multi-component stateful application resource-limited best practice based containerization (10+5)
-
Given ΠΏΠ°ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ²
-
When ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ ΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΈ, ΡΠΎΡΠΌΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΈΡ Π²ΡΠ²ΠΎΠ΄ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
-
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ...?"
docker info --format '{{.LoggingDriver}}'
docker container run -it --log-driver local --log-opt mode=non-blocking --log-opt max-buffer-size=4m
docker inspect -f '{{.HostConfig.LogConfig.Type}}'
docker logs
- Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ "ΠΠ°ΠΊ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ multi-stage ΡΠ±ΠΎΡΠΊΡ ΠΎΠ±ΡΠ°Π·Π°?"
cd application/backend
nano Dockerfile # TODO: BUILD stage with `mvn clean verify` and QA stage with `java -jar ... --spring.profiles.active=qa`
- Then ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΈ Π΄Π΅Π»ΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ
- ΠΠ°ΠΊ ΠΏΡΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ?
- ΠΠ°ΠΊΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ ΠΠ°ΠΌ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ½ΠΈΠΌΠ°ΡΡ?
- ΠΠ°ΠΊ Docker ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΡΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
- ΠΠ΅ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π΄ΠΈΡΡΠΈΠΏΠ»ΠΈΠ½Π°
- ΠΠ±ΡΠ°Π· Π΄Π»Ρ ΡΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΡΠΌΠΈ ΡΠ΅ΡΡΠΎΠ²ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ
- ΠΠ΅Π³ΠΊΠΈΠΉ ΡΡΠ°ΡΡ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ on demand
- ΠΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΡΠ·ΠΊΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ
- ΠΠ°ΠΊ Docker ΡΠΏΡΠΎΡΠ°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
- TestContainers
- k8s Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ docker: Π²ΡΠ΅ ΠΏΡΠΎΠΏΠ°Π»ΠΎ?
- ΠΠ°ΠΊ ΡΡΡΡΠΎΠ΅Π½ Docker? ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ.
- ΠΠ°ΠΊ ΡΡΡΡΠΎΠ΅Π½Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈ? ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ.
- Π¦Π΅Π½Π½ΠΎΡΡΡ
- Π§ΡΠΎ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ
- Π§ΡΠΎ ΡΠ»ΡΡΡΠΈΡΡ
- ΠΠ°ΠΊΠΈΠ΅ Π²ΠΎΠΏΡΠΎΡΡ Π΄ΠΎΠ·Π°ΠΊΡΡΡΡ
ΠΠ»Ρ ΠΆΠ΅Π»Π°ΡΡΠΈΡ :
- ΠΡΠΎΠΉΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΡ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° Π½Π° stand-alone containers
- ΠΡΠΎΠΉΡΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΡ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΡΠΊΠ΅ΡΡΡΠ°ΡΠΎΡΠ° (docker-compose.yml compliant:
docker compose
,docker stack
in default swarm mode,podman compose
)