ډاکر او هرڅه، هرڅه، هرڅه

TL؛ DR: په کانټینرونو کې د غوښتنلیکونو چلولو لپاره چوکاټونو پرتله کولو لپاره د لید لارښود. د ډاکر او نورو ورته سیسټمونو وړتیاوې به په پام کې ونیول شي.

ډاکر او هرڅه، هرڅه، هرڅه

یو کوچنی تاریخ چې دا ټول له کوم ځای څخه راغلي

История

د غوښتنلیک جلا کولو لپاره لومړی مشهور میتود کروټ دی. د ورته نوم سیسټم زنګ یقیني کوي چې د روټ ډایرکټر بدل شوی - پدې توګه ډاډ ترلاسه کوي چې برنامه چې ورته ویل کیږي یوازې په دې لارښود کې فایلونو ته لاسرسی لري. مګر که چیرې یو پروګرام ته په داخلي توګه د روټ امتیازات ورکړل شي، دا کولی شي په بالقوه توګه د کروټ څخه "تېښته" وکړي او اصلي عملیاتي سیسټم ته لاسرسی ومومي. همدارنګه، د روټ ډایرکټر بدلولو سربیره، نورې سرچینې (RAM، پروسیسر)، او همدارنګه د شبکې لاسرسی محدود نه دي.

بله طریقه دا ده چې د عملیاتي سیسټم د کرنل میکانیزمونو په کارولو سره، په کانټینر کې دننه یو بشپړ عملیاتي سیسټم پیل کړئ. دا طریقه په مختلف عملیاتي سیسټمونو کې په مختلف ډول ویل کیږي، مګر جوهر یو شان دی - د څو خپلواک عملیاتي سیسټمونو پیل کول، چې هر یو یې ورته کرنل چلوي چې اصلي عملیاتي سیسټم پرمخ ځي. پدې کې د FreeBSD جیلونه، سولاریس زونونه، OpenVZ او LXC د لینکس لپاره شامل دي. انزوا نه یوازې د ډیسک ځای لخوا تضمین کیږي ، بلکه د نورو سرچینو لخوا هم تضمین کیږي؛ په ځانګړي توګه ، هر کانټینر ممکن د پروسیسر وخت ، رام ، او د شبکې بینډ ویت محدودیتونه ولري. د کروټ په پرتله ، د کانټینر پریښودل خورا ستونزمن دي ، ځکه چې په کانټینر کې سوپر یوزر یوازې د کانټینر مینځپانګې ته لاسرسی لري ، په هرصورت ، د کانټینر دننه عملیاتي سیسټم تازه ساتلو او د زړو نسخو کارولو اړتیا له امله. د کرنلونو (د لینکس لپاره اړونده، تر یوې اندازې پورې د FreeBSD)، د کرنل د جلا کولو سیسټم "ماتولو" او اصلي عملیاتي سیسټم ته د السرسۍ احتمال یو غیر صفر دی.

په کانټینر کې د بشپړ عملیاتي سیسټم په لاره اچولو پرځای (د پیل کولو سیسټم سره ، د بسته بندۍ مدیر ، او داسې نور) ، تاسو کولی شئ سمدلاسه غوښتنلیکونه پیل کړئ ، اصلي شی دا دی چې غوښتنلیکونه ورته فرصت چمتو کړئ (د اړین کتابتونونو شتون) او نورې فایلونه). دې مفکورې د کانټینر شوي غوښتنلیک مجازی کولو اساس په توګه کار کاوه ، چې ترټولو مشهور او پیژندل شوی استازی یې ډاکر دی. د پخوانیو سیسټمونو په پرتله، د انعطاف وړ جلا کولو میکانیزمونه، د کانټینرونو ترمنځ د مجازی شبکو لپاره د جوړ شوي ملاتړ سره یوځای شوي او په کانټینر کې د غوښتنلیک حالت تعقیب، د کانټینرونو چلولو لپاره د ډیری فزیکي سرورونو څخه د یو واحد همغږي چاپیریال رامینځته کولو توان لري - پرته د لاسي سرچینو مدیریت ته اړتیا.

ډاکر

ډاکر ترټولو مشهور غوښتنلیک کانټینر کولو سافټویر دی. په Go ژبه کې لیکل شوی، دا د لینکس کرنل معیاري ځانګړتیاوې کاروي - cgroups، نوم ځایونه، وړتیاوې، او نور، او همدارنګه د Aufs فایل سیسټمونه او داسې نور د ډیسک ځای خوندي کولو لپاره.

ډاکر او هرڅه، هرڅه، هرڅه
سرچینه: ویکیمیډیا

معمارۍ

د 1.11 نسخه دمخه، ډاکر د یو واحد خدمت په توګه کار کاوه چې ټول عملیات یې د کانټینرونو سره ترسره کړل: د کانټینرونو لپاره د عکسونو ډاونلوډ کول، د کانټینرونو پیل کول، د API غوښتنې پروسس کول. د 1.11 نسخه سره پیل کول، ډاکر په څو برخو ویشل شوی و چې یو له بل سره اړیکه لري: کانټینرډ، د کانټینرونو ټول ژوند دوره پروسس کولو لپاره (د ډیسک ځای تخصیص، د انځورونو ډاونلوډ، د شبکې سره کار کول، د کانټینرونو حالت پیل کول، نصب کول او څارنه) او runC، د کانټینر اجرا کولو چاپیریال، د cgroups او د لینکس کرنل نورو ځانګړتیاو پراساس. د ډاکر خدمت پخپله پاتې دی ، مګر اوس دا یوازې د کانټینرډ ته ژباړل شوي API غوښتنې پروسس کولو لپاره کار کوي.

ډاکر او هرڅه، هرڅه، هرڅه

نصب او ترتیب

د ډاکر نصبولو لپاره زما غوره لاره د ډاکر ماشین دی ، کوم چې په ریموټ سرورونو کې د ډاکر مستقیم نصب او تنظیم کولو سربیره (د مختلف بادلونو په شمول) ، دا امکان ورکوي چې د ریموټ سرورونو فایل سیسټمونو سره کار وکړي او مختلف کمانډونه هم پرمخ وړي.

په هرصورت، د 2018 راهیسې، پروژه په سختۍ سره وده شوې، نو موږ به دا د ډیری لینکس توزیعونو لپاره په معیاري ډول نصب کړو - د ذخیره کولو اضافه کول او اړین کڅوړې نصب کول.

دا طریقه د اتوماتیک نصبولو لپاره هم کارول کیږي، د بیلګې په توګه د ځواب یا نورو ورته سیسټمونو کارول، مګر زه به پدې مقاله کې په پام کې ونیسم.

نصب به په Centos 7 کې ترسره شي، زه به د سرور په توګه یو مجازی ماشین وکاروم، د نصبولو لپاره یوازې لاندې کمانډونه پرمخ وړم:

# yum install -y yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce docker-ce-cli containerd.io

د نصبولو وروسته، تاسو اړتیا لرئ چې خدمت پیل کړئ او په پیل کې یې واچوئ:

# systemctl enable docker
# systemctl start docker
# firewall-cmd --zone=public --add-port=2377/tcp --permanent

سربیره پردې ، تاسو کولی شئ د ډاکر ګروپ رامینځته کړئ ، چې کارونکي به وکولی شي د سوډو پرته د ډاکر سره کار وکړي ، لاګنګ تنظیم کړي ، له بهر څخه API ته لاسرسی وړ کړي ، او د فایر وال ډیر دقیق تنظیم کول مه هیروئ (هر هغه څه چې اجازه نلري. په پورته او لاندې مثالونو کې منع دی - ما دا د سادگي او وضاحت لپاره پریښوده) مګر زه به دلته نور تفصیل ته لاړ نه شم.

نور ځانګړتیاوې

د پورته ذکر شوي ډاکر ماشین سربیره ، د ډاکر راجسټري هم شتون لري ، د کانټینرونو لپاره د عکسونو ذخیره کولو وسیله ، په بیله بیا د ډاکر کمپوز ، په کانټینرونو کې د غوښتنلیکونو ځای په ځای کولو اتومات کولو وسیله ، د YAML فایلونه د کانټینرونو جوړولو او تنظیم کولو لپاره کارول کیږي. او نور اړوند شیان (د بیلګې په توګه، شبکې، د معلوماتو ذخیره کولو لپاره دوامداره فایل سیسټم).

دا د CICD لپاره د لیږدونکو تنظیمولو لپاره هم کارول کیدی شي. بله په زړه پوري ب featureه په کلسټر حالت کې کار کوي ، تش په نوم سویرم حالت (د 1.12 نسخه دمخه دا د ډاکر سوارم په نوم پیژندل شوی و) ، کوم چې تاسو ته اجازه درکوي د کانټینرونو چلولو لپاره د څو سرورونو څخه یو واحد زیربنا راټول کړئ. د ټولو سرورونو په سر کې د مجازی شبکې لپاره ملاتړ شتون لري ، یو جوړ شوی بار بیلنسر شتون لري ، په بیله بیا د کانټینرونو لپاره د رازونو ملاتړ.

د ډاکر کمپوز څخه د YAML فایلونه ، د کوچني بدلونونو سره ، د داسې کلسترونو لپاره کارول کیدی شي ، په بشپړ ډول د مختلف اهدافو لپاره د کوچني او متوسط ​​​​کلسترونو ساتنه اتومات کوي. د لویو کلسترونو لپاره، Kubernetes غوره دی ځکه چې د swarm mode د ساتنې لګښتونه د Kubernetes څخه ډیر کیدی شي. د runC سربیره، تاسو کولی شئ نصب کړئ، د بیلګې په توګه، د کانټینر اجرا کولو چاپیریال په توګه د کاتا کانتینرونه

د ډاکر سره کار کول

د نصب او ترتیب کولو وروسته، موږ به هڅه وکړو چې یو کلستر راټول کړو په کوم کې چې موږ به د پرمختیا ټیم لپاره GitLab او Docker راجستري ځای پرځای کړو. زه به درې مجازی ماشینونه د سرورونو په توګه وکاروم ، په کوم کې چې زه به اضافي توزیع شوي FS ګلسټر ایف ایس ځای په ځای کړم؛ زه به دا د ډاکر حجم ذخیره کولو په توګه وکاروم ، د مثال په توګه ، د ډاکر راجسټری د غلط زغم نسخه چلولو لپاره. د چلولو لپاره کلیدي برخې: د ډاکر راجسټری ، پوسټګریسکیل ، ریډیس ، ګیټ لیب د سویرم په سر کې د ګیټ لیب رنر لپاره ملاتړ سره. موږ به د کلستر کولو سره Postgresql پیل کړو سټولون، نو تاسو اړتیا نلرئ د Postgresql ډیټا ذخیره کولو لپاره GlusterFS وکاروئ. پاتې مهم معلومات به په GlusterFS کې زیرمه شي.

په ټولو سرورونو کې د ګلسټر ایف ایس ځای په ځای کولو لپاره (دوی ته نوډ 1 ، نوډ 2 ، نوډ 3 ویل کیږي) ، تاسو اړتیا لرئ کڅوړې نصب کړئ ، د فایر وال فعال کړئ ، او اړین لارښودونه رامینځته کړئ:

# yum -y install centos-release-gluster7
# yum -y install glusterfs-server
# systemctl enable glusterd
# systemctl start glusterd
# firewall-cmd --add-service=glusterfs --permanent
# firewall-cmd --reload
# mkdir -p /srv/gluster
# mkdir -p /srv/docker
# echo "$(hostname):/docker /srv/docker glusterfs defaults,_netdev 0 0" >> /etc/fstab

د نصبولو وروسته، د GlusterFS تنظیم کولو کار باید د یو نوډ څخه دوام ومومي، د بیلګې په توګه نوډ 1:

# gluster peer probe node2
# gluster peer probe node3
# gluster volume create docker replica 3 node1:/srv/gluster node2:/srv/gluster node3:/srv/gluster force
# gluster volume start docker

بیا تاسو اړتیا لرئ د پایلې حجم نصب کړئ (کمانډ باید په ټولو سرورونو کې اجرا شي):

# mount /srv/docker

د سوارم حالت په یو سرور کې تنظیم شوی ، کوم چې به یې مشر وي ، پاتې نور باید په کلستر کې شامل شي ، نو په لومړي سرور کې د قوماندې اجرا کولو پایله به په نورو کې کاپي او اجرا کولو ته اړتیا ولري.

د ابتدايي کلستر ترتیب، زه په نوډ 1 کې کمانډ چلوم:

# docker swarm init
Swarm initialized: current node (a5jpfrh5uvo7svzz1ajduokyq) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0c5mf7mvzc7o7vjk0wngno2dy70xs95tovfxbv4tqt9280toku-863hyosdlzvd76trfptd4xnzd xx.xx.xx.xx:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# docker swarm join-token manager

موږ د دوهم کمانډ پایله کاپي کوو او په نوډ 2 او نوډ 3 کې یې اجرا کوو:

# docker swarm join --token SWMTKN-x-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxx xx.xx.xx.xx:2377
This node joined a swarm as a manager.

پدې مرحله کې ، د سرورونو لومړني ترتیب بشپړ شوی ، راځئ چې د خدماتو تنظیم کولو ته لاړ شو؛ د اجرا کولو امرونه به د نوډ 1 څخه پیل شي ، پرته لدې چې بل ډول مشخص شي.

لومړی، راځئ چې د کانټینرونو لپاره شبکې جوړې کړو:

# docker network create --driver=overlay etcd
# docker network create --driver=overlay pgsql
# docker network create --driver=overlay redis
# docker network create --driver=overlay traefik
# docker network create --driver=overlay gitlab

بیا موږ سرورونه په نښه کوو، دا اړینه ده چې ځینې خدمتونه سرورونو ته وتړل شي:

# docker node update --label-add nodename=node1 node1
# docker node update --label-add nodename=node2 node2
# docker node update --label-add nodename=node3 node3

بیا، موږ د etcd ډیټا، KV ذخیره کولو لپاره لارښودونه جوړوو، کوم چې د ټرافیک او سټولون لپاره اړین دي. د Postgresql سره ورته، دا به د سرورونو سره تړل شوي کانټینرونه وي، نو موږ دا قوماندې په ټولو سرورونو کې چلوو:

# mkdir -p /srv/etcd

بیا، د etcd تنظیم کولو لپاره یو فایل جوړ کړئ او دا یې وکاروئ:

00etcd.yml

version: '3.7'

services:
  etcd1:
    image: quay.io/coreos/etcd:latest
    hostname: etcd1
    command:
      - etcd
      - --name=etcd1
      - --data-dir=/data.etcd
      - --advertise-client-urls=http://etcd1:2379
      - --listen-client-urls=http://0.0.0.0:2379
      - --initial-advertise-peer-urls=http://etcd1:2380
      - --listen-peer-urls=http://0.0.0.0:2380
      - --initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - --initial-cluster-state=new
      - --initial-cluster-token=etcd-cluster
    networks:
      - etcd
    volumes:
      - etcd1vol:/data.etcd
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node1]
  etcd2:
    image: quay.io/coreos/etcd:latest
    hostname: etcd2
    command:
      - etcd
      - --name=etcd2
      - --data-dir=/data.etcd
      - --advertise-client-urls=http://etcd2:2379
      - --listen-client-urls=http://0.0.0.0:2379
      - --initial-advertise-peer-urls=http://etcd2:2380
      - --listen-peer-urls=http://0.0.0.0:2380
      - --initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - --initial-cluster-state=new
      - --initial-cluster-token=etcd-cluster
    networks:
      - etcd
    volumes:
      - etcd2vol:/data.etcd
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node2]
  etcd3:
    image: quay.io/coreos/etcd:latest
    hostname: etcd3
    command:
      - etcd
      - --name=etcd3
      - --data-dir=/data.etcd
      - --advertise-client-urls=http://etcd3:2379
      - --listen-client-urls=http://0.0.0.0:2379
      - --initial-advertise-peer-urls=http://etcd3:2380
      - --listen-peer-urls=http://0.0.0.0:2380
      - --initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - --initial-cluster-state=new
      - --initial-cluster-token=etcd-cluster
    networks:
      - etcd
    volumes:
      - etcd3vol:/data.etcd
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node3]

volumes:
  etcd1vol:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/etcd"
  etcd2vol:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/etcd"
  etcd3vol:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/etcd"

networks:
  etcd:
    external: true

# docker stack deploy --compose-file 00etcd.yml etcd

یو څه وروسته، موږ ګورو چې د etcd کلستر پورته دی:

# docker exec $(docker ps | awk '/etcd/ {print $1}')  etcdctl member list
ade526d28b1f92f7: name=etcd1 peerURLs=http://etcd1:2380 clientURLs=http://etcd1:2379 isLeader=false
bd388e7810915853: name=etcd3 peerURLs=http://etcd3:2380 clientURLs=http://etcd3:2379 isLeader=false
d282ac2ce600c1ce: name=etcd2 peerURLs=http://etcd2:2380 clientURLs=http://etcd2:2379 isLeader=true
# docker exec $(docker ps | awk '/etcd/ {print $1}')  etcdctl cluster-health
member ade526d28b1f92f7 is healthy: got healthy result from http://etcd1:2379
member bd388e7810915853 is healthy: got healthy result from http://etcd3:2379
member d282ac2ce600c1ce is healthy: got healthy result from http://etcd2:2379
cluster is healthy

موږ د Postgresql لپاره لارښودونه جوړوو، په ټولو سرورونو کې کمانډ اجرا کوو:

# mkdir -p /srv/pgsql

بیا، د Postgresql تنظیم کولو لپاره یو فایل جوړ کړئ:

01pgsql.yml

version: '3.7'

services:
  pgsentinel:
    image: sorintlab/stolon:master-pg10
    command:
      - gosu
      - stolon
      - stolon-sentinel
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
      - --log-level=debug
    networks:
      - etcd
      - pgsql
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 30s
        order: stop-first
        failure_action: pause
  pgkeeper1:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper1
    command:
      - gosu
      - stolon
      - stolon-keeper
      - --pg-listen-address=pgkeeper1
      - --pg-repl-username=replica
      - --uid=pgkeeper1
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper1:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node1]
  pgkeeper2:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper2
    command:
      - gosu
      - stolon 
      - stolon-keeper
      - --pg-listen-address=pgkeeper2
      - --pg-repl-username=replica
      - --uid=pgkeeper2
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper2:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node2]
  pgkeeper3:
    image: sorintlab/stolon:master-pg10
    hostname: pgkeeper3
    command:
      - gosu
      - stolon 
      - stolon-keeper
      - --pg-listen-address=pgkeeper3
      - --pg-repl-username=replica
      - --uid=pgkeeper3
      - --pg-su-username=postgres
      - --pg-su-passwordfile=/run/secrets/pgsql
      - --pg-repl-passwordfile=/run/secrets/pgsql_repl
      - --data-dir=/var/lib/postgresql/data
      - --cluster-name=stolon-cluster
      - --store-backend=etcdv3
      - --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    environment:
      - PGDATA=/var/lib/postgresql/data
    volumes:
      - pgkeeper3:/var/lib/postgresql/data
    secrets:
      - pgsql
      - pgsql_repl
    deploy:
      replicas: 1
      placement:
        constraints: [node.labels.nodename == node3]
  postgresql:
    image: sorintlab/stolon:master-pg10
    command: gosu stolon stolon-proxy --listen-address 0.0.0.0 --cluster-name stolon-cluster --store-backend=etcdv3 --store-endpoints http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
    networks:
      - etcd
      - pgsql
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 30s
        order: stop-first
        failure_action: rollback

volumes:
  pgkeeper1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"
  pgkeeper2:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"
  pgkeeper3:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/pgsql"

secrets:
  pgsql:
    file: "/srv/docker/postgres"
  pgsql_repl:
    file: "/srv/docker/replica"

networks:
  etcd:
    external: true
  pgsql:
    external: true

موږ رازونه پیدا کوو او فایل کاروو:

# </dev/urandom tr -dc 234567890qwertyuopasdfghjkzxcvbnmQWERTYUPASDFGHKLZXCVBNM | head -c $(((RANDOM%3)+15)) > /srv/docker/replica
# </dev/urandom tr -dc 234567890qwertyuopasdfghjkzxcvbnmQWERTYUPASDFGHKLZXCVBNM | head -c $(((RANDOM%3)+15)) > /srv/docker/postgres
# docker stack deploy --compose-file 01pgsql.yml pgsql

یو څه وروسته (د کمانډ محصول وګورئ د ډاکر خدمت lsدا چې ټول خدمات پورته دي) موږ د Postgresql کلستر پیل کوو:

# docker exec $(docker ps | awk '/pgkeeper/ {print $1}') stolonctl --cluster-name=stolon-cluster --store-backend=etcdv3 --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 init

د Postgresql کلستر چمتووالی معاینه کول:

# docker exec $(docker ps | awk '/pgkeeper/ {print $1}') stolonctl --cluster-name=stolon-cluster --store-backend=etcdv3 --store-endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 status
=== Active sentinels ===

ID      LEADER
26baa11d    false
74e98768    false
a8cb002b    true

=== Active proxies ===

ID
4d233826
9f562f3b
b0c79ff1

=== Keepers ===

UID     HEALTHY PG LISTENADDRESS    PG HEALTHY  PG WANTEDGENERATION PG CURRENTGENERATION
pgkeeper1   true    pgkeeper1:5432         true     2           2
pgkeeper2   true    pgkeeper2:5432          true            2                   2
pgkeeper3   true    pgkeeper3:5432          true            3                   3

=== Cluster Info ===

Master Keeper: pgkeeper3

===== Keepers/DB tree =====

pgkeeper3 (master)
├─pgkeeper2
└─pgkeeper1

موږ د بهر څخه کانټینرونو ته د لاسرسي خلاصولو لپاره ټریفیک تنظیم کوو:

03traefik.yml

version: '3.7'

services:
  traefik:
    image: traefik:latest
    command: >
      --log.level=INFO
      --providers.docker=true
      --entryPoints.web.address=:80
      --providers.providersThrottleDuration=2
      --providers.docker.watch=true
      --providers.docker.swarmMode=true
      --providers.docker.swarmModeRefreshSeconds=15s
      --providers.docker.exposedbydefault=false
      --accessLog.bufferingSize=0
      --api=true
      --api.dashboard=true
      --api.insecure=true
    networks:
      - traefik
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      replicas: 3
      placement:
        constraints:
          - node.role == manager
        preferences:
          - spread: node.id
      labels:
        - traefik.enable=true
        - traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
        - traefik.http.services.traefik.loadbalancer.server.port=8080
        - traefik.docker.network=traefik

networks:
  traefik:
    external: true

# docker stack deploy --compose-file 03traefik.yml traefik

موږ د ریډیس کلستر پیل کوو، د دې کولو لپاره موږ په ټولو نوډونو کې د ذخیره کولو لارښود جوړوو:

# mkdir -p /srv/redis

05redis.yml

version: '3.7'

services:
  redis-master:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '6379:6379'
    environment:
      - REDIS_REPLICATION_MODE=master
      - REDIS_PASSWORD=xxxxxxxxxxx
    deploy:
      mode: global
      restart_policy:
        condition: any
    volumes:
      - 'redis:/opt/bitnami/redis/etc/'

  redis-replica:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '6379'
    depends_on:
      - redis-master
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - REDIS_MASTER_PASSWORD=xxxxxxxxxxx
      - REDIS_PASSWORD=xxxxxxxxxxx
    deploy:
      mode: replicated
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: any

  redis-sentinel:
    image: 'bitnami/redis:latest'
    networks:
      - redis
    ports:
      - '16379'
    depends_on:
      - redis-master
      - redis-replica
    entrypoint: |
      bash -c 'bash -s <<EOF
      "/bin/bash" -c "cat <<EOF > /opt/bitnami/redis/etc/sentinel.conf
      port 16379
      dir /tmp
      sentinel monitor master-node redis-master 6379 2
      sentinel down-after-milliseconds master-node 5000
      sentinel parallel-syncs master-node 1
      sentinel failover-timeout master-node 5000
      sentinel auth-pass master-node xxxxxxxxxxx
      sentinel announce-ip redis-sentinel
      sentinel announce-port 16379
      EOF"
      "/bin/bash" -c "redis-sentinel /opt/bitnami/redis/etc/sentinel.conf"
      EOF'
    deploy:
      mode: global
      restart_policy:
        condition: any

volumes:
  redis:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: "/srv/redis"

networks:
  redis:
    external: true

# docker stack deploy --compose-file 05redis.yml redis

د ډاکر راجسټری اضافه کړئ:

06registry.yml

version: '3.7'

services:
  registry:
    image: registry:2.6
    networks:
      - traefik
    volumes:
      - registry_data:/var/lib/registry
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
      restart_policy:
        condition: on-failure
      labels:
        - traefik.enable=true
        - traefik.http.routers.registry.rule=Host(`registry.example.com`)
        - traefik.http.services.registry.loadbalancer.server.port=5000
        - traefik.docker.network=traefik

volumes:
  registry_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/registry"

networks:
  traefik:
    external: true

# mkdir /srv/docker/registry
# docker stack deploy --compose-file 06registry.yml registry

او په نهایت کې - GitLab:

08gitlab-runner.yml

version: '3.7'

services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    networks:
      - pgsql
      - redis
      - traefik
      - gitlab
    ports:
      - 22222:22
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        postgresql['enable'] = false
        redis['enable'] = false
        gitlab_rails['registry_enabled'] = false
        gitlab_rails['db_username'] = "gitlab"
        gitlab_rails['db_password'] = "XXXXXXXXXXX"
        gitlab_rails['db_host'] = "postgresql"
        gitlab_rails['db_port'] = "5432"
        gitlab_rails['db_database'] = "gitlab"
        gitlab_rails['db_adapter'] = 'postgresql'
        gitlab_rails['db_encoding'] = 'utf8'
        gitlab_rails['redis_host'] = 'redis-master'
        gitlab_rails['redis_port'] = '6379'
        gitlab_rails['redis_password'] = 'xxxxxxxxxxx'
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp.yandex.ru"
        gitlab_rails['smtp_port'] = 465
        gitlab_rails['smtp_user_name'] = "[email protected]"
        gitlab_rails['smtp_password'] = "xxxxxxxxx"
        gitlab_rails['smtp_domain'] = "example.com"
        gitlab_rails['gitlab_email_from'] = '[email protected]'
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_tls'] = true
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
        external_url 'http://gitlab.example.com/'
        gitlab_rails['gitlab_shell_ssh_port'] = 22222
    volumes:
      - gitlab_conf:/etc/gitlab
      - gitlab_logs:/var/log/gitlab
      - gitlab_data:/var/opt/gitlab
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
        - node.role == manager
      labels:
        - traefik.enable=true
        - traefik.http.routers.gitlab.rule=Host(`gitlab.example.com`)
        - traefik.http.services.gitlab.loadbalancer.server.port=80
        - traefik.docker.network=traefik
  gitlab-runner:
    image: gitlab/gitlab-runner:latest
    networks:
      - gitlab
    volumes:
      - gitlab_runner_conf:/etc/gitlab
      - /var/run/docker.sock:/var/run/docker.sock
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
        - node.role == manager

volumes:
  gitlab_conf:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/conf"
  gitlab_logs:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/logs"
  gitlab_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/data"
  gitlab_runner_conf:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: "/srv/docker/gitlab/runner"

networks:
  pgsql:
    external: true
  redis:
    external: true
  traefik:
    external: true
  gitlab:
    external: true

# mkdir -p /srv/docker/gitlab/conf
# mkdir -p /srv/docker/gitlab/logs
# mkdir -p /srv/docker/gitlab/data
# mkdir -p /srv/docker/gitlab/runner
# docker stack deploy --compose-file 08gitlab-runner.yml gitlab

د کلستر او خدماتو وروستی حالت:

# docker service ls
ID                  NAME                   MODE                REPLICAS            IMAGE                          PORTS
lef9n3m92buq        etcd_etcd1             replicated          1/1                 quay.io/coreos/etcd:latest
ij6uyyo792x5        etcd_etcd2             replicated          1/1                 quay.io/coreos/etcd:latest
fqttqpjgp6pp        etcd_etcd3             replicated          1/1                 quay.io/coreos/etcd:latest
hq5iyga28w33        gitlab_gitlab          replicated          1/1                 gitlab/gitlab-ce:latest        *:22222->22/tcp
dt7s6vs0q4qc        gitlab_gitlab-runner   replicated          1/1                 gitlab/gitlab-runner:latest
k7uoezno0h9n        pgsql_pgkeeper1        replicated          1/1                 sorintlab/stolon:master-pg10
cnrwul4r4nse        pgsql_pgkeeper2        replicated          1/1                 sorintlab/stolon:master-pg10
frflfnpty7tr        pgsql_pgkeeper3        replicated          1/1                 sorintlab/stolon:master-pg10
x7pqqchi52kq        pgsql_pgsentinel       replicated          3/3                 sorintlab/stolon:master-pg10
mwu2wl8fti4r        pgsql_postgresql       replicated          3/3                 sorintlab/stolon:master-pg10
9hkbe2vksbzb        redis_redis-master     global              3/3                 bitnami/redis:latest           *:6379->6379/tcp
l88zn8cla7dc        redis_redis-replica    replicated          3/3                 bitnami/redis:latest           *:30003->6379/tcp
1utp309xfmsy        redis_redis-sentinel   global              3/3                 bitnami/redis:latest           *:30002->16379/tcp
oteb824ylhyp        registry_registry      replicated          1/1                 registry:2.6
qovrah8nzzu8        traefik_traefik        replicated          3/3                 traefik:latest                 *:80->80/tcp, *:443->443/tcp

نور څه ښه کیدی شي؟ ډاډ ترلاسه کړئ چې ټرافیک په https کې د کانټینرونو چلولو لپاره تنظیم کړئ، د Postgresql او Redis لپاره tls انکرپشن اضافه کړئ. مګر په عموم کې ، دا دمخه پراختیا کونکو ته د PoC په توګه ورکول کیدی شي. راځئ چې اوس د ډاکر بدیلونه وګورو.

پوډمین

د پوډونو په واسطه ګروپ شوي کانټینرونو چلولو لپاره یو بل ښه پیژندل شوی انجن (پوډ، د کانټینرونو ګروپونه یوځای ځای پرځای شوي). د ډاکر برخلاف ، دا د کانټینرونو چلولو لپاره هیڅ خدمت ته اړتیا نلري؛ ټول کار د لیب پوډ کتابتون له لارې ترسره کیږي. په Go کې هم لیکل شوي، د کانټینرونو چلولو لپاره د OCI-compatible رن ټایم ته اړتیا لري، لکه runC.

ډاکر او هرڅه، هرڅه، هرڅه

د پوډمین سره کار کول عموما د ډاکر لپاره د دې یادونه کوي، دې ټکي ته چې تاسو کولی شئ دا د دې په څیر ترسره کړئ (لکه څنګه چې د ډیری لخوا ویل شوي چې دا یې هڅه کړې، د دې مقالې لیکوال په ګډون):

$ alias docker=podman

او تاسو کولی شئ کار ته دوام ورکړئ. په عموم کې ، د پوډمین وضعیت خورا په زړه پوری دی ، ځکه چې که د کوبرنیټس لومړنۍ نسخې د ډاکر سره کار وکړي ، نو د 2015 په شاوخوا کې ، د کانټینرونو نړۍ معیاري کولو وروسته (OCI - خلاص کانټینر نوښت) او د ډاکر ویش په کانټینر او رن سی کې ، په کبرنیټس کې د چلولو لپاره د ډاکر بدیل رامینځته شوی: CRI-O. په دې برخه کې پوډمین د Docker بدیل دی، د Kubernetes په اصولو جوړ شوی، په شمول د کانټینرونو ګروپ کول، مګر د پروژې اصلي موخه د اضافي خدماتو پرته د ډاکر سټایل کانټینرونه پیل کول دي. د څرګند دلیلونو لپاره ، د سویډم حالت شتون نلري ، ځکه چې پراختیا کونکي په روښانه ډول وايي چې که تاسو کلستر ته اړتیا لرئ ، کوبرنیټس واخلئ.

د جوړولو

په Centos 7 کې د نصبولو لپاره، یوازې د Extras ذخیره فعال کړئ، او بیا د کمانډ سره هرڅه نصب کړئ:

# yum -y install podman

نور ځانګړتیاوې

پوډمین کولی شي د سیسټم لپاره واحدونه رامینځته کړي ، پدې توګه د سرور ریبوټ وروسته د کانټینرونو پیل کولو ستونزه حل کوي. برسیره پردې، سیسټم اعلان شوی چې په کانټینر کې د pid 1 په توګه سم کار وکړي. د کانټینرونو جوړولو لپاره د بلډه جلا وسیله شتون لري ، د دریمې ډلې وسیلې هم شتون لري - د ډاکر - کمپوز انالوګونه ، کوم چې د کوبرنیټس سره مطابقت لرونکي تشکیلاتي فایلونه هم رامینځته کوي ، نو له پوډمین څخه کوبرنیټس ته لیږد د امکان تر حده ساده شوی.

د پوډمین سره کار کول

څرنګه چې د swarm حالت شتون نلري (موږ باید Kubernetes ته لاړ شو که کلستر ته اړتیا وي)، موږ به یې په جلا کانټینرونو کې راټول کړو.

پوډمن کمپوز نصب کړئ:

# yum -y install python3-pip
# pip3 install podman-compose

د پوډمین لپاره د پایلې ترتیب کولو فایل یو څه توپیر لري؛ د مثال په توګه، موږ باید د جلا حجم برخې مستقیم د خدماتو برخې ته حرکت وکړو.

gitlab-podman.yml

version: '3.7'

services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    hostname: gitlab.example.com
    restart: unless-stopped
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        gitlab_rails['gitlab_shell_ssh_port'] = 22222
    ports:
      - "80:80"
      - "22222:22"
    volumes:
      - /srv/podman/gitlab/conf:/etc/gitlab
      - /srv/podman/gitlab/data:/var/opt/gitlab
      - /srv/podman/gitlab/logs:/var/log/gitlab
    networks:
      - gitlab

  gitlab-runner:
    image: gitlab/gitlab-runner:alpine
    restart: unless-stopped
    depends_on:
      - gitlab
    volumes:
      - /srv/podman/gitlab/runner:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - gitlab

networks:
  gitlab:

# podman-compose -f gitlab-runner.yml -d up

پایله:

# podman ps
CONTAINER ID  IMAGE                                  COMMAND               CREATED             STATUS                 PORTS                                      NAMES
da53da946c01  docker.io/gitlab/gitlab-runner:alpine  run --user=gitlab...  About a minute ago  Up About a minute ago  0.0.0.0:22222->22/tcp, 0.0.0.0:80->80/tcp  root_gitlab-runner_1
781c0103c94a  docker.io/gitlab/gitlab-ce:latest      /assets/wrapper       About a minute ago  Up About a minute ago  0.0.0.0:22222->22/tcp, 0.0.0.0:80->80/tcp  root_gitlab_1

راځئ وګورو چې دا د سیسټمډ او کبرنیټس لپاره څه رامینځته کوي ، د دې لپاره موږ اړتیا لرو د پوډ نوم یا شناخت ومومئ:

# podman pod ls
POD ID         NAME   STATUS    CREATED          # OF CONTAINERS   INFRA ID
71fc2b2a5c63   root   Running   11 minutes ago   3                 db40ab8bf84b

Kubernetes:

# podman generate kube 71fc2b2a5c63
# Generation of Kubernetes YAML is still under development!
#
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-1.6.4
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-07-29T19:22:40Z"
  labels:
    app: root
  name: root
spec:
  containers:
  - command:
    - /assets/wrapper
    env:
    - name: PATH
      value: /opt/gitlab/embedded/bin:/opt/gitlab/bin:/assets:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
      value: gitlab.example.com
    - name: container
      value: podman
    - name: GITLAB_OMNIBUS_CONFIG
      value: |
        gitlab_rails['gitlab_shell_ssh_port'] = 22222
    - name: LANG
      value: C.UTF-8
    image: docker.io/gitlab/gitlab-ce:latest
    name: rootgitlab1
    ports:
    - containerPort: 22
      hostPort: 22222
      protocol: TCP
    - containerPort: 80
      hostPort: 80
      protocol: TCP
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    volumeMounts:
    - mountPath: /var/opt/gitlab
      name: srv-podman-gitlab-data
    - mountPath: /var/log/gitlab
      name: srv-podman-gitlab-logs
    - mountPath: /etc/gitlab
      name: srv-podman-gitlab-conf
    workingDir: /
  - command:
    - run
    - --user=gitlab-runner
    - --working-directory=/home/gitlab-runner
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
    - name: container
      value: podman
    image: docker.io/gitlab/gitlab-runner:alpine
    name: rootgitlab-runner1
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    volumeMounts:
    - mountPath: /etc/gitlab-runner
      name: srv-podman-gitlab-runner
    - mountPath: /var/run/docker.sock
      name: var-run-docker.sock
    workingDir: /
  volumes:
  - hostPath:
      path: /srv/podman/gitlab/runner
      type: Directory
    name: srv-podman-gitlab-runner
  - hostPath:
      path: /var/run/docker.sock
      type: File
    name: var-run-docker.sock
  - hostPath:
      path: /srv/podman/gitlab/data
      type: Directory
    name: srv-podman-gitlab-data
  - hostPath:
      path: /srv/podman/gitlab/logs
      type: Directory
    name: srv-podman-gitlab-logs
  - hostPath:
      path: /srv/podman/gitlab/conf
      type: Directory
    name: srv-podman-gitlab-conf
status: {}

سیستم:

# podman generate systemd 71fc2b2a5c63
# pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
Documentation=man:podman-generate-systemd(1)
Requires=container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
Before=container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa
ExecStop=/usr/bin/podman stop -t 10 db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/db40ab8bf84bf35141159c26cb6e256b889c7a98c0418eee3c4aa683c14fccaa/userdata/conmon.pid

[Install]
WantedBy=multi-user.target
# container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman container-da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864.service
Documentation=man:podman-generate-systemd(1)
RefuseManualStart=yes
RefuseManualStop=yes
BindsTo=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
After=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864
ExecStop=/usr/bin/podman stop -t 10 da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/da53da946c01449f500aa5296d9ea6376f751948b17ca164df438b7df6607864/userdata/conmon.pid

[Install]
WantedBy=multi-user.target
# container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service
# autogenerated by Podman 1.6.4
# Thu Jul 29 15:23:28 EDT 2020

[Unit]
Description=Podman container-781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3.service
Documentation=man:podman-generate-systemd(1)
RefuseManualStart=yes
RefuseManualStop=yes
BindsTo=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service
After=pod-71fc2b2a5c6346f0c1c86a2dc45dbe78fa192ea02aac001eb8347ccb8c043c26.service

[Service]
Restart=on-failure
ExecStart=/usr/bin/podman start 781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3
ExecStop=/usr/bin/podman stop -t 10 781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3
KillMode=none
Type=forking
PIDFile=/var/run/containers/storage/overlay-containers/781c0103c94aaa113c17c58d05ddabf8df4bf39707b664abcf17ed2ceff467d3/userdata/conmon.pid

[Install]
WantedBy=multi-user.target

له بده مرغه، د کانټینرونو په لاره اچولو سربیره، د سیسټم لپاره تولید شوی واحد نور څه نه کوي (د بیلګې په توګه، د زاړه کانټینرونو پاکول کله چې دا ډول خدمت بیا پیل شي)، نو تاسو باید دا ډول شیان پخپله ولیکئ.

په اصولو کې ، پوډمین کافي دی چې هڅه وکړئ کوم کانټینرونه دي ، د ډاکر - کمپوز لپاره زاړه تشکیلات انتقال کړئ ، او بیا د کوبرنیټس په لور حرکت وکړئ ، که تاسو کلستر ته اړتیا لرئ ، یا د ډاکر لپاره د کارولو اسانه بدیل ترلاسه کړئ.

رټټ

پروژه آرشیف ته لاړ شاوخوا شپږ میاشتې دمخه د دې حقیقت له امله چې RedHat دا پیرودلی ، نو زه به په دې اړه نور تفصیل ونه ګورم. په ټوله کې ، دا خورا ښه تاثیر پریښود ، مګر د ډاکر او په ځانګړي توګه پوډمین په پرتله ، دا د ترکیب په څیر ښکاري. د rkt په سر کې د CoreOS توزیع هم شتون درلود (که څه هم دوی په اصل کې ډاکر درلود) ، مګر دا هم د RedHat پیرود وروسته په ملاتړ کې پای ته ورسید.

پلاش

نور یوه پروژه، د کوم لیکوال چې یوازې غوښتل کانټینرونه جوړ او چل کړي. د اسنادو او کوډ په واسطه قضاوت کول، لیکوال معیارونه نه تعقیبوي، مګر په ساده ډول یې پریکړه وکړه چې خپل پلي کول ولیکئ، کوم چې په اصولو کې یې ترسره کړ.

موندنو

د کوبرنیټس سره وضعیت خورا په زړه پوری دی: له یوې خوا ، د ډاکر سره تاسو کولی شئ یو کلستر جوړ کړئ (په سویم حالت کې) ، د کوم سره چې تاسو حتی د پیرودونکو لپاره د محصول چاپیریال چلولی شئ ، دا په ځانګړي توګه د کوچني ټیمونو لپاره ریښتیا ده (3-5 خلک) ، یا د کوچني ټول بار سره ، یا د کوبرنیټس تنظیم کولو پیچلتیاو د پوهیدو لپاره د لیوالتیا نشتوالی ، پشمول د لوړ بارونو لپاره.

پوډمین بشپړ مطابقت نه وړاندې کوي، مګر دا یوه مهمه ګټه لري - د Kubernetes سره مطابقت، په شمول د اضافي وسیلو (buildah او نور). له همدې امله ، زه به د کار لپاره د یوې وسیلې انتخاب ته په لاندې ډول اړیکه ونیسم: د وړو ټیمونو لپاره ، یا د محدود بودیجې سره - ډاکر (د احتمالي swarm حالت سره) ، د خپل ځان لپاره په شخصي محلي کوربه کې د پراختیا لپاره - پوډمین ملګري ، او د هرچا لپاره - Kubernetes.

زه ډاډه نه یم چې د ډاکر سره وضعیت به په راتلونکي کې بدلون ونلري، په هرصورت، دوی مخکښان دي، او په تدریجي ډول ګام په ګام معیاري کیږي، مګر پوډمین، د دې ټولو نیمګړتیاوو لپاره (یوازې په لینکس کې کار کوي، هیڅ کلستر کول، مجلس او نورې کړنې د دریمې ډلې حلونه دي) راتلونکی روښانه دی، نو زه ټولو ته بلنه ورکوم چې په نظرونو کې د دې موندنو په اړه بحث وکړي.

PS موږ د اګست په 3 پیل کوو "د ډاکر ویډیو کورس"، چیرته چې تاسو کولی شئ د هغه د کار په اړه نور معلومات زده کړئ. موږ به د دې ټول وسیلې تحلیل کړو: له لومړني خلاصون څخه د شبکې پیرامیټونو پورې ، د مختلف عملیاتي سیسټمونو او برنامه کولو ژبو سره د کار کولو باریکي. تاسو به د ټیکنالوژۍ سره آشنا شئ او پوه شئ چې چیرې او څنګه د ډاکر کارول غوره دي. موږ به د غوره تمرین قضیې هم شریک کړو.

د خوشې کیدو دمخه د پری آرډر قیمت: 5000 RUB. تاسو کولی شئ د ډاکر ویډیو کورس برنامه وګورئ د کورس په پاڼه کې.

سرچینه: www.habr.com

Add a comment