Docker uye zvese, zvese, zvese

TL; DR: Chinyorwa chekutarisa - gwara rekuenzanisa nharaunda dzekumhanyisa maapplication mumidziyo. Mikana yeDocker nemamwe masisitimu akafanana anozotariswa.

Docker uye zvese, zvese, zvese

Kanhoroondo kadiki kuti zvakabva kupi

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ

Nzira yekutanga inozivikanwa yekuparadzanisa application ndeye chroot. Iyo sisitimu yekufona yezita rimwe chete inopa shanduko kumudzi wedhairekitori - nekudaro ichipa mukana kune chirongwa chakaidaidza, kuwana chete mafaera mukati meiyi dhairekitori. Asi kana chirongwa chikapihwa superuser kodzero mukati, chinogona "kupukunyuka" kubva kuchroot uye kuwana mukana weiyo huru yekushandisa system. Zvakare, kunze kwekuchinja dhairekitori remidzi, zvimwe zviwanikwa (RAM, processor), pamwe nekuwana kune network, hazvina kuganhurirwa.

Iyo inotevera nzira ndeyekuvhura yakazara-yakazara inoshanda sisitimu mukati memudziyo, uchishandisa maitiro eiyo inoshanda system kernel. Iyi nzira inodaidzwa zvakasiyana mune akasiyana masisitimu anoshanda, asi essence yakafanana - inomhanyisa akati wandei akazvimirira masisitimu anoshanda, imwe neimwe inomhanya pane imwecheteyo kernel inomhanya huru yekushandisa system. Izvi zvinosanganisira Majeri eFreeBSD, Solaris Zones, OpenVZ, uye LXC yeLinux. Kuzviparadzanisa kunopiwa kwete chete kune disk nzvimbo, asiwo kune zvimwe zviwanikwa, kunyanya, mudziyo wega wega unogona kuva nemiganhu pane processor nguva, RAM, network bandwidth. Kuenzaniswa nechroot, kusiya mudziyo kunonyanya kuoma, sezvo iyo superuser iri mumudziyo inokwanisa kupinda mukati memudziyo chete, zvisinei, nekuda kwekudiwa kwekuchengeta sisitimu yekushandisa mukati memudziyo kusvika parizvino uye kushandiswa kwekare kernel. shanduro (inoenderana neLinux, kusvika padiki FreeBSD), pane isiri-zero mukana we "kupaza" iyo kernel yekuzviparadzanisa system uye kuwana mukana weiyo huru inoshanda sisitimu.

Panzvimbo pekutangisa yakazara-yakazara sisitimu yekushandisa mumudziyo (ine yekutanga system, maneja wepakeji, nezvimwewo), zvikumbiro zvinogona kutangwa nekukasira, chinhu chikuru ndechekupa zvikumbiro nemukana uyu (kuvapo kwemaraibhurari anodiwa uye mamwe mafaira). Pfungwa iyi yakashanda sehwaro hwemidziyo yekushandisa virtualization, mumiriri ane mukurumbira uye anozivikanwa anove Docker. Kuenzaniswa neyakapfuura masisitimu, anochinjika ekuzviparadzanisa nevamwe masisitimu, pamwe neakavakirwa-mukati tsigiro kune chaiwo network pakati pemidziyo uye chimiro chekushandisa mukati memudziyo, zvakakonzera kugona kuvaka imwe nharaunda yakazara kubva kunhamba huru yemaseva emuviri kumhanya midziyo - pasina. kudiwa kwemanyorerwo ezvishandiso manejimendi.

Docker

Docker ndiyo inonyanya kuzivikanwa application containerization software. Yakanyorwa mumutauro weGo, inoshandisa zvinogoneka zveLinux kernel - mapoka, nzvimbo dzezita, kugona, nezvimwe, pamwe neAufs faira masisitimu uye mamwe akafanana kuchengetedza disk nzvimbo.

Docker uye zvese, zvese, zvese
Kunobva: wikimedia

akitekicha

Isati yasvika vhezheni 1.11, Docker akashanda sesevhisi imwechete yaiita zvese mashandiro nemidziyo: kurodha mifananidzo yemidziyo, kuvhura midziyo, kugadzirisa zvikumbiro zveAPI. Kubva vhezheni 1.11, Docker yakakamurwa kuita zvikamu zvakati kuti zvinodyidzana: zvakaiswa, kubata hupenyu hwese hwemidziyo (kugoverwa kwedhisiki nzvimbo, kurodha mifananidzo, networking, kutanga, kuisa uye kutarisa mamiriro emidziyo) uye runC. , mudziyo wekumhanyisa nguva, zvichibva pakushandiswa kwemapoka uye mamwe maficha eLinux kernel. Iyo docker sevhisi pachayo inoramba iripo, asi ikozvino inongoshanda kugadzirisa API zvikumbiro kutepfenyurwa kune zvakaiswa.

Docker uye zvese, zvese, zvese

Kuiswa uye kumisikidzwa

Nzira yangu yandinofarira yekuisa docker ndeye docker-muchina, iyo, pamusoro pekuisa zvakananga nekugadzirisa docker pamaseva ari kure (kusanganisira makore akasiyana), inobvumidza iwe kushanda nemafaira masisitimu emaseva ari kure, uye anogona zvakare kumhanya akasiyana mirairo.

Nekudaro, kubvira 2018, chirongwa ichi hachisati chave kugadzirwa, saka isu tichachiisa nenzira yakajairwa kune akawanda Linux kugovera - nekuwedzera repository uye nekuisa iyo inodiwa mapakeji.

Iyi nzira inoshandiswawo pakugadzika otomatiki, semuenzaniso, kushandisa Ansible kana mamwe masisitimu akafanana, asi ini handisi kuzozviona mune ino chinyorwa.

Kuiswa kuchaitwa paCentos 7, ini ndichashandisa muchina chaiwo sevhavha, kuisa, kungomhanyisa mirairo pazasi:

# 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

Mushure mekuisa, iwe unofanirwa kutanga sevhisi, isa mu autoload:

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

Pamusoro pezvo, iwe unogona kugadzira boka re docker, iro vashandisi vachakwanisa kushanda ne docker pasina sudo, kumisikidza matanda, gonesa kuwana iyo API kubva kunze, usakanganwa kurongedza firewall (zvese zvisingabvumirwe ndezve. zvinorambidzwa mumienzaniso iri pamusoro uye pazasi - ndakasiya izvi kuti zvive nyore uye kuona), asi ini handisi kuzopinda mune zvimwe zvakadzama pano.

Zvimwe zvinhu

Pamusoro pemuchina wedocker uri pamusoro, kune zvakare docker registry, chishandiso chekuchengeta mifananidzo yemidziyo, pamwe nedocker compose - chishandiso che automating kuendesa zvikumbiro mumidziyo, mafaera eYAML anoshandiswa kuvaka nekugadzirisa midziyo uye. zvimwe zvinhu zvine hukama (semuenzaniso, network, inoenderera faira masisitimu ekuchengetedza data).

Inogona zvakare kushandiswa kuronga mapaipi eCICD. Chimwe chinhu chinonakidza chiri kushanda mu cluster modhi, iyo inonzi swarm modhi (isati yasvika vhezheni 1.12 yaizivikanwa se docker swarm), iyo inokutendera iwe kuti uunganidze chivakwa chimwe chete kubva kune akati wandei maseva kumhanya midziyo. Iko kune kutsigirwa kweiyo chaiyo network pamusoro pese maseva, kune yakavakirwa-mukati mitoro balancer, pamwe nerutsigiro rwezvakavanzika zvemidziyo.

Iyo YAML mafaera kubva kudocker compose inogona kushandiswa kune akadaro masumbu ane madiki magadzirirwo, azere otomatiki kuchengetedza kwediki uye epakati masumbu ezvinangwa zvakasiyana. Kune masumbu makuru, Kubernetes inodiwa nekuti swarm mode yekugadzirisa mitengo inogona kupfuura iyo yeKubernetes. Mukuwedzera kune runC, senzvimbo yekuuraya yemidziyo, unogona kuisa, semuenzaniso Kata midziyo

Kushanda neDocker

Mushure mekuisa uye kugadzirisa, isu tichaedza kuvaka sumbu umo isu tichaisa GitLab uye Docker Registry yechikwata chekusimudzira. Semasevha, ini ndichashandisa matatu chaiwo machina, pandichawedzera kuendesa iyo GlusterFS yakagoverwa FS, ini ndichaishandisa se docker mavhoriyamu ekuchengetedza, semuenzaniso, kumhanyisa inotadza-yakachengeteka vhezheni yedocker registry. Zvinhu zvakakosha zvekumhanya: Docker Registry, Postgresql, Redis, GitLab nerutsigiro rweGitLab Runner pamusoro peSwarm. Postgresql ichatangwa nekubatanidza Stolon, saka haufanire kushandisa GlusterFS kuchengeta Postgresql data. Mamwe ese akakosha data achachengetwa paGlusterFS.

Kuti uendese GlusterFS pamaseva ese (anonzi node1, node2, node3), unofanirwa kuisa mapakeji, kugonesa firewall, kugadzira madhairekitori anodiwa:

# 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

Mushure mekuisa, shanda pakugadzirisa GlusterFS inofanira kuenderera mberi kubva kune imwe node, semuenzaniso node1:

# 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

Ipapo iwe unofanirwa kukwira vhoriyamu inobuda (iyo murairo unofanirwa kumhanyirwa pamaseva ese):

# mount /srv/docker

Swarm mode inogadziriswa pane imwe yemaseva, inova Mutungamiriri, vamwe vese vanozofanira kujoinha cluster, saka mhedzisiro yekumhanyisa rairo pane yekutanga server inoda kuteedzerwa uye kuurayiwa pane yasara.

Kwekutanga cluster setup, ndinomhanyisa rairo pane node1:

# 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

Kopa mhedzisiro yemurairo wechipiri, ita pane node2 uye node3:

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

Izvi zvinopedzisa kugadziridzwa kwekutanga kwemaseva, ngatitangei kugadzirisa masevhisi, mirairo ichaitwa ichatangwa kubva node1, kunze kwekunge yatsanangurwa neimwe nzira.

Chekutanga pane zvese, ngatigadzire manetwork emidziyo:

# 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

Ipapo tinomaka maseva, izvi zvinodikanwa kusunga mamwe masevhisi kumaseva:

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

Tevere, tinogadzira madhairekitori ekuchengetedza etcd data, iyo KV kuchengetedza inodiwa naTraefik naStolon. Zvakafanana nePostgresql, izvi zvichange zviri midziyo yakasungwa kumaseva, saka isu tinoisa uyu murairo pane ese maseva:

# mkdir -p /srv/etcd

Tevere, gadzira faira kugadzirisa etcd uye kuishandisa:

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

Mushure mechinguva, tinotarisa kuti etcd cluster yasimuka:

# 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

Gadzira madhairekitori ePostgresql, ita murairo pane ese maseva:

# mkdir -p /srv/pgsql

Tevere, gadzira faira kugadzirisa 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

Isu tinogadzira zvakavanzika, shandisa iyo faira:

# </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

Imwe nguva gare gare (tarisa kuburitsa kwemirairo docker service lskuti masevhisi ese asimuka) tanga iyo Postgresql cluster:

# 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

Kutarisa kugadzirira kwePostgresql cluster:

# 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

Isu tinogadzirisa traefik kuvhura mukana wemidziyo kubva kunze:

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

Isu tinotanga Redis Cluster, nekuda kweizvi tinogadzira dhairekitori rekuchengetedza pane ese node:

# 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

Wedzera Docker Registry:

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

Uye pakupedzisira - 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

Mamiriro ekupedzisira emasumbu nemasevhisi:

# 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

Chii chimwe chinogona kuvandudzwa? Iva nechokwadi chekugadzirisa Traefik kuti ishande nemidziyo ye https, wedzera tls encryption yePostgresql uye Redis. Asi kazhinji, unogona kutopa kune vanogadzira sePoC. Ngatitarisei dzimwe nzira dzeDocker.

podman

Imwe injini inozivikanwa kwazvo yekumhanyisa midziyo yakaunganidzwa nemapods (pods, mapoka emidziyo akaiswa pamwechete). Kusiyana neDocker, hazvidi chero sevhisi yekumhanyisa midziyo, basa rese rinoitwa kuburikidza ne libpod raibhurari. Zvakare yakanyorwa muGo, inoda OCI inoenderana nguva yekumhanyisa kumhanya midziyo senge runC.

Docker uye zvese, zvese, zvese

Kushanda naPodman kazhinji kwakafanana nekwaDocker, kusvika padanho raunokwanisa kuzviita seizvi (zvichidanwa nevazhinji vakazviedza, kusanganisira munyori wechinyorwa chino):

$ alias docker=podman

uye unogona kuramba uchishanda. Kazhinji, mamiriro ezvinhu nePodman anonakidza kwazvo, nekuti kana shanduro dzekutanga dzeKubernetes dzakashanda naDocker, saka kubva munenge muna 2015, mushure mekuenzanisa nyika yemidziyo (OCI - Open Container Initiative) uye kupatsanura Docker mumudziyo uye runC, imwe nzira. Docker iri kuvandudzwa kuti imhanye muKubernetes: CRI-O. Podman mune izvi ndeimwe nzira yeDocker, yakavakirwa pamisimboti yeKubernetes, kusanganisira kurongedza midziyo, asi chinangwa chikuru chepurojekiti ndechekumhanyisa midziyo yeDocker pasina mamwe masevhisi. Nezvikonzero zviri pachena, hapana swarm mode, sezvo vagadziri vanotaura zvakajeka kuti kana iwe uchida sumbu, tora Kubernetes.

Kuiswa

Kuisa paCentos 7, ingo shandisa iyo Extras repository, wobva waisa zvese nemurairo:

# yum -y install podman

Zvimwe zvinhu

Podman inogona kugadzira zvikamu zve systemd, nekudaro kugadzirisa dambudziko rekutanga midziyo mushure mekutanga server. Pamusoro pezvo, systemd inonzi inoshanda nemazvo se pid 1 mumudziyo. Kuvaka midziyo, kune yakaparadzana buildah chishandiso, kune zvakare yechitatu-bato maturusi - analogues e docker-compose, ayo anogadzirawo Kubernetes-inoenderana magadzirirwo mafaera, saka shanduko kubva kuPodman kuenda Kubernetes iri nyore sezvinobvira.

Kushanda naPodman

Sezvo pasina swarm mode (inofanirwa kuchinjika kuKubernetes kana sumbu richidikanwa), isu tichaiunganidza mumidziyo yakasiyana.

Isa podman-compose:

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

Iyo inokonzeresa config file yepodman yakasiyana zvishoma, semuenzaniso taifanira kufambisa chikamu chakasiyana chevhoriyamu zvakananga kuchikamu chebasa.

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

Mhedzisiro yebasa:

# 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

Ngationei kuti ichagadzira chii kune systemd uye kubernetes, pane izvi tinoda kutsvaga zita kana id yepodhi:

# 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: {}

systemd:

# 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

Nehurombo, kunze kwekuvhura midziyo, iyo inogadzirwa unit yesystemd haina chimwe chinhu (semuenzaniso, kuchenesa midziyo yekare kana sevhisi yakadai yatangwazve), saka uchafanirwa kuwedzera zvinhu zvakadaro iwe pachako.

Mumusimboti, Podman inokwana kuyedza kuti ndezvipi midziyo, kuendesa zvigadziriso zvekare zvedocker-compose, wobva waenda kuKubernetes, kana zvichidikanwa, pane sumbu, kana kuwana imwe nzira iri nyore kushandisa kuDocker.

rkt

Iyo purojekiti akaenda ku archive inenge mwedzi mitanhatu yapfuura nekuda kwekuti RedHat yakaitenga, saka ini handisi kuzogara pairi zvakadzama. Kazhinji, yakasiya fungidziro yakanaka kwazvo, asi ichienzaniswa neDocker, uye zvakanyanya kuPodman, inoita senge musanganiswa. Paivewo nekugovera kweCoreOS kwakavakirwa pamusoro perkt (kunyangwe ivo pakutanga vaive neDocker), asi izvo zvakazoperawo mushure mekutenga kweRedHat.

Flash

Zvimwe imwe chirongwa, munyori wacho aingoda kuvaka nekumhanyisa midziyo. Tichitarisa zvinyorwa uye kodhi, munyori haana kutevera zviyero, asi akangosarudza kunyora kushandiswa kwake, izvo, chaizvoizvo, zvaakaita.

zvakawanikwa

Mamiriro ezvinhu neKubernetes anonakidza kwazvo: kune rumwe rutivi, neDocker, unogona kuunganidza sumbu (mune swarm mode), iyo iwe yaunogona kumhanyisa nharaunda dzekugadzira kune vatengi, izvi ndezvechokwadi kuzvikwata zvidiki (3-5 vanhu. ), kana nediki duku mutoro , kana kushayikwa kwechido chekunzwisisa kuoma kwekugadzirisa Kubernetes, kusanganisira kune mitoro yakakwirira.

Podman haina kupa kuenderana kwakazara, asi ine imwe yakakosha mukana - kuenderana neKubernetes, kusanganisira mamwe maturusi (buildah nevamwe). Naizvozvo, ini ndichaswedera kusarudzo yechishandiso chebasa sezvinotevera: kuzvikwata zvidiki, kana nebhajeti shoma - Docker (ine inogoneka swarm modhi), yekuzvigadzirira ini pachedu yenzvimbo - Podman comrades, uye kune wese wese. - Kubernetes.

Handina chokwadi kuti mamiriro neDocker haazoshanduki mune ramangwana, shure kwezvose, ivo mapiyona, uye variwo zvishoma nezvishoma kuenzanisa nhanho nhanho, asi Podman, nezvikanganiso zvayo zvose (inoshanda chete paLinux, hapana kubatanidza. , gungano uye zvimwe zviito zvisarudzo zvevechitatu) ramangwana rakajeka, saka ndinokumbira munhu wose kuti akurukure izvi zvakawanikwa mumashoko.

PS Musi wa3 Nyamavhuvhu tinovhura "Docker vhidhiyo kosikwaunogona kudzidza zvakawanda nezvebasa rake. Isu tichaongorora maturusi ayo ese: kubva kune ekutanga abstractions kusvika kunetiweki paramita, nuances yekushanda neakasiyana masisitimu anoshanda uye mitauro yekuronga. Iwe unozojairana neiyo tekinoroji uye unonzwisisa kupi uye sei nani kushandisa Docker. Isu tichagoverawo zvakanakisa maitiro ekuita.

Pre-order mutengo usati wasunungurwa: 5000 rubles. Chirongwa "Docker Vhidhiyo Course" inogona kuwanikwa papeji yekosi.

Source: www.habr.com

Voeg