Статьи

Docker Bridge и оверлейная сеть с составной подстановкой переменных

Сеть Docker Multi-Host позволяет создавать виртуальные сети и присоединять к ним контейнеры, чтобы вы могли создать топологию сети, подходящую для вашего приложения. Мостовые сети могут быть созданы для одного хоста, а оверлейные сети могут быть созданы для нескольких хостов. Создание сетей для конкретных приложений обеспечивает полную изоляцию контейнеров.

Файл Docker Compose может быть нацелен на один хост и --x-networkingбудет создавать мостовую сеть, эксклюзивную для приложения. Если пример приложения предназначен для нескольких хостов, скажем, с использованием кластера Docker Swarm, то создается оверлейная сеть. Сеть с одним хостом и сеть с несколькими хостами предоставляют более подробную информацию о том, как это настроить.

Что если мост или оверлейная сеть уже существует, и вы хотите назначить это приложению, запущенному с помощью Docker Compose?

Docker Networking

В Docker 1.9 введена подстановка переменных, и мы можем использовать эту функцию для нацеливания приложения на предварительно созданную сеть.

Создать новую сеть Docker Bridge

  1. Создайте новую сеть:
    docker network create -d bridge mynet
    47d6225ffe56ddd1a8bc0d6abb0ffd8f8ac3eec2090ff243f8cd6f77c170751b=
  2. Список сетей:
    docker network ls
    NETWORK ID          NAME                DRIVER
    feb6e9567439        bridge              bridge              
    29563a59abe8        none                null                
    25ab737cd665        host                host                
    47d6225ffe56        mynet               bridge

    Docker создает три сети для каждого хоста автоматически: НАЗВАНИЕ СЕТИ НАЗНАЧЕНИЕ bridgeСеть по умолчанию, к которой подключаются контейнеры. Это docker0сеть во всех установках Docker. noneСетевой стек для hostконкретного контейнера Добавляет контейнер в сетевой стек хостов. Конфигурация сети идентична хосту. Кроме того, вы также видите mynetсеть, которая была только что создана.

  3. Проверьте вновь созданную сеть, используя docker network inspect mynet:
    [
        {
            "Name": "mynet",
            "Id": "47d6225ffe56ddd1a8bc0d6abb0ffd8f8ac3eec2090ff243f8cd6f77c170751b",
            "Scope": "local",
            "Driver": "bridge",
            "IPAM": {
                "Driver": "default",
                "Config": [
                    {}
                ]
            },
            "Containers": {},
            "Options": {}
        }
    ]

    Контейнеры пока не назначены.

Docker Составьте и сеть

  1. Эта новая сеть может быть использована для любого нового контейнера с помощью docker run --net=<NETWORK>команды. Этот блог покажет, как нацелить эту сеть на файл Compose:
    mycouchbase:
      container_name: "db"
      image: couchbase/server
      ports:
        - 8091:8091
        - 8092:8092 
        - 8093:8093 
        - 11210:11210
      net: ${NETWORK}
    mywildfly:
      image: arungupta/wildfly-admin
      environment:
        - COUCHBASE_URI=db
      ports:
        - 8080:8080
        - 9990:9990
      net: ${NETWORK}

    Обратите внимание, как netуказано здесь, чтобы использовать пользовательскую сеть. Этот файл Compose находится по адресу:  github.com/arun-gupta/docker-images/blob/master/wildfly-couchbase-javaee7-network/docker-compose.yml .

  2. Запустите приложение, используя нашу недавно созданную сеть, как:
    NETWORK=mynet docker-compose up -d
  3. Проверьте сеть еще раз:
    docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "47d6225ffe56ddd1a8bc0d6abb0ffd8f8ac3eec2090ff243f8cd6f77c170751b",
            "Scope": "local",
            "Driver": "bridge",
            "IPAM": {
                "Driver": "default",
                "Config": [
                    {}
                ]
            },
            "Containers": {
                "300bebe6c3e0350ebf9b9d3746eb3a7b49444e14c00314770627a9f101442639": {
                    "EndpointID": "82a3e2d7cd4f1bb03c9ef52bb6abf284942d7e9fcac89fe3700b0e0c4ed2654f",
                    "MacAddress": "02:42:ac:14:00:03",
                    "IPv4Address": "172.20.0.3/16",
                    "IPv6Address": ""
                },
                "4fdae4eb919f0934422513227fe541255557dd9e8b3317374685927e7f427249": {
                    "EndpointID": "937605d716d144b55288d70817d611da5fb0f87e3aedd6b5074fca07f82c3953",
                    "MacAddress": "02:42:ac:14:00:02",
                    "IPv4Address": "172.20.0.2/16",
                    "IPv6Address": ""
                }
            },
            "Options": {}
        }
    ]

    И теперь два контейнера назначены и этой сети.

  4. Проверьте идентификатор контейнера, используя docker ps:
    CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                                                                               NAMES
    300bebe6c3e0        couchbase/server          "/entrypoint.sh couch"   2 minutes ago       Up 2 minutes        0.0.0.0:8091-8093->8091-8093/tcp, 11207/tcp, 11211/tcp, 0.0.0.0:11210->11210/tcp, 18091-18092/tcp   db
    4fdae4eb919f        arungupta/wildfly-admin   "/opt/jboss/wildfly/b"   2 minutes ago       Up 2 minutes        0.0.0.0:8080->8080/tcp, 0.0.0.0:9990->9990/tcp                                                      wildflycouchbasejavaee7network_mywildfly_1
  5. Проверьте сеть на наличие одного контейнера:
    docker inspect -f '{{ .HostConfig.NetworkMode }}' 300
    mynet
  6. Подробнее о сети:
    docker inspect -f '{{ .NetworkSettings.Networks.mynet }}' 300
    {82a3e2d7cd4f1bb03c9ef52bb6abf284942d7e9fcac89fe3700b0e0c4ed2654f 172.20.0.1 172.20.0.3 16   0 02:42:ac:14:00:03}
  7. Более подробную информацию о контейнере можно найти с помощью docker inspectсоответствующей части:
    "Networks": {
        "mynet": {
            "EndpointID": "82a3e2d7cd4f1bb03c9ef52bb6abf284942d7e9fcac89fe3700b0e0c4ed2654f",
            "Gateway": "172.20.0.1",
            "IPAddress": "172.20.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "MacAddress": "02:42:ac:14:00:03"
        }
    }

Создать новую сеть наложения Docker

Создание новой оверлейной сети Docker требует настройки службы ключ / значение и кластера Docker Swarm. Блог с несколькими хостами и несколькими контейнерами предоставляет более подробную информацию об этом.