Thank you for reading this post, don't forget to subscribe!
Имеется несколько хостов:
192.168.1.180 swarm_master1_180
192.168.1.181 swarm_master2_181
192.168.1.182 swarm_master3_182
192.168.1.183 swarm_node1_183
192.168.1.184 swarm_node2_184
192.168.1.185 swarm_node3_185
Рассмотрим установку простого контейнера nginx который будет висеть на 80 порту.(кластер swarm уже собран, traefik и consul работают)
если мы хотим чтобы данный сервис работал в рамках отдельной docker сети, нам нужно будет поправить и заново задеплоить traefik.
создаём нашу новую сеть:
docker network create --driver=overlay nginx
правим traefik.yml
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
[root@swarm_master1_180 ~]# cat traefik.yml version: '3.3' services: consul-leader: image: consul command: agent -server -client=0.0.0.0 -bootstrap -ui volumes: - consul-data-leader:/consul/data environment: - CONSUL_BIND_INTERFACE=eth0 - 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' networks: - default - traefik-public deploy: labels: - traefik.frontend.rule=Host:consul.test.ru - traefik.enable=true - traefik.port=8500 - traefik.tags=${TRAEFIK_PUBLIC_TAG:-traefik-public} - traefik.docker.network=traefik-public # Traefik service that listens to HTTP - traefik.redirectorservice.frontend.entryPoints=http - traefik.redirectorservice.frontend.redirect.entryPoint=https # Traefik service that listens to HTTPS - traefik.webservice.frontend.entryPoints=https - traefik.frontend.auth.basic.users=admin:$$apr1$$N8DjY4oG$$K1zdhbIRzLz0MNUrye27P/ consul-replica: image: consul command: agent -server -client=0.0.0.0 -retry-join="consul-leader" volumes: - consul-data-replica:/consul/data environment: - CONSUL_BIND_INTERFACE=eth0 - 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' networks: - default - traefik-public deploy: replicas: ${CONSUL_REPLICAS:-3} placement: preferences: - spread: node.id traefik: image: traefik:v1.7 ports: - 80:80 - 443:443 deploy: replicas: ${TRAEFIK_REPLICAS:-3} placement: constraints: - node.role == manager preferences: - spread: node.id labels: - traefik.frontend.rule=Host:traefik.test.ru - traefik.enable=true - traefik.port=8080 - traefik.tags=traefik-public - traefik.docker.network=traefik-public # Traefik service that listens to HTTP - traefik.redirectorservice.frontend.entryPoints=http - traefik.redirectorservice.frontend.redirect.entryPoint=https # Traefik service that listens to HTTPS - traefik.webservice.frontend.entryPoints=https - traefik.frontend.auth.basic.users=admin:$$apr1$$N8DjY4oG$$K1zdhbIRzLz0MNUrye27P/ volumes: - /var/run/docker.sock:/var/run/docker.sock command: > --docker --docker.swarmmode --docker.watch --docker.exposedbydefault=false --constraints=tag==traefik-public --entrypoints='Name:http Address::80' --entrypoints='Name:https Address::443 TLS' --consul --consul.endpoint="consul-leader:8500" --logLevel=INFO --accessLog --api <strong>networks</strong>: - default - traefik-public <strong>- nginx</strong> depends_on: - consul-leader volumes: consul-data-leader: consul-data-replica: networks: traefik-public: external: true <strong> nginx: external: true </strong> |
[/codesyntax]
мы добавили для сервиса traefik дополнительную сеть nginx.
[spoiler]
traefik.frontend.auth.basic.users
в качестве логина пароля admin admin (они были созданы следующей командой)
yum install httpd-tools (если не установлена утилита)
echo $(htpasswd -nb admin admin) | sed -e s/\\$/\\$\\$/g
задеплоим данный сервис:
[root@swarm_master1_180 ~]# docker stack deploy -c traefik.yml traefik-consul
теперь мы сможем использовать нашу сеть.
создадим файл nginx.yml со следующим содержимым:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
[root@swarm_master1_180 ~]# <strong>cat nginx.yml</strong> version: '3.3' services: nginx: image: nginx:1.13 <strong>networks: - traefik-public - nginx</strong> deploy: replicas: 1 labels: - traefik.frontend.rule=Host:<strong>nginx.test.ru</strong> - traefik.enable=true - traefik.port=80 <strong> - traefik.tags=traefik-public - traefik.docker.network=nginx</strong> # Traefik service that listens to HTTP # - traefik.redirectorservice.frontend.entryPoints=http # - traefik.redirectorservice.frontend.redirect.entryPoint=https # Traefik service that listens to HTTPS # - traefik.webservice.frontend.entryPoints=https # Traefik service that listens to HTTP <strong> - traefik.webservice.frontend.entryPoints=http</strong> networks: <strong> traefik-public: external: name: traefik-public nginx: external: name: nginx </strong> |
[/codesyntax]
и деплоим его:
[root@swarm_master1_180 ~]# docker stack deploy -c nginx.yml nginx
Далее можем проверить панель traefik:
https://traefik.test.ru
ниже предоставлен скриншот, что на нём показано, хостнейм на фронтенде и бэкенд с нашей новой подсетью nginx 10.0.39.0/24
[spoiler]
[/spoiler]
[root@swarm_master1_180 ~]# curl -I nginx.test.ru
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 612
Content-Type: text/html
Date: Fri, 30 Aug 2019 06:28:21 GMT
Etag: "5acb8e45-264"
Last-Modified: Mon, 09 Apr 2018 16:01:09 GMT
Server: nginx/1.13.12
как видим всё ок.
=========
Добавим ещё один сервис и подправим конфиг текущего, чтобы volume с нашим контентом подтягивался:
1 сервис nginx:
[root@swarm_master1_180 ~]# mkdir -p /var/www/nginx
[root@swarm_master1_180 ~]# cat /var/www/nginx/index.html
test
описание сервиса nginx.yml
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
[root@swarm_master1_180 ~]# cat nginx.yml version: '3.3' services: nginx: image: nginx:1.13 networks: - traefik-public - nginx volumes: - <strong>/var/www/nginx/:/usr/share/nginx/html/</strong> deploy: replicas: 1 labels: - traefik.frontend.rule=Host:nginx.test.ru - traefik.enable=true - traefik.port=80 - traefik.tags=traefik-public - traefik.docker.network=nginx # Traefik service that listens to HTTP # - traefik.redirectorservice.frontend.entryPoints=http # - traefik.redirectorservice.frontend.redirect.entryPoint=https # Traefik service that listens to HTTPS # - traefik.webservice.frontend.entryPoints=https # Traefik service that listens to HTTP - traefik.webservice.frontend.entryPoints=http networks: traefik-public: external: name: traefik-public nginx: external: name: nginx |
[/codesyntax]
второй сервис nginx2:
[root@swarm_master1_180 ~]# mkdir -p /var/www/nginx2
[root@swarm_master1_180 ~]# cat /var/www/nginx2/index.html
test2
описание сервиса nginx2.yml
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
[root@swarm_master1_180 ~]# cat nginx2.yml version: '3.3' services: nginx: image: nginx:1.13 networks: - traefik-public - nginx volumes: - /var/www/nginx2/:/usr/share/nginx/html/ deploy: replicas: 1 labels: - traefik.frontend.rule=Host:nginx2.test.ru - traefik.enable=true - traefik.port=80 - traefik.tags=traefik-public - traefik.docker.network=nginx # Traefik service that listens to HTTP # - traefik.redirectorservice.frontend.entryPoints=http # - traefik.redirectorservice.frontend.redirect.entryPoint=https # Traefik service that listens to HTTPS # - traefik.webservice.frontend.entryPoints=https # Traefik service that listens to HTTP - traefik.webservice.frontend.entryPoints=http networks: traefik-public: external: name: traefik-public nginx: external: name: nginx |
[/codesyntax]
деплоим их:
[root@swarm_master1_180 ~]# docker stack deploy -c nginx.yml nginx
[root@swarm_master1_180 ~]# docker stack deploy -c nginx2.yml nginx2
проверяем:
[spoiler]
https://traefik.test.ru
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<img class="aligncenter wp-image-1262 size-large" src="http://sidmid.ru/wp-content/uploads/2019/08/11-1024x359.png" alt="" width="1024" height="359" /> [root@swarm_master1_180 ~]# <strong>docker stack ls</strong> NAME SERVICES ORCHESTRATOR nginx 1 Swarm nginx2 1 Swarm swarmpit 3 Swarm traefik-consul 3 Swarm [root@swarm_master1_180 ~]# <strong>docker service ls</strong> ID NAME MODE REPLICAS IMAGE PORTS m1kbkq9ckpcy nginx2_nginx replicated 1/1 nginx:1.13 qv5xypjq8znd nginx_nginx replicated 1/1 nginx:1.13 3zpuc16djd98 swarmpit_agent global 6/6 swarmpit/agent:latest maq1t54uyl33 swarmpit_app replicated 1/1 swarmpit/swarmpit:latest *:888->8080/tcp 2h3b7cbmfvwo swarmpit_db replicated 1/1 couchdb:2.3.0 o8tp4ozlj4tf traefik-consul_consul-leader replicated 1/1 consul:latest wcnhdhbjlopj traefik-consul_consul-replica replicated 3/3 consul:latest eetv9rbaf31t traefik-consul_traefik replicated 3/3 traefik:v1.7 *:80->80/tcp, *:443->443/tcp [root@swarm_master1_180 ~]# <strong>docker service ps nginx_nginx</strong> ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xw7f0o8a8xnc nginx_nginx.1 nginx:1.13 swarm_master1_180 Running Running 8 minutes ago xqswux08bp4d \_ nginx_nginx.1 nginx:1.13 swarm_master3_182 Shutdown Rejected 8 minutes ago "invalid mount config for type…" uef7w3rxbu8f \_ nginx_nginx.1 nginx:1.13 swarm_node3_185 Shutdown Rejected 9 minutes ago "invalid mount config for type…" nxrdefdw2gz8 \_ nginx_nginx.1 nginx:1.13 swarm_node3_185 Shutdown Rejected 9 minutes ago "invalid mount config for type…" devu8jl7jtwo \_ nginx_nginx.1 nginx:1.13 swarm_node3_185 Shutdown Rejected 9 minutes ago "invalid mount config for type…" [root@swarm_master1_180 ~]# <strong>docker service ps nginx2_nginx</strong> ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS rwlqf4srbbmv nginx2_nginx.1 nginx:1.13 swarm_master1_180 Running Running 8 minutes ago dvhkqwvzqnon \_ nginx2_nginx.1 nginx:1.13 swarm_master3_182 Shutdown Rejected 8 minutes ago "invalid mount config for type…" rrpd1kqd2ugh \_ nginx2_nginx.1 nginx:1.13 swarm_master3_182 Shutdown Rejected 8 minutes ago "invalid mount config for type…" k90rhcvj3ruj \_ nginx2_nginx.1 nginx:1.13 swarm_master3_182 Shutdown Rejected 8 minutes ago "invalid mount config for type…" nnlr0o8f4qot \_ nginx2_nginx.1 nginx:1.13 swarm_master3_182 Shutdown Rejected 8 minutes ago "invalid mount config for type…" так как необходимая директория с volume была создана только на мастер сервере <strong>swarm_master1_180 </strong>то контейнеры пытались запуститься на разных серверах, но запустились только на <strong>swarm_master1_180</strong> как мы видим, оба сайта корректно отдают свой контент по 80 порту [root@swarm_master1_180 ~]# <strong>curl nginx.test.ru</strong> test [root@swarm_master1_180 ~]# <strong>curl nginx2.test.ru</strong> test2 |
[/spoiler]
=========================================================
Рассмотрим установку nexus.
Данный сервис будет использоваться для хранения скачиваемых образов(также его можно использовать как прокси сервер и репозиторий)
Nexus будет работать только на одном сервере(так как это не критичный сервис)
на сервере swarm_master1_180 создаём директорию для базы данных:
mkdir /var/nexus-data
chmod 777 /var/nexus-data/
отметим, что в данной директории должно быть не меньше 5 гб свободного дискового пространства.
будем использовать стандартную сеть: traefik-public
рассмотрим конфиг nexus.yml
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[root@swarm_master1_180 ~]# cat nexus.yml version: '3.3' services: nexus3: image: sonatype/nexus3 volumes: - /var/nexus-data:/nexus-data networks: - traefik-public deploy: replicas: 1 labels: - traefik.enable=true - traefik.panel.frontend.rule=Host:<strong>nexus.test.ru</strong> - traefik.panel.port=<strong>8081</strong> - traefik.port8082.frontend.rule=Host:<strong>nexus82.test.ru</strong> - traefik.port8082.port=<strong>8082</strong> - traefik.port8083.frontend.rule=Host:<strong>nexus83.test.ru</strong> - traefik.port8083.port=<strong>8083</strong> - traefik.tags=traefik-public - traefik.docker.network=traefik-public placement: constraints: [node.hostname == swarm_master1_180] networks: traefik-public: external: true |
[/codesyntax]
[node.hostname == swarm_master1_180]
привязываем сервис только к 1 ноде.
контейнер nexus использует 3 порта 8081 8082 8083, на порту 8081 висит web панель.
каждый порт мы посадили на свой хост(домен)
[root@swarm_master1_180 ~]# docker stack deploy -c nexus.yml nexus
проверяем:
[spoiler]
https://traefik.test.ru
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[root@swarm_master1_180 ~]# <strong>docker stack ls</strong> NAME SERVICES ORCHESTRATOR nexus 1 Swarm swarmpit 3 Swarm traefik-consul 3 Swarm [root@swarm_master1_180 ~]# <strong>docker service ls</strong> ID NAME MODE REPLICAS IMAGE PORTS lbuvh2wou8so nexus_nexus3 replicated 1/1 sonatype/nexus3:latest 3zpuc16djd98 swarmpit_agent global 6/6 swarmpit/agent:latest maq1t54uyl33 swarmpit_app replicated 1/1 swarmpit/swarmpit:latest *:888->8080/tcp 2h3b7cbmfvwo swarmpit_db replicated 1/1 couchdb:2.3.0 o8tp4ozlj4tf traefik-consul_consul-leader replicated 1/1 consul:latest wcnhdhbjlopj traefik-consul_consul-replica replicated 3/3 consul:latest eetv9rbaf31t traefik-consul_traefik replicated 3/3 traefik:v1.7 *:80->80/tcp, *:443->443/tcp [root@swarm_master1_180 ~]#<strong> docker service ps nexus_nexus3</strong> ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS u608udkyg30k nexus_nexus3.1 sonatype/nexus3:latest swarm_master1_180 Running Running 17 minutes ago |
[/spoiler]
готово, сервис nexus поднят.
nexus.test.ru создаём пользователя, репозиторий и т.д.
Если был создан докер прокси, то на целевых тачках добавляем:
cat /etc/docker/daemon.json
{
"insecure-registries": ["nexus.test.ru","nexus82.test.ru","nexus83.test.ru"],
"experimental": true
}и конектимся:
docker login nexus82.test.ru
в качестве логина и пароля указываем аутентификационные данные заданные при входе в nexus.
всё, на этом готово можно выкачивать образа используя следующую команду:
docker pull nexus82.test.ru/nginx