Рубрики
Uncategorized

Связывание контейнеров докеров

Этот учебник научит вас создавать и связать контейнеры Docker.

Автор оригинала: Billie Thompson.

Billies-MBP-2:~ billie$  docker run hello-world

Маленькие вещи, работающие вместе

Я хочу поговорить с вами о некоторых крошечных вещах сегодня. Докер контейнеры.

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

Тем не менее, даже умеренно сложная система — это только один контейнер докера.

Но как вы получаете контейнеры Docker в сеть вместе?

Как Docker обрабатывает сеть

К счастью, Docker Mimics другие технологии, с которыми вы уже знакомы, чтобы решить эти проблемы. Подобное с физическими сетями и виртуализированными сетевыми устройствами, Docker предлагает вам возможность создавать сети и размещать контейнеры внутри них.

Чтобы продемонстрировать это, мне понадобится что-то в великой традиции синего Петра, и это несколько контейнеров, которые я подготовил ранее.

Billies-MBP-2:~ billie$  docker run -p 80:80 --name=flappy quay.io/purplebooth/flappy-endpoint

Как вы можете видеть сверху, это действительно простой контейнер Docker, который имеет веб-сервер, который возвращает 200 для всех запросов, и работает только по порту 80 Отказ

Я уверен, что вы видели такую команду раньше, она рассказывает контейнер докера к порту Map 80 на хосте докера на порт 80 на этом контейнере. Это означает, что я могу затем подключиться к этому порту на моей виртуальмах в 192.168.99.100 на порту 80 Где я увижу эту веб-страницу.

Что эта команда внутренне делает, рассказывает Docker добавить новый контейнер к по умолчанию мост сеть , мост и опубликовать порт 80 , как подключается.

Мы можем видеть это, запустив следующую команду

Billies-MBP-2:~ billie$  docker network inspect bridge
[
  {
    "Name": "bridge",
    "Id": "b1a20d28732dbb2dd6f833fea71a942ead4c6c17508f8cc1556c830529a16ec3",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": null,
      "Config": [
        {
          "Subnet": "172.17.0.0/16"
        }
      ]
    },
    "Internal": false,
    "Containers": {
      "9a11f72a89242c17377b7f7b87b5bd5eba9bcdfac848f640c068112c7d3d467a": {
        "Name": "flappy",
        "EndpointID": "05b1b68f41fcfa0b0042ce55a65c52f58713a1d090fb185ec93db60be35efad8",
        "MacAddress": "02:42:ac:11:00:02",
        "IPv4Address": "172.17.0.2/16",
        "IPv6Address": ""
      }
    },
    "Options": {
      "com.docker.network.bridge.default_bridge": "true",
      "com.docker.network.bridge.enable_icc": "true",
      "com.docker.network.bridge.enable_ip_masquerade": "true",
      "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
      "com.docker.network.bridge.name": "docker0",
      "com.docker.network.driver.mtu": "1500"
    },
    "Labels": {}
  }
]

Обратите внимание, как контейнер Flappy находится в разделе контейнеров. Если мы смотрим в сам контейнер Docker, мы видим, как это видит контейнер. Запустите это, чтобы попасть в контейнер

Billies-MBP-2:~ billie$  docker exec -it flappy bash
root@9a11f72a8924:/var/www/html#

Теперь давайте посмотрим на конфигурацию сети

root@9a11f72a8924:/var/www/html# ip addr      
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
8: eth0@if9:  mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever

Здесь вы можете увидеть, что мы были назначены IP-адрес в обозначенном диапазоне, указанном в сети по умолчанию, мы только что увидели, 172.17.0.0/16 Диапазон: 172.17.0.2/16 Отказ

Теперь вы заметите, что этот диапазон не 172.17.0.1/16 Отказ Это потому, что Docker резервирует первый IP 172.17.0.1 для докера хоста в этой сети. Который делает экспедирование IP.

Если мы посмотрим на маршруты, вы сможете увидеть, как мы используем этот IP-адрес в качестве нашего шлюза, чтобы получить пакеты в более широкую сеть.

root@9a11f72a8924:/var/www/html# ip route list       
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.2 

Хорошо, так это много слов. На практике мы только что сделали следующее.

Изображение показывая пакеты, поступающие из браузера, в докер, затем в контейнер.

Используя это для наших приложений Сеть

Хорошо. Отлично Но как мне получить этот контейнер, разговаривая с другим контейнером, я слышу, как вы спросите.

Одним из больших преимуществ докера является повторное использование. Итак, давайте будем использовать предварительно сделанный контейнер Docker, чтобы добавить SSL на наше удивительное обслуживание. Это просто простой обратный прокси, который имеет конечную точку HTTPS с помощью сертификатов самообслуживания.

Это выглядит так, когда мы закончим.

Та же сетевая диаграмма, за исключением той же сети, так как у нас был один контейнер, у нас сейчас есть два. Мы собираемся добавить возможность подключения к HTTPS на одном обслуживании

Здесь вы можете увидеть меня, используя его как прокси перед веб-сайтом BBC.

Billies-MBP-2:~ billie$ docker run -p 443:443 --name ssl-term -e  UPSTREAM=www.bbc.co.uk purplebooth/nginx-ssl-terminator

Чтобы получить эту работу, первое, что нам нужно сделать, это создать новую мостовую сеть для этих двух контейнеров для проживания. Причина, по которой мы делаем это, так это то, что путем создания нашей собственной сети Bridge является то, что в отличие от моста по умолчанию, Мы можем использовать DNS Чтобы разрешить IP-адрес любого контейнера в сети от имени контейнера, а не нужно знать.

Мы делаем это, запустив следующую команду

Billies-MBP-2:~ billie$ docker network create --driver=bridge flappy-public
f8bc98af79a3faed4cb54458d2338e19f0c3c2ed4034acc9491e4073c9e84e08

Теперь мы запускаем контейнеры в этой сети

Billies-MBP-2:~ billie$ docker run -d -p 80:80 --net=flappy-public --name=flappy quay.io/purplebooth/flappy-endpoint 
a9d505e98029441a0a65368f3017c70ec814bd1963d8b603fbf5d576c018ea18

Затем мы просто запустим прокси-контейнер с помощью Upstream Set для Flappy, в правильной сети

Billies-MBP-2:~ billie$ docker run -d -p 443:443 --net=flappy-public --name ssl-term -e  UPSTREAM=flappy purplebooth/nginx-ssl-terminator
b069624294b30636a4698d75dece0114ee3e47275fed6b12e6a352f7ee26ec1f

Если мы запустим эту команду, мы можем видеть, что сеть имеет две контейнеры, работающие внутри нее

Billies-MBP-2:~ billie$ docker network inspect flappy-public
[
  {
    "Name": "flappy-public",
    "Id": "f8bc98af79a3faed4cb54458d2338e19f0c3c2ed4034acc9491e4073c9e84e08",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
        {
          "Subnet": "172.18.0.0/16",
          "Gateway": "172.18.0.1/16"
        }
      ]
    },
    "Internal": false,
    "Containers": {
      "a9d505e98029441a0a65368f3017c70ec814bd1963d8b603fbf5d576c018ea18": {
        "Name": "flappy",
        "EndpointID": "df2815c8a4d1ba4197089a011d19005332af08dd6a6d1df2cb578bc29fe4ef90",
        "MacAddress": "02:42:ac:12:00:02",
        "IPv4Address": "172.18.0.2/16",
        "IPv6Address": ""
      },
        "b069624294b30636a4698d75dece0114ee3e47275fed6b12e6a352f7ee26ec1f": {
          "Name": "ssl-term",
          "EndpointID": "fd80b0acd0fc514bb02812452a44d64cc845b58e349a9ac99b9426ab0531a419",
          "MacAddress": "02:42:ac:12:00:03",
          "IPv4Address": "172.18.0.3/16",
          "IPv6Address": ""
        }
    },
    "Options": {},
    "Labels": {}
  }
]

И вот и все, у нас есть наши контейнеры разговаривают друг с другом.

И как волшебство это работает! IP-адрес контейнера разрешен DNS, и мы можем подключиться между двумя.

Использование сетей для повышения безопасности

Несколько контейнеров, разговаривающих в одной сети, в порядке. Однако, когда мы хотим, чтобы наши приложения были безопасными, нам нужно подумать о том, как мы контролируем данные и из нашего контейнера. В настоящее время любой контейнер в Plappy-Public Network может говорить с любым другим, поэтому их можно использовать в качестве точки прыжки, чтобы получить доступ к остальной части системы.

Чтобы минимизировать этот риск, мы собираемся дать Flappy Service, это собственная сеть, и поместите ее за шлюз, имеющие интерфейсы на обеих сетях, которые должны пройти все запросы. Этот шлюз будет подключен к сервису Terminator SSL и сделает соединение с самой плавной конечной точкой.

Теоретически мы могли бы использовать ворота для реализации брандмауэра приложения.

Показанные две сети, один с SSL-термином и шлюзом, один с Flappy и шлюз

Давайте начнем с создания новой сети.

Billies-MBP-2:~ billie$ docker network create flappy-private
6c95ab9c45b22c6657f8e31997be0314887f6a07537a944aaa10e73d22844e35

А также Убедитесь, что Flappy находится только в частной сети

Billies-MBP-2:~ billie$ docker network connect flappy-private flappy
Billies-MBP-2:~ billie$ docker network disconnect flappy-public flappy

Затем мы добавляем шлюз (мы просто повторно используем одно и то же изображение, что и для Terminator SSL для этого). Этот шлюз сидит как на публичных, так и на частных сетянах быть прикрепленным к обоим Отказ Это работает, давая контейнер два сетевых интерфейса.

Billies-MBP-2:~ billie$ docker run -d --net=flappy-public --name network-gate -e  UPSTREAM=flappy purplebooth/nginx-ssl-terminator && docker network connect flappy-private network-gate
92385800ab4f7c6e2ddb25de5a071309bb91acff3b415a25967798c17518f85c

Затем поменяйте Terminator SSL Terminator так, чтобы оно указывает на шлюз, а не на фланцевой точке (который сейчас не сможет подключиться).

Billies-MBP-2:~ billie$ docker stop ssl-term
ssl-term
Billies-MBP-2:~ billie$ docker rm ssl-term
ssl-term
Billies-MBP-2:~ billie$ docker run -d --net=flappy-public -p 443:443 --name ssl-term -e  UPSTREAM=network-gate purplebooth/nginx-ssl-terminator && docker network connect flappy-private ssl-term
b004ee1aa05d257854cb0a6a96e8ff19a10cb312df5eba1a7a9adb375a52274a

Та-Да!

Теперь мы все настроем, и Flappy Service изолирован на собственной сети и доступна только через шлюз. Посмотрите на то, что это выглядит, как докер.

Billies-MBP-2:~ billie$ docker network inspect flappy-public
[
  {
    "Name": "flappy-public",
    "Id": "eaf3f689e8bb7d0b6b0b9256bb7793029cb4107cdd18936f3cb1844887d9eca2",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
        {
          "Subnet": "172.19.0.0/16",
          "Gateway": "172.19.0.1/16"
        }
      ]
        },
        "Internal": false,
        "Containers": {
          "92385800ab4f7c6e2ddb25de5a071309bb91acff3b415a25967798c17518f85c": {
            "Name": "network-gate",
            "EndpointID": "9d1b24700d187de7c4196cbc16ee6b61c96358ba679d4576ce94d433ca0b8687",
            "MacAddress": "02:42:ac:13:00:02",
            "IPv4Address": "172.19.0.2/16",
            "IPv6Address": ""
          },
          "b004ee1aa05d257854cb0a6a96e8ff19a10cb312df5eba1a7a9adb375a52274a": {
            "Name": "ssl-term",
            "EndpointID": "9b196a7efad29414c24d3fe84a611a21746ee270d7fabef4b2c501e33c2a72d2",
            "MacAddress": "02:42:ac:13:00:03",
            "IPv4Address": "172.19.0.3/16",
            "IPv6Address": ""
          }
        },
        "Options": {},
        "Labels": {}
    }
]
Billies-MBP-2:~ billie$ docker network inspect flappy-private
[
  {
    "Name": "flappy-private",
    "Id": "6c95ab9c45b22c6657f8e31997be0314887f6a07537a944aaa10e73d22844e35",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
        {
          "Subnet": "172.18.0.0/16",
          "Gateway": "172.18.0.1/16"
        }
      ]
    },
    "Internal": false,
    "Containers": {
      "6af6e2c91aa13d7274f9ddff37b9cb41d28b63f70670b363e7d64c31cf3b2441": {
        "Name": "flappy",
        "EndpointID": "db41c9156420a6545c8b19a7ada7531ba5cfa77dd1872e1aae0fab712b24d38a",
        "MacAddress": "02:42:ac:12:00:02",
        "IPv4Address": "172.18.0.2/16",
        "IPv6Address": ""
      },
      "92385800ab4f7c6e2ddb25de5a071309bb91acff3b415a25967798c17518f85c": {
        "Name": "network-gate",
        "EndpointID": "d83d612bdde15bf38463534275d11e60ed313e1d422b86fb48590e4c2f513deb",
        "MacAddress": "02:42:ac:12:00:03",
        "IPv4Address": "172.18.0.3/16",
        "IPv6Address": ""
      }
    },
    "Options": {},
    "Labels": {}
  }
]

Вы заметите, что контейнер Gateway теперь находится в двух сетях.

Этот тип установки означает, что невозможно напрямую подключиться к Flachappy Service, и у вас есть возможности для добавления дополнительной безопасности здесь, а в некоторой степени изолируют ваш сервис от многих видов взлома атак.

Docker Networks — действительно мощный инструмент, однако это действительно только верхушка айсберга. Вы также можете создать Накладные сети Это может присоединиться к нескольким хостам докера вместе или даже напишите свои собственные сетевые драйверы.

Надеюсь, это имеет несколько демистифицированные соединительные контейнеры в Docker!

Оригинал: «https://www.codementor.io/@billiethompson/creating-and-linking-docker-containers-du107oagc»