Docker image, konteynerlər və tətbiqi
Ötən məqalədə birlikdə docker-engine qurulmasına və bir neçə ilkin əmrlərə baxdıq. Bu məqalədə docker alətinin subəmrlərinə daha detallı baxmağa calısacağıq. Məqalənin ardıcıl əmrlər və onların izahı səklində yorucu olmaması uçun bir senari ətrafında olmasının daha izahlı olacagını düşündüm. Təsəvvür edək ki, bizim Python Flask Web frameworku əsasında proqram təminatımız hazırlanacaq. Tebii ki, fərqli frameworklarla – python, ruby, java, php və s. əsasında olan – oxşar nümunələr göstərə bilərık. Əgər bu məqsədlə bizə 10 ədəd server lazımdırsa, biz 10 ədəd virtual server yaradıb işimizə davam edə bilərik. Ən yaxşı halda biz template virtual server yarada və onu istifadə edə bilərik. Server sayı və hər dəfə əlavə olunacaq dəyişikliklər çoxaldıqca məsələnin dinamikliyini qorumaq daha da çətinləşir. Hər bir virtual serverə sadəcə əməliyyat sistemi ücün 30-40 GB disk və müəyyən qədər əməli yaddaş itiririk. Virtuallaşdırma və bulud platformasını dəyişmək istədikdə yeni çətinliklərlə qarsılaşırıq. Təbii ki, virtual serverlərin də kifayət qədər üstün tərəfləri var. Məqsədim dockerin verə biləcəyi rahatlığı göstərməkdi. Keçək mətləbə.
Ilk öncə bizə istədiyimiz tələbləri özündə saxlayan image hazırlamaq lazımdı. Biz image-ı hazırlayıb, qalan mərhələlərdə onu istifadə edəcəyik. Biz müxtəlif məqsədlərə gorə bir neçə image(test, dev, prod və s.) yarada bilərik. Docker imagi hazırlamaq üçün Dockerfile – adlı fayldan istifadə edilir. Dockerfile yaradılacaq image üçün təlimatları özündə saxlayan text fayldır. Bizim Dockerfile aşagıdakı kimi olacaq.
root@host02:/opt# cat Dockerfile FROM alpine:3.4 MAINTAINER NewEngineer ENV VESRION 1.3 WORKDIR /app ADD requirements.txt requirements.txt COPY app01/ /app/ RUN apk --update add python py-setuptools py-pip \ && pip install -r requirements.txt \ && chmod +x server.py EXPOSE 5000 CMD ["./server.py"] #ENTRYPOINT ["./server.py"] root@host02:/opt#
FROM – bizim image-imizin yığılması hansı image əsasında olacaq. Bu bizim öncədən hazırladığımız və ya Docker Hub-dan hazır götürdüyümüz image ola bilər.Əgər bu image bizim local serverdə varsa həmin image, əks halda Hub-dan endirilərək istifadə ediləcək. Biz alpine adlı image-dən istifadə edəcəyik. Alpine – Alpine linux esaslı minimal docker image olub, cəmi 5MB-dır. Ubuntu, debian,centos ve s. kimi əsas image-ləri istifadə edə bilərik. Lakin həcminin kifayət qədər az olması, eyni zamanda paket menegerinin mövcudluğu bu image -i seçməyimizə əsas verir.
MAINTAINER – müəllif haqqında məlumat. Ixtiyari təlimatdir (optional)
ADD – Host sistemdən faylları image-ə əlavə etməyə imkan verir. ADD <src>… <dest>– bu məntiqlə calısır. ADD eyni zamanda mənbə fayl kimi URL göstərməyə imkan verir.ADD mənbə fayl sıxılmıs, arxiv edilmiş fayl oldugu halda açılaraq əlavə olunmasına imkan verir. Məs: ADD web_page.tar.gz /usr/share/nginx/html
COPY – ADD ilə çox oxsardı, ona ADD-in müəyyən xüsusi imkanları olmayan yeni sadə versiyası kimi baxa bilərik. COPY mənbə fayl kimi URL, sıxılmış,arxiv edimiş faylları dəstəkləmir. Fayl və qovluqları host sistemdən image elavə etmək üçün istifadə edə bilərik. Xüsusi ehtiyac olmadiği halda daha yüngül olduğu üçün COPY istifadə edilməsi tövsiyyə olunur. Məs: COPY httpd.conf /etc/httpd/conf/
RUN – image-ı formalaşdırmaq üçün yazılmiş təlimatları icra edir. Image-ə yıgılma zamanı əlavə etmək istədiyimiz paketləri, Git endirmələri və s. RUN vasitəsi ilə edə bilirik. Hər bir təlimat image-ə yeni laylar elavə edir. Bu səbəbdən RUN təlimatlarının sayının mümkün qədər az olması, bir neçə təlimatı bir RUN altında birləşdirmək tövsiyyə olunur.
RUN apt-get update RUN apt-get install nginx php-fpm - əvəzinə, aşagidaki telimat daha effektiv sayilir ve biz daha az lay yaratmis oluruq RUN apt-get update \ && apt-get install nginx php-fpm
WORKDIR – cari direktoriyanı təyin olunmuşa dəyişir. RUN, CMD, ENTRYPOINTkimi təlimatlar bu direktoriyada işləməyə başlayır.
EXPOSE – container daxilindəki şəbəkə portlarını host server və ya digər containerlər tərəfindən görulməsini təmin etmək üçündür. Daha dəqiq bu digər containerlər (containers linking) üçün istifadə olunur. Host uzərində yönləndirməni etmək üçün container-ı yaradarkən -p 8080:80 yazmağımız host uzərinə 8080 porta gələn muraciətlərı yaratdığımız container-in 80-cı portuna yonləndirəcək.
CMD – RUN əmri kimi təyin edilmiş əmrlərı icra etmək üçündür. Lakin RUN -dan fərqli olaraq CMD əmrləri image yıgılma(build) vaxtı deyil, container yaradilarkən icra edir. Bizim misalda olduğu kimi hər container yaradılanda flask serveri ./server.py scripti vasitəsi ilə işə salır. Bir necə CMD sətri olduqda yalnız sonuncu CMD təlimatı işləyir, oncəkilər isə nəzərə alınmır. Biz CMD təlimatını yazmayaraq containeri işə salarkən argument kimi də container-ə ötürə bilərik.Container-ə argument kimi ötürdüyümüz əmrlər CMD sətrindən daha üstündür və onlar icra olunur. Ötürdüyümüz əmr bitən kimi container dayanır. Yəni CMD [“./server.py “] – olmasına baxmayaraq biz container -i işə salarkən ona ifconfig əmrini argument kimi ötürsək, server.py işə düsməyəcək, ifconfig icra olunacaq və container işini bitirəcək. Bu hissə müəyyən qədər qarışıq gələrsə sadəcə keçin, containerləri istifadə edərkən vəziyyət daha da aydınlaşacaq.
ENTRYPOINT – hər dəfə yeni container yaradıldıqda konkret işə salınacaq proqramı, scripti başlatmaq üçündür. Bizim misalda ENTRYPOINT istifadə edilməsi daha məqsədəuyğundur. Container -i işə salarkən terminalda ötürəcəyimiz əmrlər üstün sayılmır və ENTRYPOINT -ə argument kimi ötürülür.
ENV – mühit dəyişənlərini təyin etmək üçündür. məs: ENV WORKER 4
Dockerfile daxilində yaza biləcəyimiz təlimatlar bunlarla bitmir. VOLUME, USER və s. təlimatlar da mövcuddur. Gələn mövzularda bunlar haqqında bəhs edəcəyik. Indi isə hazırladığımız Dockerfile vasitəsi ilə Flask mühitimizi özündə saxlayan image -imizi yıgaq. Host serverin Dockerfile yerləsən /opt direktoriyası aşagıdakı kimidir. app01 özündə web faylları saxlayır. Bizim web proyekt app01 direktoriyasından ibarətdir.requirements.txt python-pip -ə məxsus paketləri qurmaq üçündür. Dockerfile -in nə işə yaradıgı artıq bizı məlumdur.
root@host02:/opt# tree . ├── app01 │ ├── server.py │ └── static │ └── index.html ├── Dockerfile └── requirements.txt 2 directories, 4 files root@host02:/opt#
docker images yazaraq hazırkı image -lərə baxaq.
root@host02:/opt# docker images REPOSITORY TAG IMAGE ID CREATED SIZE root@host02:/opt#
Hazırda bizim heç bir image -imiz yoxdur. Image -ı yığmağa(build) başlayaq. docker build -t testdevteam/flaskapp . -əmri vasitəsi ilə yıgımı edirik. -t -ile image müəllifini və repozitoriyani gosteririk. Sonuna : - əlavə edərək tag -da əlavə etmək mümkündür. En sonda Dockerfile -ın yerləşdiyi direktoriyanı gostəririk. Bizim halda bu cari direktoriyadır.
root@host02:/opt# docker build -t testdevteam/flaskapp . Sending build context to Docker daemon 6.144 kB Step 1 : FROM alpine:3.43.4: Pulling from library/alpine 3690ec4760f9: Pull complete Digest: sha256:1354db23ff5478120c980eca1611a51c9f2b88b61f24283ee8200bf9a54f2e5c Status: Downloaded newer image for alpine:3.4 ---&amp;gt; baa5d63471ea Step 2 : MAINTAINER NewEngineer ---&amp;gt; Running in ae3ef9416004 ---&amp;gt; 95c15adbeccd Removing intermediate container ae3ef9416004 Step 3 : ENV VESION 1.3 ---&amp;gt; Running in77367278c2ce ---&amp;gt; ccd340d376b3 Removing intermediate container 77367278c2ce Step 4 : WORKDIR /app ---&amp;gt; Running in2eb100888ca6 ---&amp;gt; a7cfe8b0f2f4 Removing intermediate container 2eb100888ca6 Step 5 : ADD requirements.txt requirements.txt ---&amp;gt; 781f432eabca Removing intermediate container 485da71ad347 Step 6 : COPY app01/ /app/ ---&amp;gt; c3910873f72e Removing intermediate container ceb043789b85 Step 7 : RUN apk --update add python py-setuptools py-pip &amp;amp;&amp;amp; pip install -r requirements.txt &amp;amp;&amp;amp; chmod +x server.py ---&amp;gt; Running in6703bd5a32f8 fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/community/x86_64/APKINDEX.tar.gz (1/12) Installing libbz2 (1.0.6-r5) (2/12) Installing expat (2.1.1-r1) ......... OK: 61 MiB in23 packages Collecting Flask==0.11.1 (from -r requirements.txt (line 1)) Downloading Flask-0.11.1-py2.py3-none-any.whl (80kB) Collecting Jinja2==2.8 (from -r requirements.txt (line 2)) Downloading Jinja2-2.8-py2.py3-none-any.whl (263kB) Collecting SQLAlchemy==1.1.2 (from -r requirements.txt (line 3)) ......... Successfully installed Flask-0.11.1 Jinja2-2.8 MarkupSafe-0.23 SQLAlchemy-1.1.2 Werkzeug-0.11.11 click-6.6 itsdangerous-0.24 ---&amp;gt; b08ebafa62ad Removing intermediate container 6703bd5a32f8 Step 8 : EXPOSE 5000/tcp ---&amp;gt; Running in6bfbfcb44365 ---&amp;gt; 4587b71548b7 Removing intermediate container 6bfbfcb44365 Step 9 : ENTRYPOINT ./server.py ---&amp;gt; Running in a0121e265741 ---&amp;gt; 6e603cf56f59 Removing intermediate container a0121e265741 Successfully built 6e603cf56f59
Yıgım(build) prosesi uğurla tamamlandı. docker images yazıb image siyahısına baxaq.
root@host02:/opt# docker images REPOSITORY TAG IMAGE ID CREATED SIZE testdevteam/flaskapp latest 6681c0b8a264 19 seconds ago 70.6 MB alpine 3.4 baa5d63471ea 3 days ago 4.803 MB root@host02:/opt#
Gördüyümüz kimi bizim iki ədəd, avtomatik endirilmiş 4.8 MB olan alpine image -i və onun üzərində təlimatlarımıza əsasən mühiti hazırladığımız flaskapp image -imiz var. docker history testdevteam/flaskapp - yazaraq image -imizin yığılma zamanı keçdiyi mərhələlərə baxa bilərik.
[host02 opt]#docker history testdevteam/flaskapp IMAGE CREATED CREATEDBY SIZE COMMENT 6681c0b8a264 3 hours ago /bin/sh -c #(nop) ENTRYPOINT ["./server.py"] 0 B602558c3511b 3 hours ago /bin/sh -c #(nop) EXPOSE5000/tcp 0 B9aa2eeee4f13 3 hours ago /bin/sh -c apk --update add python py-setupto 65.8MB 54e7c04140ea 3 hours ago /bin/sh -c #(nop) COPY dir:4ebaefaa61efe6a49e 470B 0add3ffd6c4a 3 hours ago /bin/sh -c #(nop) ADD file:14dcb2bbd562cd4022 44B 424600d4dae9 3 hours ago /bin/sh -c #(nop) WORKDIR /app 0B e503987523c3 3 hours ago /bin/sh -c #(nop) ENVVESION=1.3 0B 6fca0304951a 3 hours ago /bin/sh -c #(nop) MAINTAINERNewEngineer 0B baa5d63471ea 4 days ago /bin/sh -c #(nop) ADD file:7afbc23fda8b0b3872 4.803MB
Test üçün image -dən container işə salaq və yoxlayaq.
root@host02:/opt# docker run --name app01 -p 8081:5000 -d testdevteam/flaskapp 6c21f500e2da614c0082314c635f2e509c27987a39ccb019eb7c2dc7d7182742 root@host02:/opt#
docker run göstərilən image -ə əsasən yeni container(instanse və ya yüngül virtual server deyə bilərik) işə salır. --name - container -ə ad təyin edirik,əks halda özü random bir ad təyin edir. -p 8081:5000 - host serverin 8081 port -unu container -in 5000 portuna yönləndiririk. -d - container -in arxa fonda çalışmasını təmin edir, əks halda container bir başa terminalda çalışacaq.
root@host02:/opt# docker run --name app01 -p 8081:5000 testdevteam/flaskapp * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 192.168.200.230 - - [22/Oct/201620:44:09] "GET / HTTP/1.1"200 - 192.168.200.230 - - [22/Oct/201620:44:09] "GET /ipaddr HTTP/1.1"200 - 192.168.200.232 - - [22/Oct/201618:22:10] "GET / HTTP/1.1"200 - 192.168.200.232 - - [22/Oct/201618:22:12] "GET /ipaddr HTTP/1.1"200 -
Yuxarıda biz container -i üz fonda işə saldıq, və etdimiz muraciətləri görürük.
root@host02:~# curl localhost:8081 &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt; Docker Flask App &amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;This is test application &amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt; root@host02:~# curl localhost:8081/ipaddr { "ip": "172.17.0.1" # /ipaddr müraciət edən host -un ip ünvanını qaytarır }
-d - elavə etməklə container -i arxa fonda işlədə bilirik. Hazırda işləyən container -lərin siyahısına baxmaq ücün docker ps əmri istifadə edilir.
root@host02:/opt# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb54259e62e0 testdevteam/flaskapp "./server.py" 5 seconds ago Up 4 seconds 0.0.0.0:8081-&amp;gt;5000/tcp app01 root@host02:/opt#
Container id, image adı, yaranma vaxtı, dinlədiyi port, uptime və s. məlumatlar görünür. docker ps əmri yalniz islək vəziyyetdə olan container -ləri bizə göstərir. Container -lər sönmuş, xəta səbəbəindən dayanmiş və s. hallarda ola bilərlər. Bütün hallarda olan container-lərə baxmaq üçün isə docker ps -a əmrindən istifadə edirik.
root@host02:/opt# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb54259e62e0 testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8081-&amp;gt;5000/tcp app01 root@host02:/opt# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ce157225833d testdevteam/flaskapp "./server.py" 30 seconds ago Exited (137) 4 seconds ago app02 eb54259e62e0 testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8081-&amp;gt;5000/tcp app01 root@host02:/opt#
docker exec – işləyən container daxilində müəyyən əmrləri icra etmək üçündür. Məs: app01 adlı container -in daxilində çalişan prosesslərə baxmaq istəyirəm.
docker exec app01 top
Mem:958632K used, 3087756K free, 11208K shrd, 146156K buff, 544936K cached CPU: 0% usr 0% sys 0% nic 100% idle 0% io 0% irq 0% sirq Load average:0.000.000.002/23675 PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND 1 0 root S 81416 2% 0 0% {server.py} /usr/bin/python ./server.py 64 0 root S 1516 0% 3 0% top 70 0 root R 1516 0% 0 0% top root@host02:~# docker exec app01 ps -ef PID USER TIME COMMAND 1 root 0:00 {server.py} /usr/bin/python ./server.py 149 root 0:00 ps -ef root@host02:~#
ps -ef yalnız 2 prosesi bizə göstərir. server.py proses ID -sinin 1 olduğuna diqqət edək. Container üçün server.py sanki init və ya systemd -ni əvəzləyir. server.py dayandıgı halda container işini bitirir. docker exec -it app01 sh - əmrini yazaraq container daxilinə düşə bilərik. Mövcud olduğu halda sh əvəzinə bash yaza bilərik. -i parametri containeri interaktiv edir və standard inputu(STDIN), yəni containerin terminalını əldə edir. -t - container üçün psevdo terminal təyin edir və biz containerin terminalına daxil olmuş oluruq.
root@host02:/opt# docker exec -it app01 sh /app # ps -ef PID USER TIME COMMAND 1 root 0:00 {server.py} /usr/bin/python ./server.py 209 root 0:00 sh 215 root 0:00 ps -ef /app # netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 00.0.0.0:5000 0.0.0.0:* LISTEN 1/python /app # exit root@host02:/opt# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb54259e62e0 testdevteam/flaskapp "./server.py" 26 minutes ago Up 26 minutes 0.0.0.0:8081-&amp;gt;5000/tcp app01 root@host02:/opt#
Biz docker-i dayandira və yenidən başlada bilərik.Bunun üçün start/stop istifadə edirik.
root@host02:/opt# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES root@host02:/opt# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ce157225833d testdevteam/flaskapp "./server.py" 28 minutes ago Exited (137) 6 seconds ago app02 eb54259e62e0 testdevteam/flaskapp "./server.py" 30 minutes ago Exited (137) 54 seconds ago app01 root@host02:/opt# docker start app02 app02 root@host02:/opt# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ce157225833d testdevteam/flaskapp "./server.py" 28 minutes ago Up 2 seconds 0.0.0.0:8082-&amp;gt;5000/tcp app02 root@host02:/opt#
Biz yaratdığımız image üzərində hansısa dəyişikliklər etmək istəsək bunu Dockerfile -a əlavə edib, yeniden yıgım prosesini icra etməliyik. Bu halda bütün proses yox yalnız edilmis dəyisikliklər icra olunur. Bunu işləyən container uzərində commit etməklə də etmək mümkündür. Buna gələcək məqalələrimizdə baxacağıq. Test məqsədi ilə image -imizdən 10 ədəd container işə salaq.
[host02 opt]#docker ps # hazirda hec bir containerin islemedini goruruk. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [host02 opt]#for i in {81..90}; # for dovru ile 10 eded container ise saliriq. &amp;gt; do &amp;gt; docker run --name app$i -p 80$i:5000 -d testdevteam/flaskapp &amp;gt; done 1c4e21c32a57263171bea1d9f5951b433559a23b8a698f2a9dbc6526e02c450d 083f5c8627f1d073243066a9f354206da2a115ac6fd539e94125540c844408eb 9b94c201f30ee123fbda91fbce5d3365f7eabee95ee50918de08ffcf0564c21c 4d3c325105043f589dd85025368224500973508d191e2e27f0cdbee8e5c1c234 14ebeea6696a0e54db9242c02100be305463585b668e452d42381fcd162ed66f 34c6efd7118681515bae418cab4a9e1fbbff772eebeb083da4d2efdeee0a9376 c13be602bb64bf38607976e6fb305862a837266f9d0ef71c28d707d192498d78 ad64e71198612337d7394b8db0125959fae4b5bf3c65fa63bd1e18c2c6a2ab44 3994a0418e82d722749f2bcbcacf8904fbad344f04c2a359c3e016ae25ae4e64 d9e0159b721eb952b07a8eb3b360ed590945dc774f7f9953719d3d1a64c34f4d [host02 opt]#
Uyğun olaraq containerlərin adlarını və dinlədikləri portlara baxaq.
[host02 opt]#docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d9e0159b721e testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8090-&amp;gt;5000/tcp app90 3994a0418e82 testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8089-&amp;gt;5000/tcp app89 ad64e7119861 testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8088-&amp;gt;5000/tcp app88 c13be602bb64 testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8087-&amp;gt;5000/tcp app87 34c6efd71186 testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8086-&amp;gt;5000/tcp app86 14ebeea6696a testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8085-&amp;gt;5000/tcp app85 4d3c32510504 testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8084-&amp;gt;5000/tcp app84 9b94c201f30e testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8083-&amp;gt;5000/tcp app83 083f5c8627f1 testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8082-&amp;gt;5000/tcp app82 1c4e21c32a57 testdevteam/flaskapp "./server.py" 3 minutes ago Up 3 minutes 0.0.0.0:8081-&amp;gt;5000/tcp app81 [host02 opt]#netstat -ntlp |sort Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 00.0.0.0:22 0.0.0.0:* LISTEN 983/sshd tcp 0 0127.0.0.1:6010 0.0.0.0:* LISTEN 6141/0 tcp 0 0127.0.0.1:6011 0.0.0.0:* LISTEN 6238/2 tcp 0 0127.0.0.1:6012 0.0.0.0:* LISTEN 29738/1 tcp6 0 0::1:6010 :::* LISTEN 6141/0 tcp6 0 0::1:6011 :::* LISTEN 6238/2 tcp6 0 0::1:6012 :::* LISTEN 29738/1 tcp6 0 0:::22 :::* LISTEN 983/sshd tcp6 0 0:::8081 :::* LISTEN 2969/docker-proxy tcp6 0 0:::8082 :::* LISTEN 3082/docker-proxy tcp6 0 0:::8083 :::* LISTEN 3179/docker-proxy tcp6 0 0:::8084 :::* LISTEN 3280/docker-proxy tcp6 0 0:::8085 :::* LISTEN 3393/docker-proxy tcp6 0 0:::8086 :::* LISTEN 3496/docker-proxy tcp6 0 0:::8087 :::* LISTEN 3588/docker-proxy tcp6 0 0:::8088 :::* LISTEN 3708/docker-proxy tcp6 0 0:::8089 :::* LISTEN 3814/docker-proxy tcp6 0 0:::8090 :::* LISTEN 3892/docker-proxy [host02 opt]#
Host serverin 8081-8090 port araliğinda flask proqram teminatının işlədiyini yoxlayaq.
root@host02:~# for i in {81..90}; do curl localhost:80$i/ipaddr ; done { "ip": "172.17.0.1" } { "ip": "172.17.0.1" } { "ip": "172.17.0.1" } { "ip": "172.17.0.1" } { "ip": "172.17.0.1" } { "ip": "172.17.0.1" } { "ip": "172.17.0.1" } { "ip": "172.17.0.1" } { "ip": "172.17.0.1" } { "ip": "172.17.0.1" } root@host02:~#
Bununla məqaləni yekunlaşdiririq. Növbəti dəfə image-lər üzərində dəyişiklik, image -in Docker Huba -a yüklənməsi, digər host -lara köçürülməsi və container -lərlə daha irəli səviyyədə davranmalara baxacağıq. Ümüdvaram faydalı olacaq. Uğurlar...