TL;DR: แแแแแฎแแแแแก แกแแฎแแแแซแฆแแแแแแ แแแแขแแแแแ แแแจแ แแแแแแแชแแแแแก แแแจแแแแแก แฉแแ แฉแแแแแก แจแแแแ แแแแก แจแแกแแฎแแ. แแแแฎแแแฃแแ แแฅแแแแ Docker-แแก แแ แกแฎแแ แแกแแแแกแ แกแแกแขแแแแแแก แจแแกแแซแแแแแแแแแ.
แแแขแแ แ แแกแขแแ แแ แแแแก แจแแกแแฎแแ, แแฃ แกแแแแแ แแแแแแ แแก แงแแแแแคแแ แ
Story
แแแ แแแแ แชแแแแแแ แแแแแแ แแแแแแแชแแแก แแแแแแ แแแแกแแแแก แแ แแก chroot. แแแแแ แกแแฎแแแฌแแแแแแก แกแแกแขแแแฃแ แ แแแ แ แฃแแ แฃแแแแแงแแคแก root แแแ แแฅแขแแ แแแก แจแแชแแแแก - แ แแแแช แฃแแ แฃแแแแแงแแคแก, แ แแ แแ แแแ แแแแก, แ แแแแแแแช แแแก แแแฃแ แแแ, แแฅแแก แฌแแแแแ แแฎแแแแ แแ แแแ แแฅแขแแ แแแจแ แแ แกแแแฃแ แคแแแแแแแ. แแแแ แแ แแฃ แแ แแแ แแแแก แจแแแ แแ แแแแแแแแแแ แแแแแแญแแแ, แแแก แจแแฃแซแแแ โแแแแฅแชแแกโ chroot-แก แแ แแแแแแแแก แฌแแแแแ แแแแแแ แแแแ แแชแแฃแ แกแแกแขแแแแแ. แแกแแแ, แแแ แแ root แแแ แแฅแขแแ แแแก แจแแชแแแแกแ, แกแฎแแ แ แแกแฃแ แกแแแ (RAM, แแ แแชแแกแแ แ), แแกแแแ แ แแแแ แช แฅแกแแแแก แฌแแแแแ แจแแแฆแฃแแฃแแ แแ แแ แแก.
แจแแแแแแ แแแแแแ แแ แแก แกแ แฃแแคแแกแแแแแ แแแแ แแชแแฃแแ แกแแกแขแแแแก แแแจแแแแ แแแแขแแแแแ แจแ, แแแแ แแชแแฃแแ แกแแกแขแแแแก แแแ แแแแก แแแฅแแแแแแแแแก แแแแแงแแแแแแ. แแ แแแแแแก แกแฎแแแแแกแฎแแ แแแแ แแชแแฃแ แกแแกแขแแแแจแ แกแฎแแแแแแ แแ แฃแฌแแแแแแ, แแแแ แแ แแ แกแ แแแแแแ - แ แแแแแแแแ แแแแแฃแแแแแแแแ แแแแ แแชแแฃแแ แกแแกแขแแแแก แแแจแแแแ, แ แแแแแแแแแ แแแแแแฃแแ แแฃแจแแแแก แแแแแ แแแ แแแแ, แ แแแแแแแช แแฃแจแแแแก แแแแแแ แ แแแแ แแชแแฃแแ แกแแกแขแแแ. แแแ แจแแ แแกแแ FreeBSD Jails, Solaris Zones, OpenVZ แแ LXC for Linux. แแแแแแชแแ แฃแแ แฃแแแแแงแแคแแแแ แแ แ แแฎแแแแ แแแกแแแก แกแแแ แชแแ, แแ แแแแ แกแฎแแ แ แแกแฃแ แกแแแแแแช; แแแ แซแแ, แแแแแแฃแ แแแแขแแแแแ แก แจแแแซแแแแ แฐแฅแแแแแก แจแแแฆแฃแแแแแ แแ แแชแแกแแ แแก แแ แแก, แแแแ แแขแแฃแแ แแแฎแกแแแ แแแแกแ แแ แฅแกแแแแก แแแแขแแ แฃแแแ แแแแแแแแ. chroot-แแแ แจแแแแ แแแแ, แแแแขแแแแแ แแก แแแขแแแแแ แฃแคแ แ แ แแฃแแแ, แ แแแแแ แแแแขแแแแแ แจแ แแงแแค แกแฃแแแ แแแแฎแแแ แแแแแก แแฅแแก แฌแแแแแ แแฎแแแแ แแแแขแแแแแ แแก แจแแแแแแกแแ, แแฃแแชแ, แแแแขแแแแแ แแก แจแแแแแ แแแแ แแชแแฃแแ แกแแกแขแแแแก แแแแแฎแแแแแก แแฃแชแแแแแแแแแกแ แแ แซแแแแ แแแ แกแแแแแก แแแแแงแแแแแแก แแแแ. แแแ แแแแแแก (แจแแกแแแแแแกแแ Linux-แแกแแแแก, แแแแแแแแ FreeBSD-แกแแแแก), แแ แกแแแแแก แแแ แแแแก แแแแแแชแแแก แกแแกแขแแแแก โแแแ แฆแแแแแกโ แแ แแแแแแ แแแแ แแชแแฃแ แกแแกแขแแแแแ แฌแแแแแแก แแแแแแแแ.
แกแ แฃแแคแแกแแแแแ แแแแ แแชแแฃแแ แกแแกแขแแแแก แแแแขแแแแแ แจแ แแแจแแแแแก แแแชแแแแ (แแแแชแแแแแแแชแแแก แกแแกแขแแแแ, แแแแแขแแก แแแแแฏแแ แแ แแ แ. แแ แกแฎแแ แคแแแแแแ). แแก แแแแ แกแแคแฃแซแแแแ แแแแแ แแแแขแแแแแ แแแแแฃแแ แแแแแแแชแแแแแก แแแ แขแฃแแแแแแชแแแก, แ แแแแแก แงแแแแแแ แชแแแแแแ แแ แชแแแแแแ แฌแแ แแแแแแแแแแแแ Docker. แฌแแแ แกแแกแขแแแแแแแ แจแแแแ แแแแ, แฃแคแ แ แแแฅแแแแ แแแแแแชแแแก แแแฅแแแแแแแแ, แแแแขแแแแแ แแแก แจแแ แแก แแแ แขแฃแแแฃแ แ แฅแกแแแแแแก แฉแแจแแแแแฃแแ แแฎแแ แแแญแแ แ แแ แแแแแชแฎแแแแก แแแแแแแ แแแแแก แแแแแงแฃแ แแก แแแแแแแ แแแแขแแแแแ แจแ, แแแแแแแ แแแ แแแแขแแแแแ แแแแก แแแจแแแแแกแแแแก แแแแ แ แแแแแแแแแ แคแแแแแฃแ แ แกแแ แแแ แแแแแแ แแ แแ แแแแแแแแแแ แฃแแ แแแ แแแแก แแแแแแก แจแแกแแซแแแแแแแ - แ แแกแฃแ แกแแแแก แฎแแแแ แแแ แแแแก แกแแญแแ แแแแแก แแแ แแจแ.
docker
Docker แแ แแก แงแแแแแแ แชแแแแแแ แแแแแแแชแแแก แแแแขแแแแแ แแแแชแแแก แแ แแแ แแแ. Go แแแแแ แแแฌแแ แแแ, แแก แแงแแแแแก Linux-แแก แแแ แแแแก แกแขแแแแแ แขแฃแ แแแฎแแกแแแแแแแแแก - cgroups, แกแแฎแแแแ แกแแแ แชแแแแก, แจแแกแแซแแแแแแแแแก แแ แ.แจ., แแกแแแ Aufs แคแแแแฃแ แกแแกแขแแแแแก แแ แกแฎแแ แแกแแแแกแแแก แแแกแแแ แกแแแ แชแแก แแแแแแแแก แแแแแแ.
แฌแงแแ แ: แแแแแแแแแ
แแ แฅแแขแแฅแขแฃแ แ
1.11 แแแ แกแแแแแ Docker แแฃแจแแแแแ แ แแแแ แช แแ แแแแแ แกแแ แแแกแ, แ แแแแแแช แแฎแแ แชแแแแแแแ แงแแแแ แแแแ แแชแแแก แแแแขแแแแแ แแแแ: แแแแขแแแแแ แแแแกแแแแก แกแฃแ แแแแแแก แฉแแแแขแแแ แแแ, แแแแขแแแแแ แแแแก แแแจแแแแ, API แแแแฎแแแแแแแก แแแแฃแจแแแแแ. 1.11 แแแ แกแแแ แแแฌแงแแแฃแแ Docker แแแแงแ แ แแแแแแแแ แแแฌแแแแ, แ แแแแแแแช แฃแ แแแแ แแฅแแแแแแแ แแ แแแแแแแแแ: แแแแขแแแแแ แ, แแแแขแแแแแ แแแแก แแแแแ แกแแกแแชแแชแฎแแ แชแแแแแก แแแกแแแฃแจแแแแแแแ (แแแกแแแ แกแแแ แชแแก แแแแแงแแคแ, แกแฃแ แแแแแแก แฉแแแแขแแแ แแแ, แฅแกแแแแแ แแฃแจแแแแ, แแแจแแแแ, แแแกแขแแแแชแแ แแ แแแแขแแแแแ แแแแก แแแแแแแ แแแแแก แแแแแขแแ แแแแ) แแ runC, แแแแขแแแแแ แแก แจแแกแ แฃแแแแแก แแแ แแแ, แ แแแแแแช แแแคแฃแซแแแแฃแแแ cgroup-แแแแก แแแแแงแแแแแแแ แแ Linux-แแก แแแ แแแแก แกแฎแแ แคแฃแแฅแชแแแแแ. แแแแแ แแแแแ แแก แกแแ แแแกแ แ แฉแแแ, แแแแ แแ แแฎแแ แแก แแฎแแแแ แแแแขแแแแแ แจแ แแแแแแแ แแแแแแ API แแแแฎแแแแแแแก แแแแฃแจแแแแแแก แแแกแแฎแฃแ แแแ.
แแแกแขแแแแชแแ แแ แแแแคแแแฃแ แแชแแ
แแแแแ แแก แแแกแขแแแแชแแแก แฉแแแ แกแแงแแแ แแแ แแแแ แแแแแ -แแแแฅแแแ, แ แแแแแแช แแแกแขแแแชแแฃแ แกแแ แแแ แแแแ (แกแฎแแแแแกแฎแแ แฆแ แฃแแแแแแก แฉแแแแแแ) แแแแแ แแก แฃแจแฃแแแ แแแกแขแแแแชแแแกแ แแ แแแแคแแแฃแ แแชแแแก แแแ แแ, แจแแกแแซแแแแแแก แฎแแแก แแแกแขแแแชแแฃแ แ แกแแ แแแ แแแแก แคแแแแฃแ แกแแกแขแแแแแแแ แแฃแจแแแแแก แแ แแกแแแ แจแแฃแซแแแ แกแฎแแแแแกแฎแแ แแ แซแแแแแแแแก แแแจแแแแ.
แแฃแแชแ, 2018 แฌแแแแแ แแ แแแฅแขแ แแแแฅแแแก แแ แแแแแแแแ แแแฃแแ, แแแแขแแ แฉแแแ แแแแแแแกแขแแแแ แแแ แแแก แกแขแแแแแ แขแฃแแ แแแแ Linux-แแก แแแกแขแ แแแฃแชแแแแแก แฃแแแขแแกแแแแกแแแแก - แแแแแแแขแแแ แกแแชแแแก แแ แแแแแแแกแขแแแแ แแแ แกแแญแแ แ แแแแแขแแแก.
แแก แแแแแแ แแกแแแ แแแแแแงแแแแแ แแแขแแแแขแฃแ แ แแแกแขแแแแชแแแกแแแแก, แแแแแแแแแ Ansible แแ แกแฎแแ แแกแแแแกแ แกแแกแขแแแแแแก แแแแแงแแแแแแ, แแแแ แแ แแ แแ แแแแแแฎแแแแ แแแก แแ แกแขแแขแแแจแ.
แแแกแขแแแแชแแ แแแแฎแแ แชแแแแแแแ 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
แแแ แแ แแแแกแ, แจแแแแซแแแแ แจแแฅแแแแ แแแแแ แฏแแฃแคแ, แ แแแแแก แแแแฎแแแ แแแแแแก แจแแแซแแแแแ แแแฃแจแแแ แแแแแ แแแ sudo-แก แแแ แแจแ, แแแแงแแแแ แแฃแ แแแแ, แฉแแ แแแ แฌแแแแแ API-แแ แแแ แแแแ แแ แแ แแแแแแแฌแงแแแ firewall-แแก แฃแคแ แ แแฃแกแขแแ แแแแคแแแฃแ แแชแแ (แงแแแแแคแแ แ, แ แแช แแแฃแจแแแแแแแ แแแ แซแแแฃแแแ แแแแแ แแ แฅแแแแแ แแแชแแแฃแ แแแแแแแแแแจแ - แแ แแก แแแแแแขแแแ แกแแแแ แขแแแแกแ แแ แกแแชแฎแแแแกแแแแก), แแแแ แแ แแฅ แฃแคแ แ แแแขแแแฃแ แแ แแ แจแแแแ.
แกแฎแแ แแแฎแแกแแแแแแแแแ
แแแแแแฆแแแจแแฃแแ แแแแแ แแก แแแแ แแขแแก แแแ แแ, แแกแแแ แแ แกแแแแแก แแแแแ แแก แ แแแกแขแ แ, แฎแแแกแแฌแงแ แแแแขแแแแแ แแแแกแแแแก แกแฃแ แแแแแแก แจแแกแแแแฎแแ, แแกแแแ แแแแแ แแแแแแกแ, แแแกแขแ แฃแแแแขแ แแแแขแแแแแ แแแจแ แแแแแแแชแแแแแก แแแแแแแแแแก แแแขแแแแขแแแแชแแแกแแแแก, YAML แคแแแแแแ แแแแแแงแแแแแ แแแแขแแแแแ แแแแก แจแแกแแฅแแแแแแ แแ แแแแคแแแฃแ แแชแแแกแแแแก. แแ แกแฎแแ แแแแแแจแแ แแแฃแแ แ แแ (แแแแแแแแแ, แฅแกแแแแแ, แแฃแแแแแ แคแแแแฃแ แ แกแแกแขแแแแแ แแแแแชแแแแ แจแแแแฎแแแกแแแแก).
แแก แแกแแแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก CICD-แกแแแแก แแแแแแแแ แแแแก แแแกแแฌแงแแแแ. แแแแแ แแ แแ แกแแแแขแแ แแกแ แแแฎแแกแแแแแแแแแ แแแแกแขแแ แฃแ แ แแแแแจแ แแฃแจแแแแ, แแแ แแ แฌแแแแแฃแแ swarm mode (1.12 แแแ แกแแแแแ แแแ แชแแแแแแ แแงแ แ แแแแ แช docker swarm), แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แจแแแ แแแแ แแ แแ แแแคแ แแกแขแ แฃแฅแขแฃแ แ แ แแแแแแแแ แกแแ แแแ แแแแ แแแแขแแแแแ แแแแก แแแกแแจแแแแแ. แงแแแแ แกแแ แแแ แแก แแแแแ แแ แแก แแแ แขแฃแแแฃแ แ แฅแกแแแแก แแฎแแ แแแญแแ แ, แแ แแก แฉแแจแแแแแฃแแ แแแขแแแ แแแแก แแแแแแกแแ แ, แแกแแแ แแแแขแแแแแ แแแแก แกแแแแฃแแแแแแแก แแฎแแ แแแญแแ แ.
YAML แคแแแแแแ docker compose-แแแ, แแชแแ แ แชแแแแแแแแแแ, แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แแกแแแ แแแแกแขแแ แแแแกแแแแก, แ แแช แแแแแแแแ แแแขแแแแขแแแแ แแแก แแชแแ แ แแ แกแแจแฃแแแ แแแแแก แแแแกแขแแ แแแแก แจแแแแ แฉแฃแแแแแก แกแฎแแแแแกแฎแแ แแแแแแแแกแแแแก. แแแแ แแแแกแขแแ แแแแกแแแแก แกแแกแฃแ แแแแแ Kubernetes, แ แแแแแ Swarm แ แแแแแแก แจแแแแ แฉแฃแแแแแก แฎแแ แฏแแแ แจแแแซแแแแ แแฆแแแแขแแแแแแก Kubernetes-แก. แแแ แแ runC-แแกแ, แจแแแแซแแแแ แแแแแแกแขแแแแ แแ, แแแแแแแแแ, แ แแแแ แช แแแแขแแแแแ แแก แจแแกแ แฃแแแแแก แแแ แแแ
Docker-แแแ แแฃแจแแแแ
แแแกแขแแแแชแแแกแ แแ แแแแคแแแฃแ แแชแแแก แจแแแแแ, แฉแแแ แจแแแแชแแแแแ แจแแแแ แแแแ แแแแกแขแแ แ, แ แแแแแจแแช แแแแแแแแแกแแแ GitLab-แก แแ Docker Registry-แก แแแแแแแแ แแแแก แแฃแแแแกแแแแก. แกแแ แแแ แแ แแแแแแแงแแแแ แกแแ แแแ แขแฃแแแฃแ แแแแฅแแแแก, แ แแแแแแแแช แแแแแขแแแแ แแแแแแแแแกแแ แแแแแฌแแแแแฃแ FS GlusterFS-แก; แแแแแแแงแแแแ แแแก แแแแแ แแก แขแแแแแแก แจแแกแแแแฎแแ, แแแแแแแแแ, แแแแแ แแก แ แแแกแขแ แแก แจแแชแแแแแก แขแแแแ แแแขแฃแแ แแแ แกแแแก แแแกแแจแแแแแ. แแแกแแจแแแแ แซแแ แแแแแ แแแแแแแแแขแแแ: Docker Registry, Postgresql, Redis, GitLab GitLab Runner-แแก แแฎแแ แแแญแแ แแ Swarm-แแก แแแแแ. แฉแแแ แแแแฃแจแแแ Postgresql แแแแกแขแแ แแแแแ
GlusterFS-แแก แแแแกแแแแแกแแแแแ แงแแแแ แกแแ แแแ แแ (แแแ แฃแฌแแแแแแ node1, node2, node3), แแฅแแแ แฃแแแ แแแแแแกแขแแแแ แแ แแแแแขแแแ, แฉแแ แแแ firewall แแ แจแแฅแแแแ แกแแญแแ แ แแแ แแฅแขแแ แแแแ:
# 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-แแก แแแแคแแแฃแ แแชแแแแ แแฃแจแแแแ แฃแแแ แแแแ แซแแแแแก แแ แแ แแแแแซแแแแ, แแแแแแแแแ, 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
แจแแแแแ แแฅแแแ แฃแแแ แแแแแแแขแแแแ แแแฆแแแฃแแ แแแชแฃแแแแ (แแ แซแแแแแ แฃแแแ แจแแกแ แฃแแแแก แงแแแแ แกแแ แแแ แแ):
# mount /srv/docker
Swarm แ แแแแแ แแแแแแคแแแฃแ แแ แแแฃแแแ แแ แ-แแ แ แกแแ แแแ แแ, แ แแแแแแช แแฅแแแแ Leader, แแแแแ แฉแแแก แแแฃแฌแแแก แจแแฃแแ แแแแก แแแแกแขแแ แก, แแแแขแแ แแแ แแแ แกแแ แแแ แแ แแ แซแแแแแแก แจแแกแ แฃแแแแแก แจแแแแแ แกแแญแแ แ แแฅแแแแ แแแแแ แแแ แแ แกแฎแแแแแ แจแแกแ แฃแแแแ.
แแแแกแขแแ แแก แกแแฌแงแแกแ แแแงแแแแแ, แแ แแแกแ แฃแแแ แแ แซแแแแแแก 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
แฉแแแ แแแแแแแ แแแ แแแแ แ แแ แซแแแแแแก แจแแแแแก แแ แแแกแ แฃแแแแ แแแก node2-แแ แแ node3-แแ:
# docker swarm join --token SWMTKN-x-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxx xx.xx.xx.xx:2377
This node joined a swarm as a manager.
แแ แแขแแแแ แกแแ แแแ แแแแก แฌแแแแกแฌแแ แ แแแแคแแแฃแ แแชแแ แแแกแ แฃแแแแฃแแแ, แแแแแ แแแแแแแแแ แกแแ แแแกแแแแก แแแงแแแแแแแ; แจแแกแแกแ แฃแแแแแแ แแ แซแแแแแแแ แแแแฅแแแแแแแ node1-แแแ, แแฃ แกแฎแแ แ แแ แแ แแ แแก แแแแแแแแฃแแ.
แฃแแแ แแแแแก แงแแแแแกแ, แแแแแ แจแแแฅแแแแ แฅแกแแแแแ แแแแขแแแแแ แแแแกแแแแก:
# 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 แจแแแแฎแแแกแแแแก, แ แแแแแแช แกแแญแแ แแ Traefik-แแกแแแแก แแ Stolon-แแกแแแแก. 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
แฉแแแ แแแแแแคแแแฃแ แแ แแแ traefik แแแแขแแแแแ แแแแ แฌแแแแแแก แแแกแแฎแกแแแแแ แแแ แแแแ:
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
แฉแแแ แแแแฃแจแแแ Redis Cluster, แแแแกแแแแแก แฉแแแ แแฅแแแแ แจแแแแฎแแแก แแแ แแฅแขแแ แแแก แงแแแแ แแแแแซแแ:
# 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
แแแแแ แ แ แจแแแซแแแแ แแแฃแแฏแแแแกแแแก? แแแ แฌแแฃแแแแ, แ แแ แแแแแแแคแแแฃแ แแ แแ Traefik แแแแขแแแแแ แแแแก แแแกแแจแแแแแ https-แแ, แแแแแแขแแ tls แแแจแแคแแ แ Postgresql แแ Redis-แแกแแแแก. แแแแ แแ แแแแแแแ, แแก แฃแแแ แจแแแซแแแแ แแแแชแแก แแแแแแแแแ แแแก, แ แแแแ แช PoC. แแแแแ แแฎแแ แแแแแแฎแแแแ Docker-แแก แแแขแแ แแแขแแแแแก.
แแแแแแแ
แแแแแ แแ แแ แกแแแแแแ แชแแแแแแ แซแ แแแ แแแแขแแแแแ แแแแก แแแจแแแแแกแแแแก, แ แแแแแแแช แแแฏแแฃแคแแแฃแแแ แฆแแแแแแแก แแแฎแแแแแ (pods, แแแแขแแแแแ แแแแก แฏแแฃแคแแแ แแ แแแ แแแแแแแแแฃแแ). แแแแแ แแกแแแ แแแแกแฎแแแแแแแ, แแแแขแแแแแ แแแแก แแแกแแจแแแแแ แแ แกแแญแแ แแแแก แ แแแแ แกแแ แแแกแก; แงแแแแ แกแแแฃแจแแ แแแแแแแ libpod แแแแแแแแแแแก แแแจแแแแแแ. แแกแแแ Go-แจแ แแแฌแแ แแแ, แแแแแฎแแแก OCI-แแแแกแแแแแ แแแจแแแแแก แแ แแก แแแแขแแแแแ แแแแก แแแกแแจแแแแแ, แ แแแแ แแชแแ runC.
แแแแแแแแแ แแฃแจแแแแ แแแแแแแ แแแแแ แก แแแแแแแแแแแก, แแ แแแแแแแ, แ แแ แแแแก แแแแแแแแ แจแแแแซแแแแ แแกแ (แ แแแแ แช แแแแ แแ แกแชแแแ, แแแ แจแแ แแก แแ แกแขแแขแแแก แแแขแแ แแก แฉแแแแแแ):
$ alias docker=podman
แแ แจแแแแซแแแแ แแแแแ แซแแแแ แแฃแจแแแแ. แแแแแแแ, แแแแแแแแแ แกแแขแฃแแชแแ แซแแแแแ แกแแแแขแแ แแกแแ, แ แแแแแ แแฃ Kubernetes-แแก แแแ แแฃแแ แแแ แกแแแแ แแฃแจแแแแแ Docker-แแแ, แแแจแแ แแแแฎแแแแแแ 2015 แฌแแแก, แแแแขแแแแแ แแแแก แกแแแงแแ แแก แกแขแแแแแ แขแแแแชแแแก แจแแแแแ (OCI - Open Container Initiative) แแ Docker-แแก แแแงแแคแ แแแแขแแแแแ แแ แแ runC-แแ, แจแแแฅแแแ Docker-แแก แแแขแแ แแแขแแแ Kubernetes-แจแ แแแกแแจแแแแแ: CRI-O. Podman แแ แแฎแ แแ แแ แแก Docker-แแก แแแขแแ แแแขแแแ, แ แแแแแแช แแแแแฃแแแ Kubernetes-แแก แแ แแแชแแแแแแ, แแแแขแแแแแ แแแแก แแแฏแแฃแคแแแแก แฉแแแแแแ, แแแแ แแ แแ แแแฅแขแแก แแแแแแ แ แแแแแแแ Docker-แแก แกแขแแแแก แแแแขแแแแแ แแแแก แแแจแแแแ แแแแแขแแแแแ แกแแ แแแกแแแแก แแแ แแจแ. แแแกแแแแแ แแแแแแแแแก แแแแ, แแ แแ แกแแแแแก แกแแแ แแแก แ แแแแแ, แ แแแแแ แแแแแแแแแ แแแ แแแแแแ แแแแแแแ, แ แแ แแฃ แแแแกแขแแ แ แแญแแ แแแแแ, แแแฆแแ Kubernetes.
แแแงแแแแแแก
Centos 7-แแ แแแกแขแแแแชแแแกแแแแก, แฃแแ แแแแ แแแแแฅแขแแฃแ แแ Extras แกแแชแแแ แแ แจแแแแแ แแแแแแกแขแแแแ แแ แงแแแแแคแแ แ แแ แซแแแแแแ:
# yum -y install podman
แกแฎแแ แแแฎแแกแแแแแแแแแ
Podman-แก แจแแฃแซแแแ แกแแกแขแแแแ แแ แแแฃแแแแแก แแแแแ แแ แแแ, แ แแแแช แแแแแญแ แแก แแแแขแแแแแ แแแแก แแแฌแงแแแแก แแ แแแแแแแก แกแแ แแแ แแก แแแแแขแแแ แแแแก แจแแแแแ. แแแ แแ แแแแกแ, systemd แแแแแชแฎแแแแแฃแแแ, แ แแ แแฃแจแแแแก แกแฌแแ แแ, แ แแแแ แช pid 1 แแแแขแแแแแ แจแ. แแ แกแแแแแก แชแแแแ buildah แแแกแขแ แฃแแแแขแ แแแแขแแแแแ แแแแก แแกแแจแแแแแแแ, แแกแแแ แแ แแก แแแกแแแ แแฎแแ แแก แแแกแขแ แฃแแแแขแแแ - docker-compose-แแก แแแแแแแแแ, แ แแแแแแแช แแกแแแ แฌแแ แแแฅแแแแแ Kubernetes-แแแ แแแแกแแแแ แแแแคแแแฃแ แแชแแแก แคแแแแแแก, แแแแขแแ Podman-แแแ Kubernetes-แแ แแแแแกแแแ แแแฅแกแแแแแฃแ แแ แแแแแ แขแแแแแฃแแแ.
Podman-แแแ แแฃแจแแแแ
แแแแก แแแแ, แ แแ แแ แแ แแก Swarm แ แแแแแ (แฉแแแ แฃแแแ แแแแแแแแแ Kubernetes-แแ, แแฃ แแแแกแขแแ แ แกแแญแแ แแ), แฉแแแ แแแก แชแแแแ แแแแขแแแแแ แแแจแ แแแแ แแแแแ.
แแแแแแกแขแแแแ แแ podman-compose:
# 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
แแแแฎแแ, แ แแก แฌแแ แแแฅแแแแก แแก systemd-แแกแแแแก แแ kubernetes-แแกแแแแก, แแแแกแแแแแก แฉแแแ แฃแแแ แแแแแ แแแแแ pod-แแก แกแแฎแแแ แแ id:
# podman pod ls
POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID
71fc2b2a5c63 root Running 11 minutes ago 3 db40ab8bf84b
แแฃแแแ แแแขแแแ:
# 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
แกแแแฌแฃแฎแแ แแ, แแแแขแแแแแ แแแแก แแแจแแแแแก แแแ แแ, systemd-แแกแแแแก แแแแแ แแ แแแฃแแ แแแแงแแคแแแแแ แกแฎแแแก แแ แแคแแ แก แแแแแแแก (แแแแแแแแแ, แซแแแแ แแแแขแแแแแ แแแแก แแแฌแแแแแ แแกแแแ แกแแ แแแกแแก แแแแแขแแแ แแแแกแแก), แแกแ แ แแ แแฅแแแ แแแแแแ แแแแแฌแแแ แแกแแแ แ แแฆแแชแแแแก แแแฌแแ แ.
แแ แแแชแแแจแ, Podman แกแแแแแ แแกแแ แกแชแแแแ แ แ แแ แแก แแแแขแแแแแ แแแ, แแแแแแขแแแแ แซแแแแ แแแแคแแแฃแ แแชแแแแ docker-compose-แแกแแแแก แแ แจแแแแแ แแแแแแแแแ Kubernetes-แแกแแแ, แแฃ แแญแแ แแแแแ แแแแกแขแแ แ, แแ แแแแฆแแ แฃแคแ แ แแแแแแแ แแแแแกแแงแแแแแแแ แแแขแแ แแแขแแแ Docker-แแกแแแแก.
แ แฅแข
แแ แแแฅแขแ
แแแแจ
แกแฎแแ
แแแกแแแแแแ
Kubernetes-แแแ แกแแขแฃแแชแแ แซแแแแแ แกแแแแขแแ แแกแแ: แแ แแแก แแฎแ แแ, Docker-แแ แจแแแแซแแแแ แจแแฅแแแแ แแแแกแขแแ แ (swarm แ แแแแแจแ), แ แแแแแแแช แจแแแแซแแแแ แแ แแแฃแฅแขแแก แแแ แแแแช แแ แแแฃแจแแแ แแแแแแขแแแแกแแแแก, แแก แแแแกแแแฃแแ แแแแ แแฎแแแ แแชแแ แ แแฃแแแแแก (3-5 แแแแแแแแ) , แแ แแชแแ แ แกแแแ แแ แแแขแแแ แแแแ, แแ แแฃแแแ แแแขแแแแก แแแงแแแแแแก แกแแ แแฃแแแแแแก แแแแแแแก แกแฃแ แแแแแก แแแแแแแแแแ, แแแ แจแแ แแก แแแฆแแแ แแแขแแแ แแแแกแแแแก.
Podman แแ แแซแแแแ แกแ แฃแ แแแแกแแแแแแแแก, แแแแ แแ แแแก แแฅแแก แแ แแ แแแแจแแแแแแแแแ แฃแแแ แแขแแกแแแ - แแแแกแแแแแแแ Kubernetes-แแแ, แแแแแขแแแแแ แฎแแแกแแฌแงแแแแแก แฉแแแแแแ (buildah แแ แกแฎแแ). แแแแขแแ, แกแแแฃแจแแแกแแแแก แฎแแแกแแฌแงแแก แแ แฉแแแแก แจแแแแแแแแแ แแ แแแแฃแแแแแ: แแชแแ แ แแฃแแแแแแกแแแแก, แแ แจแแแฆแฃแแฃแแ แแแฃแฏแแขแแ - Docker (แจแแกแแซแแ swarm แ แแแแแแ), แแแ แแ แแแแแแฃแ แแแกแแแแซแแแแ แกแแแฃแแแ แ แแแแแก แแแแแแแแ แแแแกแแแแก - Podman แแแฎแแแแแแแ แแ แงแแแแ แแแแแ แฉแแแแกแแแแก. - แแฃแแแ แแแขแแแ.
แแแ แฌแแฃแแแแฃแแ แแ แแแ , แ แแ Docker-แแแ แกแแขแฃแแชแแ แแ แจแแแชแแแแแ แแแแแแแแจแ, แแแแแก แแ แแแแแก, แแกแแแ แแ แแแ แแแแแแ แแแ แแ แแกแแแ แแแแแแแแแแแแ แกแขแแแแแ แขแแแแแแแแ แแขแแแแแ แแแแ, แแแแ แแ Podman, แงแแแแ แแแกแ แแแแแแแแแแแแก แแแฃแฎแแแแแแ (แแฃแจแแแแก แแฎแแแแ Linux-แแ, แแแแกแขแแ แแแแชแแแก แแแ แแจแ, แแกแแแแแแ แแ แกแฎแแ แฅแแแแแแแแ แแแกแแแ แแฎแแ แแก แแแแแฌแงแแแขแแแแแแแแ) แแแแแแแแ แฃแคแ แ แแแแแแแ, แแแแขแแ แงแแแแแก แแแแขแแแแ แแแแแฎแแแแ แแก แแแกแแแแแแ แแแแแแขแแ แแแจแ.
PS 3 แแแแแกแขแแก แฉแแแ แแแฌแงแแแ "
แฌแแแแกแฌแแ แ แจแแแแแแแก แคแแกแ แแแแแจแแแแแแแ: 5000 แ แฃแแแ. แจแแแแซแแแแ แแแฎแแ Docker Video Course แแ แแแ แแแ
แฌแงแแ แ: www.habr.com