Автор оригинала: 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 с помощью сертификатов самообслуживания.
Это выглядит так, когда мы закончим.
Здесь вы можете увидеть меня, используя его как прокси перед веб-сайтом 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 и сделает соединение с самой плавной конечной точкой.
Теоретически мы могли бы использовать ворота для реализации брандмауэра приложения.
Давайте начнем с создания новой сети.
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»