{"id":1238,"date":"2021-03-30T16:21:52","date_gmt":"2021-03-30T13:21:52","guid":{"rendered":"https:\/\/blog.airmeno.ru\/?p=1238"},"modified":"2021-03-30T16:22:24","modified_gmt":"2021-03-30T13:22:24","slug":"docker-swarm-svoj-orkestrator","status":"publish","type":"post","link":"https:\/\/blog.airmeno.ru\/?p=1238","title":{"rendered":"Docker Swarm. \u0421\u0432\u043e\u0439 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440"},"content":{"rendered":"\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u0441\u0440\u0435\u0434\u044b \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0448\u044c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u0435\u0449\u0435 \u0438 \u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0441\u0438\u0441\u0442\u0435\u043c \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<\/p>\n\n\n\n<p>\u041e\u0440\u043a\u0435\u0441\u0442\u0440\u043e\u0432\u043a\u0430 \u2014 \u044d\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<\/p>\n\n\n\n<p>Docker Swarm \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f Docker. \u0425\u043e\u0441\u0442\u044b Docker \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 Swarm. Docker Swarm \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b, \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044f \u0435\u0435 \u043f\u043e \u043d\u043e\u0434\u0430\u043c Docker \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b Kubernetes, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c Docker Swarm \u0441 Kubernetes, \u0442\u043e Kubernetes \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435\u043d \u0438 \u0433\u0438\u0431\u043e\u043a, \u043d\u043e Swarm \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438 \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0442\u0440\u0443\u0434\u043e\u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u043d \u043f\u0440\u043e\u0441\u0442, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u043b\u044e\u0441\u043e\u043c: \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Swarm \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u0443. \u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438 \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0438\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c Kubernetes.<\/p>\n\n\n\n<p>\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u0446\u0438\u0444\u0440\u044b: Docker Swarm \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0438\u0440\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 50 \u0442\u044b\u0441\u044f\u0447 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 1000 \u043d\u043e\u0434. \u041f\u0440\u0438 \u044d\u0442\u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0438\u0444\u0440\u0430\u0445 \u0443 Swarm-\u0430 \u043d\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (autoscaling).<\/p>\n\n\n\n<p>Docker Swarm \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Docker Engine \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u041f\u043b\u044e\u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043d\u044b\u0435 \u0445\u043e\u0441\u0442\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c.<\/p>\n\n\n\n<p>\u0412 \u0440\u0435\u0436\u0438\u043c\u0435 Swarm \u0432 Docker \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u0438\u044f stack \u0438 service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker node \r\ndocker stack\r\ndocker service<\/code><\/pre>\n\n\n\n<p>\u0421\u0442\u0435\u043a\u0438, \u0441\u0435\u0440\u0432\u0438\u0441\u044b &#8212; \u044d\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u043d\u0438 \u0443\u0440\u043e\u0432\u043d\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u0434 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438. \u0423 \u043d\u0438\u0445 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u043d\u0430, \u043f\u043e\u0440\u0442\u044b, \u0442\u043e\u043c\u0430 \u0438 \u0442.\u0434.<\/p>\n\n\n\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Docker Swarm. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0442\u0440\u0438 \u0445\u043e\u0441\u0442\u0430 (\u0432\u044b\u0431\u043e\u0440 \u0446\u0438\u0444\u0440\u044b 3 \u043d\u0430\u0432\u0435\u0440\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c, \u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e).<\/p>\n\n\n\n<p>\u041d\u0430 \u0445\u043e\u0441\u0442\u0430\u0445 (\u043d\u043e\u0434\u0430\u0445) \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b Docker Engine.<\/p>\n\n\n\n<p>\u0418 \u0442\u0430\u043a, \u043d\u0430\u0448 \u0441\u0442\u0435\u043d\u0434. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Vagrant \u043d\u0430 Ubuntu 20.04, \u043d\u043e\u0434\u044b \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430 Ubuntu Focal, \u043d\u0430 \u043d\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d Docker.<\/p>\n\n\n\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u041d\u043e\u0434\u044b:\r\nmaster - 192.168.10.11\r\nworker1 - 192.168.10.12\r\nworker2 - 192.168.10.13<\/code><\/pre>\n\n\n\n<h3>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Docker Engine \u043d\u0430 \u043d\u043e\u0434\u044b<\/h3>\n\n\n\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Docker Engine \u043d\u0430 Ubuntu \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/env bash\r\n\r\nsudo apt-get update -y\r\nsudo apt-get install -y \\\r\n    apt-transport-https \\\r\n    ca-certificates \\\r\n    curl \\\r\n    gnupg \\\r\n    lsb-release\r\n\r\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/usr\/share\/keyrings\/docker-archive-keyring.gpg\r\n\r\necho \\\r\n  \"deb &#91;arch=amd64 signed-by=\/usr\/share\/keyrings\/docker-archive-keyring.gpg] https:\/\/download.docker.com\/linux\/ubuntu \\\r\n  $(lsb_release -cs) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list > \/dev\/null\r\n\r\nsudo apt-get update -y\r\nsudo apt-get install -y docker-ce docker-compose docker-ce-cli containerd.io\r<\/code><\/pre>\n\n\n\n<p>\u0418\u043b\u0438, \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u0434\u043b\u044f \u043c\u0435\u043d\u044f, Ansible:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\r\n- name: 'Install Docker Engine to Ubuntu'\r\n  hosts: all\r\n  become: true\r\n\r\n  tasks:\r\n  - name: Install prerequisites for Docker repository\r\n    apt:\r\n      name: &#91;'apt-transport-https', 'ca-certificates', 'curl', 'gnupg2', 'software-properties-common']\r\n      update_cache: yes\r\n\r\n  - name: Add Docker GPG key\r\n    apt_key: url=https:\/\/download.docker.com\/linux\/ubuntu\/gpg\r\n\r\n  - name: Add Docker APT repository\r\n    apt_repository:\r\n      repo: deb &#91;arch=amd64] https:\/\/download.docker.com\/{{ ansible_system | lower }}\/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} stable\r\n\r\n  - name: Install Docker CE\r\n    apt:\r\n      name: &#91;'docker-ce', 'docker-ce-cli', 'containerd.io']\r\n      update_cache: yes\r\n\r\n  - name: Install prerequisites for docker-compose\r\n    apt:\r\n      name: &#91;'python3-pip', 'python3-setuptools', 'virtualenv']\r\n\r\n  - name: Install docker-compose\r\n    pip:\r\n      name: docker-compose\r<\/code><\/pre>\n\n\n\n<div class=\"is-layout-flow wp-block-group\"><div class=\"wp-block-group__inner-container\">\n<p><a href=\"https:\/\/docs.docker.com\/engine\/install\/ubuntu\/\">https:\/\/docs.docker.com\/engine\/install\/ubuntu\/<\/a><\/p>\n<\/div><\/div>\n\n\n\n<h3>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Docker Swarm<\/h3>\n\n\n\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Swarm:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker swarm init<\/code><\/pre>\n\n\n\n<p>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 swarm (ip \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker swarm init --advertise-addr 192.168.10.11 \r\n\u0438\u043b\u0438\r\nsudo docker swarm init --advertise-addr eth{X}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant@master:~$ sudo docker swarm init --advertise-addr 192.168.10.11\r\nSwarm initialized: current node (c8c1bngf6s7upknjbwykv3q2v) is now a manager.\r\n\r\nTo add a worker to this swarm, run the following command:\r\n\r\n    docker swarm join --token SWMTKN-1-0c77d9x5mph6k6zizn93290degg1z2c25rotgbabxrwx4sh0by-f03hbqskhbszllpt4vbb95qvv 192.168.10.11:2377\r\n\r\nTo add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.<\/code><\/pre>\n\n\n\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Swarm \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d.<\/p>\n\n\n\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0438 \u043d\u043e\u0434\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker swarm join --token SWMTKN-1-0c77d9x5mph6k6zizn93290degg1z2c25rotgbabxrwx4sh0by-f03hbqskhbszllpt4vbb95qvv 192.168.10.11:2377<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant@worker1:~$ sudo docker swarm join --token SWMTKN-1-0c77d9x5mph6k6zizn93290degg1z2c25rotgbabxrwx4sh0by-f03hbqskhbszllpt4vbb95qvv 192.168.10.11:2377\r\nThis node joined a swarm as a worker.\r\n\r\nvagrant@worker2:~$ sudo docker swarm join --token SWMTKN-1-0c77d9x5mph6k6zizn93290degg1z2c25rotgbabxrwx4sh0by-f03hbqskhbszllpt4vbb95qvv 192.168.10.11:2377\r\nThis node joined a swarm as a worker.<\/code><\/pre>\n\n\n\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant@master:~$ sudo docker node ls\r\nID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION\r\nc8c1bngf6s7upknjbwykv3q2v *   master     Ready     Active         Leader           20.10.5\r\nw0r72yyrxv10fq9zsvdwea7u7     worker1    Ready     Active                          20.10.5\r\ns7klsqwemj419vfbxqg3tvl3l     worker2    Ready     Active                          20.10.5\r\n\r\nvagrant@master:~$ sudo docker stack ls\r\nNAME      SERVICES   ORCHESTRATOR\r\n\r\nvagrant@master:~$ sudo docker service ls\r\nID        NAME      MODE      REPLICAS   IMAGE     PORTS\r\n\r\nvagrant@master:~$ sudo docker ps -a\r\nCONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES<\/code><\/pre>\n\n\n\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0430\u043a\u0442\u0438\u0432\u0435\u043d, \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 master, worker1 \u0438 worker2. \u0421\u0442\u0435\u043a\u043e\u0432, \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043d\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e.<\/p>\n\n\n\n<h3>Web \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f Swarm<\/h3>\n\n\n\n<p>\u041d\u0435 \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 CLI \u0438\u043b\u0438 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0442\u0443\u0442 \u0432\u044b\u0431\u043e\u0440 \u0437\u0430 \u043a\u0430\u0436\u0434\u044b\u043c, \u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c Portainer.<\/p>\n\n\n\n<p>Portainer \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Portainer \u0438 \u0430\u0433\u0435\u043d\u0442\u0430 Portainer. \u041e\u0431\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u043b\u0435\u0433\u043a\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Swarm. \u0410\u0433\u0435\u043d\u0442\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435\u0445 \u043d\u043e\u0434\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Swarm \u0438 &#171;\u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442&#187; \u0441\u0435\u0440\u0432\u0435\u0440 \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043d\u043e\u0434.<\/p>\n\n\n\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Portainer \u043e\u0442\u043a\u0440\u044b\u0442 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442 9000, \u0430 \u0430\u0433\u0435\u043d\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u0442 8000.<\/p>\n\n\n\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, Portainer \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0442 \u0438 \u043d\u0430 Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445.<\/p>\n\n\n\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -L https:\/\/downloads.portainer.io\/portainer-agent-stack.yml -o portainer-agent-stack.yml\r\n\r\ndocker stack deploy -c portainer-agent-stack.yml portainer<\/code><\/pre>\n\n\n\n<p>YAML \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0444\u0430\u0439\u043b \u0434\u043b\u044f docker-compose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat portainer-agent-stack.yml\r\n\r\nversion: '3.2'\r\n\r\nservices:\r\n  agent:\r\n    image: portainer\/agent\r\n    volumes:\r\n      - \/var\/run\/docker.sock:\/var\/run\/docker.sock\r\n      - \/var\/lib\/docker\/volumes:\/var\/lib\/docker\/volumes\r\n    networks:\r\n      - agent_network\r\n    deploy:\r\n      mode: global\r\n      placement:\r\n        constraints: &#91;node.platform.os == linux]\r\n\r\n  portainer:\r\n    image: portainer\/portainer-ce\r\n    command: -H tcp:\/\/tasks.agent:9001 --tlsskipverify\r\n    ports:\r\n      - \"9000:9000\"\r\n      - \"8000:8000\"\r\n    volumes:\r\n      - portainer_data:\/data\r\n    networks:\r\n      - agent_network\r\n    deploy:\r\n      mode: replicated\r\n      replicas: 1\r\n      placement:\r\n        constraints: &#91;node.role == manager]\r\n\r\nnetworks:\r\n  agent_network:\r\n    driver: overlay\r\n    attachable: true\r\n\r\nvolumes:\r\n  portainer_data:<\/code><\/pre>\n\n\n\n<p>\u0412\u043a\u0440\u0430\u0442\u0446\u0435, \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0430\u0433\u0435\u043d\u0442 \u0441 deploy mode: global, \u0442.\u0435. \u043d\u0430 \u0432\u0441\u0435\u0445 \u043d\u043e\u0434\u0430\u0445, \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c, \u0447\u0442\u043e \u043d\u0430 \u043d\u043e\u0434\u0430\u0445 Linux \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440 Portainer:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>deploy:\r\n      mode: replicated\r\n      replicas: 1\r\n      placement:\r\n        constraints: &#91;node.role == manager]<\/code><\/pre>\n\n\n\n<ul><li>\u0440\u0435\u043f\u043b\u0438\u043a\u0438 = 1<\/li><li>\u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043d\u0430 \u043d\u043e\u0434\u0435 = manager, \u0442.\u0435. master<\/li><\/ul>\n\n\n\n<p>\u0415\u0449\u0435 \u0440\u0430\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant@master:~$ sudo docker stack ls\r\nNAME        SERVICES   ORCHESTRATOR\r\nportainer   2          Swarm\r\n\r\nvagrant@master:~$ sudo docker service ls\r\nID             NAME                  MODE         REPLICAS   IMAGE                           PORTS\r\n258z8x88618i   portainer_agent       global       3\/3        portainer\/agent:latest          \r\nim61j820aio8   portainer_portainer   replicated   1\/1        portainer\/portainer-ce:latest   *:8000->8000\/tcp, *:9000->9000\/tcp<\/code><\/pre>\n\n\n\n<p>\u0417\u0430\u0439\u0434\u0435\u043c \u043d\u0430 \u0432\u0435\u0431 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 &#8212; http:\/\/192.168.10.11:9000\/<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a  href=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-1.jpg\" data-rel=\"lightbox-gallery-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"529\" src=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-1-1024x529.jpg\" alt=\"\" class=\"wp-image-1241\" srcset=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-1-1024x529.jpg 1024w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-1-300x155.jpg 300w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-1-768x397.jpg 768w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-1.jpg 1254w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a  href=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-2.jpg\" data-rel=\"lightbox-gallery-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"529\" src=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-2-1024x529.jpg\" alt=\"\" class=\"wp-image-1242\" srcset=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-2-1024x529.jpg 1024w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-2-300x155.jpg 300w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-2-768x397.jpg 768w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-2.jpg 1259w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p><a href=\"https:\/\/documentation.portainer.io\/v2.0\/deploy\/ceinstallswarm\/\">https:\/\/documentation.portainer.io\/v2.0\/deploy\/ceinstallswarm\/<\/a><\/p>\n\n\n\n<h3>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/h3>\n\n\n\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 Nginx \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker service create --replicas 2 --publish 8080:80 --name nginx-srv airmeno\/alpine-nginx\r<\/code><\/pre>\n\n\n\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant@master:~$ sudo docker service ls\r\nID             NAME                  MODE         REPLICAS   IMAGE                           PORTS\r\nzf4m0vk687av   nginx-srv             replicated   2\/2        airmeno\/alpine-nginx:latest     *:8080->80\/tcp\r\n258z8x88618i   portainer_agent       global       3\/3        portainer\/agent:latest          \r\nim61j820aio8   portainer_portainer   replicated   1\/1        portainer\/portainer-ce:latest   *:8000->8000\/tcp, *:9000->9000\/tcp<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><a  href=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-3.jpg\" data-rel=\"lightbox-gallery-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"461\" src=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-3-1024x461.jpg\" alt=\"\" class=\"wp-image-1243\" srcset=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-3-1024x461.jpg 1024w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-3-300x135.jpg 300w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-3-768x346.jpg 768w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-3.jpg 1440w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>\u0422\u0443\u0442 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 cli:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker service scale zf4m0vk687av=3<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant@master:~$ sudo docker service ps zf4m0vk687av\r\nID             NAME          IMAGE                         NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS\r\nwf7ypamsd6ij   nginx-srv.1   airmeno\/alpine-nginx:latest   worker2   Running         Running 13 minutes ago             \r\nmkv4igumbavk   nginx-srv.2   airmeno\/alpine-nginx:latest   worker1   Running         Running 13 minutes ago             \r\nby7wvtw14yq4   nginx-srv.3   airmeno\/alpine-nginx:latest   master    Running         Running 3 minutes ago  <\/code><\/pre>\n\n\n\n<p>\u041e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 (\u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker service scale zf4m0vk687av=1\r\n\r\nvagrant@master:~$ sudo docker service ps zf4m0vk687av\r\nID             NAME          IMAGE                         NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS\r\nwf7ypamsd6ij   nginx-srv.1   airmeno\/alpine-nginx:latest   worker2   Running         Running 34 minutes ago <\/code><\/pre>\n\n\n\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a  href=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-4.jpg\" data-rel=\"lightbox-gallery-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"563\" src=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-4-1024x563.jpg\" alt=\"\" class=\"wp-image-1244\" srcset=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-4-1024x563.jpg 1024w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-4-300x165.jpg 300w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-4-768x422.jpg 768w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-4.jpg 1186w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>\u041f\u0440\u0438\u0442\u043e\u043c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0438\u0437 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u043d\u0430 \u043d\u043e\u0434\u0435 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.<\/p>\n\n\n\n<h3>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0435\u043a<\/h3>\n\n\n\n<p>\u0421\u0442\u0435\u043a &#8212; \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0432\u044f\u0437\u043a\u0430 Nginx + PHP-FPM, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u0430\u044f \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f Nginx c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u043a \u0436\u0435 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f php-fpm \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u0414\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0435\u043a. \u0423\u0442\u0440\u0438\u0440\u0443\u044f, \u0441\u0442\u0435\u043a \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 \u043a\u043e\u043c\u043f\u043e\u0441\u0435\u0440\u0430 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n\n\n\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0441\u0442\u0435\u043a\u0430:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker stack ls\r\nsudo docker stack ps portainer\r\nsudo docker stack services portainer\r\nsudo docker stack rm portainer<\/code><\/pre>\n\n\n\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0441\u0442\u0435\u043a\u0430:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat my-nginx-stack.yml\r\n\r\nversion: '3.8'\r\n\r\nservices:\r\n nginx:\r\n  image: airmeno\/otus-nginx\r\n  ports:\r\n   - 80:80\r\n  volumes:\r\n   - \/opt\/code:\/www:rw\r\n  networks:\r\n   - nginx-php\r\n  deploy:\r\n    mode: replicated\r\n    replicas: 1\r\n    placement:\r\n      constraints: &#91;node.platform.os == linux]\r\n \r\n myphp:\r\n  image: airmeno\/otus-php\r\n  container_name: myphp\r\n  volumes:\r\n   - \/opt\/code:\/www:rw\r\n  networks:\r\n   - nginx-php\r\n  deploy:\r\n    mode: replicated\r\n    replicas: 2\r\n    placement:\r\n      constraints: &#91;node.platform.os == linux]\r\n\r\nnetworks:\r\n  nginx-php:<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker stack deploy -c my-nginx-stack.yml mynginx <\/code><\/pre>\n\n\n\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vagrant@master:~$ sudo docker service ls\r\nID             NAME                  MODE         REPLICAS   IMAGE                           PORTS\r\n80mf4xnlq5sl   mynginx_myphp         replicated   2\/2        airmeno\/otus-php:latest         \r\np65lm40kmz9p   mynginx_nginx         replicated   1\/1        airmeno\/otus-nginx:latest       *:80->80\/tcp\r\nzf4m0vk687av   nginx-srv             replicated   1\/1        airmeno\/alpine-nginx:latest     *:8080->80\/tcp\r\n258z8x88618i   portainer_agent       global       3\/3        portainer\/agent:latest          \r\nim61j820aio8   portainer_portainer   replicated   1\/1        portainer\/portainer-ce:latest   *:8000->8000\/tcp, *:9000->9000\/tc\r\n\r\nvagrant@master:~$ sudo docker stack ls\r\nNAME        SERVICES   ORCHESTRATOR\r\nmynginx     2          Swarm\r\nportainer   2          Swarm<\/code><\/pre>\n\n\n\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043f\u043e \u043c\u0435\u0441\u0442\u0443 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u043f\u0446\u0438\u0438 volumes \/opt\/code:\/www<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo bash -c 'echo \"&lt;?php phpinfo(); ?>\" > \/opt\/code\/index.php'<\/code><\/pre>\n\n\n\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u0448 \u0441\u0442\u0435\u043a:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a  href=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-5.jpg\" data-rel=\"lightbox-gallery-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"562\" src=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-5-1024x562.jpg\" alt=\"\" class=\"wp-image-1245\" srcset=\"https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-5-1024x562.jpg 1024w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-5-300x165.jpg 300w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-5-768x422.jpg 768w, https:\/\/blog.airmeno.ru\/wp-content\/uploads\/2021\/03\/swarm-5.jpg 1186w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044e \u0441\u0440\u0435\u0434\u044b \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0448\u044c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u0435\u0449\u0435 \u0438&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[96],"tags":[97,122],"_links":{"self":[{"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=\/wp\/v2\/posts\/1238"}],"collection":[{"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1238"}],"version-history":[{"count":6,"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=\/wp\/v2\/posts\/1238\/revisions"}],"predecessor-version":[{"id":1249,"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=\/wp\/v2\/posts\/1238\/revisions\/1249"}],"wp:attachment":[{"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.airmeno.ru\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}