Как подключить службы Docker Swarm к обычной сети Docker?

У меня есть один небольшой VPS, на котором есть множество сервисов, таких как установка WordPress и несколько веб-приложений. Некоторое время я запускал на нем все службы как контейнеры Docker. Поскольку у меня есть множество доменов и поддоменов, указывающих на это поле, я использую внешний прокси Traefik для захвата веб-портов и последующей маршрутизации их внутри сети Docker.

Я запускаю Traefik следующим образом:

#!/bin/bash

# Removes the restart policy from previous containers
CONTAINER_LABEL=traefik-instance
../../bin/remove-restart.sh $CONTAINER_LABEL

mkdir --parents /var/log/traefik
mkdir --parents /etc/letsencrypt-traefik

docker run \
    --label $CONTAINER_LABEL \
    --publish 80:80 \
    --publish 443:443 \
    --volume $PWD/traefik.toml:/etc/traefik/traefik.toml \
    --volume $PWD/rules:/etc/traefik/rules \
    --volume /etc/letsencrypt-traefik:/etc/letsencrypt-traefik \
    --volume /var/log/traefik:/log \
    --network dockernet \
    --detach \
    --restart always \
    traefik:1.6

Это все работает очень красиво. Я недавно обнаружил Docker Swarm, и хотел бы преобразовать все мои контейнеры в службы, которые предоставят мне службы репликации, скользящие обновления и развертывания с нулевым временем простоя. Однако я хотел бы внести изменения по частям, чтобы Traefik мог выполнять маршрутизацию как к службам Swarm, так и к обычным (не связанным с Swarm) контейнерам.

Итак, чтобы запустить Traefik как службу, я сейчас делаю следующее. Вы заметите, что я использую нестандартные порты для целей тестирования:

#!/bin/bash

# Using "traefik2" while I am experimenting with multiple services
mkdir --parents /var/log/traefik2
mkdir --parents /etc/letsencrypt-traefik

docker service create \
    --publish 8080:80 \
    --publish 8443:443 \
    --mount type=bind,source=$PWD/traefik.toml,target=/etc/traefik/traefik.toml \
    --mount type=bind,source=$PWD/rules,target=/etc/traefik/rules \
    --mount type=bind,source=/etc/letsencrypt-traefik,target=/etc/letsencrypt-traefik \
    --mount type=bind,source=/var/log/traefik2,target=/log \
    --network traefiknet \
    traefik:1.6

Это также работает, когда я указываю на веб-службу Swarm, которая появляется в той же сети.

Итак, у меня есть две сети Docker (среди них различные значения по умолчанию, которые Docker создает для себя), например:

root@box:~/docker# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1aa479f13faa        dockernet           bridge              local
k71hpg1n0lo9        traefiknet          overlay             swarm

В результате у меня есть рабочий контейнер Traefik, который может видеть контейнеры Docker, и рабочий сервис Traefik, который может видеть сервисы Swarm. Однако они не могут видеть друг друга.

Чтобы попытаться исправить это, Я попытался добавить сеть Docker при запуске службы Traefik Swarm:

--network dockernet \

Другими словами, я хочу, чтобы эта служба подключалась как к мостовой (старой), так и к оверлейной (новой) сетям. К сожалению, я получаю следующее:

Ответ от демона об ошибке: сеть dockernet не может использоваться со службами. Могут использоваться только сети, относящиеся к рою, например созданные с помощью драйвера оверлея.

Есть ли способ, которым моя новая служба может подключиться к старой сети, или действительно есть способ, которым мои старые контейнеры могут подключаться к новой сеть? Я попытался найти ошибку, но, похоже, о ней вообще нечасто упоминается; Интересно, многие ли люди еще не сталкивались с этим крайним случаем использования Swarm.

(Конечно, одним из решений для меня является преобразование всех моих контейнеров в службы, но, чтобы избежать серьезных изменений, я ' Я предпочитаю делать это медленно, если возможно).

Попытка присоединяемых сетей

Затем я удалил свои службы и попробовал следующее:

docker network rm traefiknet
docker network create driver=overlay --attachable traefiknet

Затем я воссоздал службу Traefik, и она запустилась. Очевидно, он все еще работает, потому что он направляет трафик к службе, которая также присоединилась к наложению traefiknet.

Однако я создал контейнер, не являющийся служебным, и подключил его исключительно к traefiknet , и - сетевой псевдоним , созданный мной, не может быть виден службой. Как ни странно, если я использую оболочку в этом контейнере, отличном от Swarm, он может пинговать контейнер Swarm Traefik, так что сеть работает. (Я попытался создать службу оболочки Alpine, подключенную к traefiknet , и отсюда я не могу пропинговать ни имя контейнера моего не-Swarm-контейнера, ни его - сетевой псевдоним ).

Обновление Docker

Я попытался обновить Docker с 17.03.2 до 18.06.1, потому что фраза в руководстве указывает, что моя старая версия Docker могла быть причиной проблема:

Связь между контейнером и службой роя устанавливает связь между автономным контейнером и службой роя, используя присоединяемую оверлейную сеть. Это поддерживается в Docker 17.06 и выше.

Однако это также не помогло.

0
задан 26 August 2018 в 19:32
1 ответ

Ekwenyere m na m nwere ndozi maka nke a, agbanyeghị na ọ nwere ụfọdụ ihe m na-aghọtaghị. Iji tọọ ntọala maka azịza a, ihe ndị a bụ otu m si arụnye ihe nchekwa Docker na-abụghị Swarm:

#!/bin/bash

# Save pwd and then change dir to the project root
STARTDIR=`pwd`
cd `dirname $0`/../..

# Removes the restart policy from previous containers
CONTAINER_LABEL=ilovephp-staging
NETWORK_ALIAS=${CONTAINER_LABEL}
./bin/remove-restart.sh $CONTAINER_LABEL

docker run \
    --network swarmnet \
    --network-alias ${NETWORK_ALIAS} \
    --env TUTORIAL_ENVIRONMENT_NAME=staging \
    --detach \
    --restart always \
    ilovephp:2018-08-19

# Go back to original dir
cd $STARTDIR

Dịka ị pụrụ ịhụ, dịka mmelite ajụjụ m, ugbu a enwere m ike itinye akpa na netwọ Swarm a na-akwụ ụgwọ.

Achọpụtala m ihe kpatara na nke a enweghị ike ịda mbà site na ọrụ Swarm bụ na ọ na-efu - aha . Ozugbo m tinyere - aha , enwere ike ịnweta ya. Ma, ihe na-atọ m ụtọ bụ na ọ bụrụ na m nwaa ịnyịnya na Docker rụọ ping ma ọ bụ na Swarm, ọ na-arụ ọrụ:

root@server:~# docker exec -it loving_allen sh
/ # # *** Ping a specific Swarm container ***
/ # ping alpine-swarm.1.9llv2hvv5xnc1c8diuhfh5m09
PING alpine-swarm.1.9llv2hvv5xnc1c8diuhfh5m09 (10.0.1.23): 56 data bytes
64 bytes from 10.0.1.23: seq=0 ttl=64 time=0.516 ms
^C
--- alpine-swarm.1.9llv2hvv5xnc1c8diuhfh5m09 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.516/0.516/0.516 ms
/ # # *** Ping the Swarm service ***
/ # ping alpine-swarm
PING alpine-swarm (10.0.1.22): 56 data bytes
64 bytes from 10.0.1.22: seq=0 ttl=64 time=0.376 ms
^C
--- alpine-swarm ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.137/0.231/0.376 ms

Yabụ, ebum n'uche m bụ ịtụgharị ihe atụ Traefik m site na akpa gaa na Ọrụ Ọdụ, mana nke ahụ agaghị na-arụ ọrụ, n'ihi na a na-akpọghị ndị na-abụghị ndị na-enweghị ebe a ga-enweta ya. Ihe ngwọta m ugbu a bụ ịtụgharị sistemụ m niile site na arịa gaa na ọrụ na mbụ, ma ozugbo emechara ya, enwere m ike ịgbanwe akụkọ Traefik ikpeazụ. N'ụzọ dị otú a, m ga na-ejikọ site na akpa na ọrụ, ọ bụghị n'ụzọ ọzọ gburugburu. nwere otu aha, ha ga-ada n'ihi na arịa ochie ndị ahụ ka ga-enwe aha ndị ahụ na-emegiderịta onwe ha. [1265408] More na na ebe a ). utu aha anaghịkwa enyere aka. Ma, ebe ọ bụ na azịza m ga-adị naanị nwa oge ruo mgbe sistemụ m niile bụ ọrụ Swarm, ọ nwere ike o nweghị isi.

0
ответ дан 5 December 2019 в 05:21

Теги

Похожие вопросы