Bu makala, Rels default Dockerfile-iň her setirinden geçip, iň oňat tejribeleri we optimizasiýalary düşündirjek ýazgylaryň bir bölegidir.
Doker şekilleri, şekiliň ululygyny azaltmak, öndürijiligi optimizasiýa, howpsuzlyk we dowam etdirmek boýunça iň oňat tejribe we amaly aýratyn optimizasiýalary öz içine alýan, ýöne çäklendirilmedik dürli usullar bilen optimizirlenip bilner. Birinji makalada diňe surat ululygyny azaltmak optimizasiýasyna degip geçerin we olaryň näme üçin möhümdigini düşündirerin.
Programma üpjünçiligini ösdürmegiň beýleki ähli işlerinde bolşy ýaly, her bir dörediji Docker-iň has çalt gurulmagyny islemeginiň sebäplerini sanap geçer. Meniň üçin iň möhüm sebäpleri sanap geçerin.
Kiçijik şekilleri gurmak has çalt, sebäbi has az faýl we gatlak işlenmeli. Bu, esasanam iteratiw ösüş sikllerinde işläp düzüjiniň öndürijiligini ýokarlandyrýar. Has kiçi suratlar, reýestre basmak we ýerleşdirilende ondan çekmek üçin az wagt alýar. Konteýnerler ýygy-ýygydan gurulýan we ýerleşdirilýän CI / CD turbageçirijilerinde bu aýratyn möhümdir.
Kiçijik suratlar konteýner registrlerinde, ýerli ösüş maşynlarynda we önümçilik serwerlerinde az saklanýar. Bu, esasanam uly göwrümli enjamlar üçin infrastruktura çykdajylaryny azaldar. Kiçijik suratlar, serwerleriň arasynda geçirilende has az geçirijilik giňligini ulanýar, esasanam ýerli ýa-da CI / CD turbageçirijilerinde şekilleri guranyňyzda we reýestre basanyňyzda möhümdir.
"2022-nji ýylda bulut üçin 3,2 million dollar sarp etdik ... Bulut çykyşymyzdan bäş ýylyň dowamynda serwer çykdajylaryny takmynan 7 million dollar tygşytlamaly." David Heinemeier Hansson - HEY World
Kiçijik suratlar, konteýnerleşdirilen programmalaryň umumy işleýşini gowulandyrmak we ýüklemek üçin az çeşmeleri (meselem, CPU, RAM) talap edýär. Has çalt başlangyç wagtlary, hyzmatlaryňyzyň has çalt taýýardygyny aňladýar, bu ulalmak we ýokary elýeterlilik ulgamlary üçin möhümdir. alpine
ýa-da debian-slim
ýaly iň az esasy şekiller, öňünden gurlan paketleri az saklaýar, iberilmedik ýa-da gereksiz programma üpjünçiliginiň ulanylmagy howpuny peseldýär.
Aboveokarda agzalan ähli zatlardan başga-da, gereksiz faýllary we gurallary aýyrmak, meseleler anyklanylanda ünsüňi sowup, has oňat saklanmagyna we tehniki berginiň azalmagyna getirýär.
Ululygyny goşmak bilen şekiliň dürli parametrlerini almak üçin “Docker Desktop” -a seredip bilersiňiz ýa-da terminalda docker images
buýrugyny işledip bilersiňiz.
➜ docker images REPOSITORY TAG IMAGE ID CREATED SIZE kamal-dashboard latest 673737b771cd 2 days ago 619MB kamal-proxy latest 5f6cd8983746 6 weeks ago 115MB docs-server latest a810244e3d88 6 weeks ago 1.18GB busybox latest 63cd0d5fb10d 3 months ago 4.04MB postgres latest 6c9aa6ecd71d 3 months ago 456MB postgres 16.4 ced3ad69d60c 3 months ago 453MB
Suratyň ululygyny bilmek size doly surat bermeýär. Suratyň içindäki zatlary, näçe gatlagyny ýa-da her gatyň uludygyny bilmeýärsiňiz. Docker şekil gatlagy, Docker şekiliniň düzüm bölegi bolan diňe okalýan, üýtgewsiz faýl ulgamy gatlagydyr . Her gatlak, faýl goşmak, konfigurasiýalary üýtgetmek ýa-da programma üpjünçiligi gurmak ýaly şekiliň faýl ulgamyna girizilen üýtgeşmeleriň toplumyny aňladýar.
Docker şekilleri yzygiderli, gatlak boýunça gurulýar we her gatlak Dockerfile
-de görkezmä laýyk gelýär. Suratyň gatlaklaryny almak üçin, docker history
buýrugyny işledip bilersiňiz.
➜ docker history kamal-dashboard:latest IMAGE CREATED CREATED BY SIZE COMMENT 673737b771cd 4 days ago CMD ["./bin/thrust" "./bin/rails" "server"] 0B buildkit.dockerfile.v0 <missing> 4 days ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0 <missing> 4 days ago ENTRYPOINT ["/rails/bin/docker-entrypoint"] 0B buildkit.dockerfile.v0 <missing> 4 days ago USER 1000:1000 0B buildkit.dockerfile.v0 <missing> 4 days ago RUN /bin/sh -c groupadd --system --gid 1000 … 54MB buildkit.dockerfile.v0 <missing> 4 days ago COPY /rails /rails # buildkit 56.2MB buildkit.dockerfile.v0 <missing> 4 days ago COPY /usr/local/bundle /usr/local/bundle # b… 153MB buildkit.dockerfile.v0 <missing> 4 days ago ENV RAILS_ENV=production BUNDLE_DEPLOYMENT=1… 0B buildkit.dockerfile.v0 <missing> 4 days ago RUN /bin/sh -c apt-get update -qq && apt… 137MB buildkit.dockerfile.v0 <missing> 4 days ago WORKDIR /rails 0B buildkit.dockerfile.v0 <missing> 3 weeks ago CMD ["irb"] 0B buildkit.dockerfile.v0 <missing> 3 weeks ago RUN /bin/sh -c set -eux; mkdir "$GEM_HOME";… 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV PATH=/usr/local/bundle/bin:/usr/local/sb… 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV BUNDLE_SILENCE_ROOT_WARNING=1 BUNDLE_APP… 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV GEM_HOME=/usr/local/bundle 0B buildkit.dockerfile.v0 <missing> 3 weeks ago RUN /bin/sh -c set -eux; savedAptMark="$(a… 78.1MB buildkit.dockerfile.v0 <missing> 3 weeks ago ENV RUBY_DOWNLOAD_SHA256=018d59ffb52be3c0a6d… 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV RUBY_DOWNLOAD_URL=https://cache.ruby-lan… 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV RUBY_VERSION=3.4.1 0B buildkit.dockerfile.v0 <missing> 3 weeks ago ENV LANG=C.UTF-8 0B buildkit.dockerfile.v0 <missing> 3 weeks ago RUN /bin/sh -c set -eux; mkdir -p /usr/loca… 19B buildkit.dockerfile.v0 <missing> 3 weeks ago RUN /bin/sh -c set -eux; apt-get update; a… 43.9MB buildkit.dockerfile.v0 <missing> 3 weeks ago # debian.sh --arch 'arm64' out/ 'bookworm' '… 97.2MB debuerreotype 0.15
Suratlar we gatlaklar barada eýýäm teoriýa berendigim sebäpli, Dockerfile
-ni öwrenmegiň wagty geldi. Rels 7.1-den başlap, Dockerfile
täze Rail programmasy bilen döredilýär. Aşakda onuň nähili bolup biljekdiginiň mysaly.
# syntax=docker/dockerfile:1 # check=error=true # Make sure RUBY_VERSION matches the Ruby version in .ruby-version ARG RUBY_VERSION=3.4.1 FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base # Rails app lives here WORKDIR /rails # Install base packages # Replace libpq-dev with sqlite3 if using SQLite, or libmysqlclient-dev if using MySQL RUN apt-get update -qq && \ apt-get install --no-install-recommends -y curl libjemalloc2 libvips libpq-dev && \ rm -rf /var/lib/apt/lists /var/cache/apt/archives # Set production environment ENV RAILS_ENV="production" \ BUNDLE_DEPLOYMENT="1" \ BUNDLE_PATH="/usr/local/bundle" \ BUNDLE_WITHOUT="development" # Throw-away build stage to reduce size of final image FROM base AS build # Install packages needed to build gems RUN apt-get update -qq && \ apt-get install --no-install-recommends -y build-essential curl git pkg-config libyaml-dev && \ rm -rf /var/lib/apt/lists /var/cache/apt/archives # Install application gems COPY Gemfile Gemfile.lock ./ RUN bundle install && \ rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \ bundle exec bootsnap precompile --gemfile # Copy application code COPY . . # Precompile bootsnap code for faster boot times RUN bundle exec bootsnap precompile app/ lib/ # Precompiling assets for production without requiring secret RAILS_MASTER_KEY RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile # Final stage for app image FROM base # Copy built artifacts: gems, application COPY --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}" COPY --from=build /rails /rails # Run and own only the runtime files as a non-root user for security RUN groupadd --system --gid 1000 rails && \ useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \ chown -R rails:rails db log storage tmp USER 1000:1000 # Entrypoint prepares the database. ENTRYPOINT ["/rails/bin/docker-entrypoint"] # Start server via Thruster by default, this can be overwritten at runtime EXPOSE 80 CMD ["./bin/thrust", "./bin/rails", "server"]
Aşakda soňky surat ölçegini täsirli etmek üçin ýokardaky Dockerfile
de ulanylýan çemeleşmeleriň we düzgünleriň sanawyny bererin.
Developmenterli ösüş enjamyňyzda diňe zerur programma üpjünçiligini saklaýandygyňyza ynanýaryn. Docker şekillerinde-de edil şonuň ýaly ulanylmaly. Aşakdaky mysallarda ýokardaky Rail Dockerfile-den alnan Dockerfile-i yzygiderli erbetleşdirerin. Asyl Dockerfile
wersiýasy hökmünde görkezerin.
FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base
Esasy şekil Dockerfile
üçin başlangyç nokatdyr. Konteýner döretmek üçin ulanylýan şekil. Esasy şekil Dockerfile
-iň birinji gatlagy we Dockerfile
iň özi tarapyndan döredilmedik ýeke-täk gatlak.
Esasy surat FROM
buýrugy bilen görkezilýär, soň bolsa suratyň ady we belligi. Bellik islege bagly, kesgitlenmedik bolsa iň latest
bellik ulanylýar. Esasy surat Docker Hub-da ýa-da başga bir reýestrde bar bolan islendik surat bolup biler.
Dockerfile
” -de, 3.4.1-slim
ýazgyly ruby
şekili ulanýarys. ruby
şekili, Docker Hub-da bar bolan resmi Ruby şekili . 3.4.1-slim
belligi, debian-slim
şekile esaslanýan Ruby şekiliniň inçe görnüşi. debian-slim
şekil, ululygy üçin optimallaşdyrylan Debian Linux şekiliniň minimal görnüşi. slim
şekiliň näderejede kiçidigi barada düşünmek üçin aşakdaky tablisa serediň.
➜ docker images --filter "reference=ruby" REPOSITORY TAG IMAGE ID CREATED SIZE ruby 3.4.1-slim 0bf957e453fd 5 days ago 219MB ruby 3.4.1-alpine cf9b1b8d4a0c 5 days ago 99.1MB ruby 3.4.1-bookworm 1e77081540c0 5 days ago 1.01GB
2024-nji ýylyň ýanwar aýyna çenli häzirki Debian neşirine kitap gurçugy diýilýär, öňki kitaby öküz .
1GB ýerine 219 MB - ullakan tapawut. Emma alpine
şekili has kiçi bolsa näme etmeli? alpine
şekili, ululygy we howpsuzlygy üçin optimallaşdyrylan aşa ýeňil Linux paýlanyşy bolan “Alpine Linux” paýlanyşyna esaslanýar. “Alp”, GNU kärdeşleriniň ýerine musl
kitaphanasyny ( glibc
ýerine) we busybox
(“Unix” enjamlarynyň ykjam toplumy) ulanýar. “Rails” -i işletmek üçin alpine
şekilini ulanmak tehniki taýdan mümkin bolsa-da, bu makalada bu barada durup geçmerin.
RUN apt-get update -qq && \ apt-get install --no-install-recommends -y curl libjemalloc2 libvips libpq-dev && \ rm -rf /var/lib/apt/lists /var/cache/apt/archives
Dockerfile
-de her RUN
, COPY
we FROM
görkezmeleri täze gatlak döredýär. Näçe köp gatlak bolsa, şekiliň ululygy şonça-da ulydyr. Şonuň üçin iň oňat tejribe, birnäçe buýrugy bir RUN
görkezmesine birleşdirmekdir. Bu nokady görkezmek üçin aşakdaky mysala seredeliň.
# syntax=docker/dockerfile:1 # check=error=true # Make sure RUBY_VERSION matches the Ruby version in .ruby-version ARG RUBY_VERSION=3.4.1 FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base RUN apt-get update -qq RUN apt-get install --no-install-recommends -y curl RUN apt-get install --no-install-recommends -y libjemalloc2 RUN apt-get install --no-install-recommends -y libvips RUN apt-get install --no-install-recommends -y libpq-dev RUN rm -rf /var/lib/apt/lists /var/cache/apt/archives CMD ["echo", "Whalecome!"]
RUN
görkezmesini birnäçe setire böldüm, bu bolsa olary has köp adam okamaga mümkinçilik berýär. Theöne şekiliň ululygyna nähili täsir eder? Geliň, şekili guralyň we barlap göreliň.
➜ time docker build -t no-minimize-layers --no-cache -f no-minimize-layers.dockerfile . 0.31s user 0.28s system 2% cpu 28.577 total
Suraty gurmak üçin 28 sekunt gerek boldy, asyl nusgasyny kiçeldilen gatlaklar bilen gurmak üçin bary-ýogy 19 sekunt gerek ( takmynan 33% çalt ).
➜ time docker build -t original --no-cache -f original.dockerfile . 0.25s user 0.28s system 2% cpu 19.909 total
Suratlaryň ululygyny barlap göreliň.
➜ docker images --filter "reference=*original*" --filter "reference=*no-minimize*" REPOSITORY TAG IMAGE ID CREATED SIZE original latest f1363df79c8a 8 seconds ago 356MB no-minimize-layers latest ad3945c8a8ee 43 seconds ago 379MB
Iň pes gatlakly şekil, kiçeldilmedik gatlaklardan 23 MB kiçidir. Bu ululygyň 6% azalmagydyr . Bu mysalda azajyk tapawut ýaly bolup görünse-de, ähli RUN
görkezmelerini birnäçe setire bölseňiz, tapawut has uly bolar.
Düzgüne görä, apt-get install
maslahat berilýän paketleri we gurnamagyňyzy haýyş eden paketleri gurýar. --no-install-recommends
opsiýasy, maslahat berilýänleri däl-de, diňe anyk görkezilen paketleri apt-get
aýdýar.
➜ time docker build -t without-no-install-recommends --no-cache -f without-no-install-recommends.dockerfile . 0.33s user 0.30s system 2% cpu 29.786 total ➜ docker images --filter "reference=*original*" --filter "reference=*recommends*" REPOSITORY TAG IMAGE ID CREATED SIZE without-no-install-recommends latest 41e6e37f1e2b 3 minutes ago 426MB minimize-layers latest dff22c85d84c 17 minutes ago 356MB
Görşüňiz ýaly, --no-install-recommends
şekil , asyl nusgasyndan 70 MB uludyr. Bu ululygyň 16% ýokarlanmagydyr .
Surata haýsy faýllaryň goşulandygyny görmek üçin çümmek programmasyny ulanyň - makalanyň ahyrynda bu hakda has giňişleýin okaň.
Asyl Dockerfile
apt-get install
buýrugyndan soň rm -rf /var/lib/apt/lists/* /var/cache/apt/archives
buýrugyny öz içine alýar. Bu buýruk, gurnamadan soň zerur däl paket sanawlaryny we arhiwleri aýyrýar. Suratyň ululygyna nähili täsir edýändigini göreliň, munuň üçin arassalamak buýrugy bolmazdan täze Dockerfile
dörederin.
RUN apt-get update -qq && \ apt-get install --no-install-recommends -y curl libjemalloc2 libvips libpq-dev
Suratlary gurmak, asyl nusgasy bilen deň wagt alýar, manysy bar.
➜ time docker build -t without-cleaning --no-cache -f without-cleaning.dockerfile . 0.28s user 0.30s system 2% cpu 21.658 total
Suratlaryň ululygyny barlap göreliň.
➜ docker images --filter "reference=*original*" --filter "reference=*cleaning*" REPOSITORY TAG IMAGE ID CREATED SIZE without-cleaning latest 52884fe50773 2 minutes ago 375MB original latest f1363df79c8a 16 minutes ago 356MB
Arassalamazdan şekil, arassalaýyşdan 19 MB uludyr, bu 5% ýokarlanýar .
Aboveokarda agzalan dört optimizasiýanyň hemmesi ulanylmasa näme etmeli? Geliň, hiç hili optimizasiýa bolmazdan täze Dockerfile
döredeliň we şekili guralyň.
# syntax=docker/dockerfile:1 # check=error=true ARG RUBY_VERSION=3.4.1 FROM docker.io/library/ruby:$RUBY_VERSION AS base RUN apt-get update -qq RUN apt-get install -y curl RUN apt-get install -y libjemalloc2 RUN apt-get install -y libvips RUN apt-get install -y libpq-dev CMD ["echo", "Whalecome!"]
➜ time docker build -t without-optimizations --no-cache -f without-optimizations.dockerfile . 0.46s user 0.45s system 1% cpu 1:02.21 total
Wah, şekili gurmak üçin bir minutdan gowrak wagt gerek boldy.
➜ docker images --filter "reference=*original*" --filter "reference=*without-optimizations*" REPOSITORY TAG IMAGE ID CREATED SIZE without-optimizations latest 45671929c8e4 2 minutes ago 1.07GB original latest f1363df79c8a 27 hours ago 356MB
Optimizasiýasyz şekil, asyl nusgasyndan 714 MB uludyr, bu 200% ýokarlanýar . Bu, Dockerfile
-ni optimizirlemegiň nähili möhümdigini aýdyň görkezýär, has uly suratlar has köp disk ýerini gurmak we sarp etmek üçin has köp wagt sarp edýär.
.dockerignore
faýly Git tarapyndan ulanylýan .gitignore
faýlyna meňzeýär. Faýllary we kataloglary gurluşyň mazmunyndan aýyrmak üçin ulanylýar. Kontekst, şekil gurlanda Docker daemonyna iberilýän faýllaryň we kataloglaryň toplumydyr. Kontekst “Docker” daemonyna tarbol görnüşinde iberilýär, şonuň üçin ony mümkin boldugyça kiçi saklamak möhümdir.
Haýsydyr bir sebäbe görä, taslamaňyzda .dockerignore
faýly ýok bolsa, ony el bilen döredip bilersiňiz. Resmi Rails .dockerignore
faýl şablonyny başlangyç nokady hökmünde ulanmagyňyzy maslahat berýärin. Aşakda onuň nähili bolup biljekdiginiň mysaly.
# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files. # Ignore git directory. /.git/ /.gitignore # Ignore bundler config. /.bundle # Ignore all environment files. /.env* # Ignore all default key files. /config/master.key /config/credentials/*.key # Ignore all logfiles and tempfiles. /log/* /tmp/* !/log/.keep !/tmp/.keep # Ignore pidfiles, but keep the directory. /tmp/pids/* !/tmp/pids/.keep # Ignore storage (uploaded files in development and any SQLite databases). /storage/* !/storage/.keep /tmp/storage/* !/tmp/storage/.keep # Ignore assets. /node_modules/ /app/assets/builds/* !/app/assets/builds/.keep /public/assets # Ignore CI service files. /.github # Ignore development files /.devcontainer # Ignore Docker-related files /.dockerignore /Dockerfile*
Taslamada .dockerfile
faýlynyň bolmagy diňe bir zerur däl faýllary we kataloglary (meselem, .github
bukjasyndan GitHub iş akymlary ýa-da node_modules
JavaScript garaşlylygy) aýyrmaga mümkinçilik bermeýär. Şeýle hem surata tötänleýin duýgur maglumatlary goşmazlyk üçin kömek edýär. Mysal üçin, daşky gurşaw üýtgeýjilerini öz içine alýan .env
faýly ýa-da şahsyýet maglumatlaryny açmak üçin ulanylýan master.key
faýly.
Aboveokarda agzalan ähli optimizasiýa düşündirilende düşnükli bolup biler. Sizde eýýäm ullakan şekil bar bolsa we nireden başlamalydygyňyzy bilmeseňiz näme etmeli?
Iň halanýan we iň peýdaly guralym Dive . Dive, Docker şekilini, gatlak mazmunyny öwrenmek we şekiliň ululygyny kiçeltmegiň usullaryny tapmak üçin TUI guralydyr. Dive, ulgam paket dolandyryjyňyz bilen gurlup bilner ýa-da ony işletmek üçin resmi Docker şekilini ulanyp bilersiňiz. Suraty iň erbet ssenariýamyzdan ulanalyň.
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive:latest without-optimizations
Aboveokardaky skrinshotda, iň optimal däl suratymyzyň gözden geçirilişini görüp bilersiňiz. Çümmek her gatyň ululygyny, şekiliň umumy ululygyny we her gatlakda üýtgedilen (goşulan, üýtgedilen ýa-da öçürilen) faýllary görkezýär. Meniň üçin bu “Dive” -iň iň peýdaly aýratynlygy. Faýllary sag panelde görkezmek bilen, zerur däl faýllary aňsatlyk bilen kesgitläp we surata goşýan buýruklary aýyryp bilersiňiz.
“Dive” -ni hakykatdanam gowy görýän bir zadym, “UI” terminaly bolmakdan başga-da, ýerli ösüşde-de täsirli bolup biljek “CI” üçin amatly önüm berip biler. Ony ulanmak üçin CI
gurşaw üýtgeýjisi bilen “Dive” -i true
, buýrugyň çykyşy aşakdaky skrinshotda.
docker run -e CI=true --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive:latest without-optimizations
Şahsy islegim, Dive-i meýilleşdirilen esasda ulanmak, mysal üçin hepdede bir gezek suratlaryňyzyň gowy ýagdaýda bolmagyny üpjün etmek. Geljekki makalalarda Dockerfile-i barlamak üçin ulanýan awtomatiki iş akymlarymy, şol sanda Dive we Hadolint-i öz içine alaryn.
Gören suratymyň ululygyny kiçeltmegiň bir usuly, gatlaklary gysmaga synanyşmakdyr. Bu pikir, şekiliň ululygyny azaltmak üçin birnäçe gatlagy bir gatlaga birleşdirmekdi. Docker-de eksperimental warianty bardy --squash
, bulardan başga-da, docker-squash ýaly üçünji tarap gurallary bardy.
Bu çemeleşme ozal işlän hem bolsa, häzirki wagtda köneldi we ulanmak maslahat berilmeýär. Gatlak gatlaklary Dokeriň gatlak keş keşbiniň esasy aýratynlygyny ýok etdi. Mundan başga-da, --squash
ulananyňyzda, bilkastlaýyn soňky gatlakdaky öňki gatlaklardan duýgur ýa-da wagtlaýyn faýllary goşup bilersiňiz. Bu inçe däneli dolandyryşyň ýoklugy ýa-da hiç zat däl.
Gatlaklary gysmagyň ýerine köp basgançakly gurluşlary ulanmak maslahat berilýär. Rels Dockerfile
eýýäm köp basgançakly gurluşlary ulanýar, indiki makalada nähili işleýändigini düşündirerin.
Docker şekillerini optimizirlemek, beýleki optimizasiýa ýaly, bir gezek edilip, ýatdan çykarylyp bilinmez . Bu yzygiderli barlaglary we gowulandyrmalary talap edýän dowam edýän prosesdir. Esasy zatlary ýapmaga synanyşdym, ýöne bilmek we düşünmek gaty möhümdir. Indiki makalalarda, Docker-iň has çalt we täsirli gurulmagyna kömek edip biljek has ösen usullary we gurallary açaryn.