Docker image, konteynerlər və tətbiqi

Bu məqalə "Docker" silsiləsinə daxildir

infographic_5-01-v2

 

Ö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;amp;gt; baa5d63471ea
Step 2 : MAINTAINER NewEngineer
 ---&amp;amp;gt; Running in ae3ef9416004
 ---&amp;amp;gt; 95c15adbeccd
Removing intermediate container ae3ef9416004
Step 3 : ENV VESION 1.3
 ---&amp;amp;gt; Running in77367278c2ce
 ---&amp;amp;gt; ccd340d376b3
Removing intermediate container 77367278c2ce
Step 4 : WORKDIR /app
 ---&amp;amp;gt; Running in2eb100888ca6
 ---&amp;amp;gt; a7cfe8b0f2f4
Removing intermediate container 2eb100888ca6
Step 5 : ADD requirements.txt requirements.txt
 ---&amp;amp;gt; 781f432eabca
Removing intermediate container 485da71ad347
Step 6 : COPY app01/ /app/
 ---&amp;amp;gt; c3910873f72e
Removing intermediate container ceb043789b85
Step 7 : RUN apk --update add python py-setuptools py-pip     &amp;amp;amp;&amp;amp;amp; pip install -r requirements.txt     &amp;amp;amp;&amp;amp;amp; chmod +x server.py
 ---&amp;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;amp;gt; b08ebafa62ad
Removing intermediate container 6703bd5a32f8
Step 8 : EXPOSE 5000/tcp
 ---&amp;amp;gt; Running in6bfbfcb44365
 ---&amp;amp;gt; 4587b71548b7
Removing intermediate container 6bfbfcb44365
Step 9 : ENTRYPOINT ./server.py
 ---&amp;amp;gt; Running in a0121e265741
 ---&amp;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;amp;lt;html&amp;amp;gt;&amp;amp;lt;head&amp;amp;gt;&amp;amp;lt;title&amp;amp;gt; Docker Flask App &amp;amp;lt;/title&amp;amp;gt;&amp;amp;lt;/head&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;amp;lt;h1&amp;amp;gt;This is test application &amp;amp;lt;/h1&amp;amp;gt;&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;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;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;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;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;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;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;amp;gt; do
&amp;amp;gt; docker run --name app$i -p 80$i:5000 -d testdevteam/flaskapp
&amp;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;amp;gt;5000/tcp   app90
3994a0418e82        testdevteam/flaskapp   "./server.py"       3 minutes ago       Up 3 minutes        0.0.0.0:8089-&amp;amp;gt;5000/tcp   app89
ad64e7119861        testdevteam/flaskapp   "./server.py"       3 minutes ago       Up 3 minutes        0.0.0.0:8088-&amp;amp;gt;5000/tcp   app88
c13be602bb64        testdevteam/flaskapp   "./server.py"       3 minutes ago       Up 3 minutes        0.0.0.0:8087-&amp;amp;gt;5000/tcp   app87
34c6efd71186        testdevteam/flaskapp   "./server.py"       3 minutes ago       Up 3 minutes        0.0.0.0:8086-&amp;amp;gt;5000/tcp   app86
14ebeea6696a        testdevteam/flaskapp   "./server.py"       3 minutes ago       Up 3 minutes        0.0.0.0:8085-&amp;amp;gt;5000/tcp   app85
4d3c32510504        testdevteam/flaskapp   "./server.py"       3 minutes ago       Up 3 minutes        0.0.0.0:8084-&amp;amp;gt;5000/tcp   app84
9b94c201f30e        testdevteam/flaskapp   "./server.py"       3 minutes ago       Up 3 minutes        0.0.0.0:8083-&amp;amp;gt;5000/tcp   app83
083f5c8627f1        testdevteam/flaskapp   "./server.py"       3 minutes ago       Up 3 minutes        0.0.0.0:8082-&amp;amp;gt;5000/tcp   app82
1c4e21c32a57        testdevteam/flaskapp   "./server.py"       3 minutes ago       Up 3 minutes        0.0.0.0:8081-&amp;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...
Səs: +60. Bəyənilsin Zəifdir

Müəllif: Kamil Babayev

Şərh yazın