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 پیل کړو
په ټولو سرورونو کې د ګلسټر ایف ایس ځای په ځای کولو لپاره (دوی ته نوډ 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
له بده مرغه، د کانټینرونو په لاره اچولو سربیره، د سیسټم لپاره تولید شوی واحد نور څه نه کوي (د بیلګې په توګه، د زاړه کانټینرونو پاکول کله چې دا ډول خدمت بیا پیل شي)، نو تاسو باید دا ډول شیان پخپله ولیکئ.
په اصولو کې ، پوډمین کافي دی چې هڅه وکړئ کوم کانټینرونه دي ، د ډاکر - کمپوز لپاره زاړه تشکیلات انتقال کړئ ، او بیا د کوبرنیټس په لور حرکت وکړئ ، که تاسو کلستر ته اړتیا لرئ ، یا د ډاکر لپاره د کارولو اسانه بدیل ترلاسه کړئ.
رټټ
پروژه
پلاش
نور
موندنو
د کوبرنیټس سره وضعیت خورا په زړه پوری دی: له یوې خوا ، د ډاکر سره تاسو کولی شئ یو کلستر جوړ کړئ (په سویم حالت کې) ، د کوم سره چې تاسو حتی د پیرودونکو لپاره د محصول چاپیریال چلولی شئ ، دا په ځانګړي توګه د کوچني ټیمونو لپاره ریښتیا ده (3-5 خلک) ، یا د کوچني ټول بار سره ، یا د کوبرنیټس تنظیم کولو پیچلتیاو د پوهیدو لپاره د لیوالتیا نشتوالی ، پشمول د لوړ بارونو لپاره.
پوډمین بشپړ مطابقت نه وړاندې کوي، مګر دا یوه مهمه ګټه لري - د Kubernetes سره مطابقت، په شمول د اضافي وسیلو (buildah او نور). له همدې امله ، زه به د کار لپاره د یوې وسیلې انتخاب ته په لاندې ډول اړیکه ونیسم: د وړو ټیمونو لپاره ، یا د محدود بودیجې سره - ډاکر (د احتمالي swarm حالت سره) ، د خپل ځان لپاره په شخصي محلي کوربه کې د پراختیا لپاره - پوډمین ملګري ، او د هرچا لپاره - Kubernetes.
زه ډاډه نه یم چې د ډاکر سره وضعیت به په راتلونکي کې بدلون ونلري، په هرصورت، دوی مخکښان دي، او په تدریجي ډول ګام په ګام معیاري کیږي، مګر پوډمین، د دې ټولو نیمګړتیاوو لپاره (یوازې په لینکس کې کار کوي، هیڅ کلستر کول، مجلس او نورې کړنې د دریمې ډلې حلونه دي) راتلونکی روښانه دی، نو زه ټولو ته بلنه ورکوم چې په نظرونو کې د دې موندنو په اړه بحث وکړي.
PS موږ د اګست په 3 پیل کوو "
د خوشې کیدو دمخه د پری آرډر قیمت: 5000 RUB. تاسو کولی شئ د ډاکر ویډیو کورس برنامه وګورئ
سرچینه: www.habr.com