Добавление IP-адреса для NGINX для компоновки докеров? [Дубликат]

string join(const vector<string> & v, const string & delimiter = ",") {
    string out;
    if (auto i = v.begin(), e = v.end(); i != e) {
        out += *i++;
        for (; i != e; ++i) out.append(delimiter).append(*i);
    }
    return out;
}

Несколько моментов:

  • вам не требуется дополнительное условие, чтобы избежать лишнего ограничивающего ограничителя
  • , убедитесь, что вы не сработали, когда вектор пуст
  • не создает кучу временных рядов (например, не делайте этого: x = x + d + y)
125
задан Vini.g.fer 1 July 2016 в 16:49
поделиться

8 ответов

Легко с версией Docker 1.10.1, build 9e83765.

Сначала вам нужно создать свою собственную докерную сеть (mynet123)

docker network create --subnet=172.18.0.0/16 mynet123

, чем просто запустить изображение (I В качестве примера возьмем ubuntu)

docker run --net mynet123 --ip 172.18.0.22 -it ubuntu bash

, затем в оболочке ubuntu

ip addr

Кроме того, вы можете использовать

  • --hostname, чтобы указать имя хоста
  • --add-host, чтобы добавить дополнительные записи в / etc / hosts

Документы (и почему вам нужно создать сеть) в https: / /docs.docker.com/engine/reference/commandline/network_create/

189
ответ дан cantSleepNow 16 August 2018 в 05:23
поделиться
  • 1
    Отличный ответ. Просто добавьте дополнительную информацию: blog.jessfraz.com/post/ips-for-all-the-things – Ole 27 May 2016 в 19:13
  • 2
    @cantSleepNow по какой-то причине мне нужно просто использовать мой собственный по умолчанию созданный мост br0, который создается в файле интерфейсов во время загрузки системы (поэтому он НЕ создан с использованием сети docker network create), не могли бы вы предложить мне, как я могу получить тот же эффект - -ip (получить фиксированный IP-адрес для контейнера) без создания моего моста с помощью докера? – Mohammed Noureldin 15 October 2016 в 10:14
  • 3
    @MohammedNoureldin Я не совсем понимаю - также звучит как новый вопрос, я думаю, вы должны спросить его как такового. – cantSleepNow 15 October 2016 в 10:33
  • 4
    @cantSleepNow Я имею в виду, что мне нужно исправить IP-адрес контейнера, хотя я НЕ использую пользовательский мост (поэтому параметр -ip не может быть использован), вы предлагаете какой-либо способ получить это? – Mohammed Noureldin 15 October 2016 в 12:05
  • 5
    @MohammedNoureldin Я не уверен. Как я уже сказал, разместите свой вопрос как вопрос, а не как комментарий - может быть, есть кто-то, кто знает ответ. – cantSleepNow 15 October 2016 в 12:56

Если вы хотите, чтобы ваш контейнер имел собственный виртуальный сетевой сокет (с его собственным MAC-адресом), iptables, затем используйте драйвер Macvlan. Это может быть необходимо для маршрутизации трафика на ваш / интернет-маршрутизатор.

https://docs.docker.com/engine/userguide/networking/get-started-macvlan

0
ответ дан FlappySocks 16 August 2018 в 05:23
поделиться

Вы можете получить доступ к службе других контейнеров по их имени (ping apache получит ip или curl http://apache для доступа к службе http). И это может быть альтернативой статического ip.

0
ответ дан Guisong He 16 August 2018 в 05:23
поделиться
  • 1
    В докерной версии 1.8 это работает напрямую. В новой версии вы должны напрямую связать эти контейнеры. – Guisong He 3 March 2016 в 10:59

Вы можете установить IP при его запуске.

docker run --cap-add=NET_ADMIN -dit imagename /bin/sh -c "/sbin/ip addr add 172.17.0.12 dev eth0; bash"

См. мой пример в https://github.com/RvdGijp/mariadb-10.1-galera

2
ответ дан HowRude 16 August 2018 в 05:23
поделиться
  • 1
    к сожалению, это добавляет еще один IP-адрес, если ранее был назначен IP-адрес в этом процессе, это приводит к наличию двух IP-адресов – davey 4 April 2018 в 04:46

Не прямой ответ, но он может помочь.

Я запускаю большинство моих докционированных сервисов, связанных с собственными статическими ips, используя следующий подход:

  1. Я создаю ip-псевдонимы для всех сервисов на хосте docker
  2. Затем я запускаю каждый сервис, перенаправляющий порты из этого ip в контейнер, поэтому каждая служба имеет собственный статический ip, который может использоваться внешними пользователями и другими контейнерами.

Образец:

docker run --name dns --restart=always -d -p 172.16.177.20:53:53/udp dns
docker run --name registry --restart=always -d -p 172.16.177.12:80:5000 registry
docker run --name cache --restart=always -d -p 172.16.177.13:80:3142 -v /data/cache:/var/cache/apt-cacher-ng cache
docker run --name mirror --restart=always -d -p 172.16.177.19:80:80 -v /data/mirror:/usr/share/nginx/html:ro mirror
...
18
ответ дан ISanych 16 August 2018 в 05:23
поделиться

Я наткнулся на эту проблему во время попытки докереза ​​ Avahi , которая должна быть осведомлена о том, что ее публичный IP функционирует должным образом. Назначение статического IP-адреса в контейнере сложно из-за отсутствия поддержки статического присвоения IP в Docker.

В этой статье описывается метод назначения статического IP-адреса к контейнеру на Debian :

  1. Служба докеров должна быть запущена с помощью DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false". Я предполагаю, что мост br0 уже настроен.
  2. Контейнер должен быть запущен с помощью --cap-add=NET_ADMIN --net=bridge
  3. Внутренний контейнер pre-up ip addr flush dev eth0 в /etc/network/interfaces может использоваться для отклонения назначенного IP-адреса Docker, как в следующем примере:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    pre-up ip addr flush dev eth0
    address 192.168.0.249
    netmask 255.255.255.0
    gateway 192.168.0.1
  1. Сценарий ввода контейнера должен начинаться с /etc/init.d/networking start. Кроме того, скрипт ввода должен редактировать или заполнять файл /etc/hosts, чтобы удалить ссылки на IP-адрес, назначенный Docker.
2
ответ дан Onlyjob 16 August 2018 в 05:23
поделиться

Для docker-compose вы можете использовать следующие docker-compose.yml

version: '2'
services:
  nginx:
    image: nginx
    container_name: nginx-container
    networks:
      static-network:
        ipv4_address: 172.20.128.2
networks:
  static-network:
    ipam:
      config:
        - subnet: 172.20.0.0/16
          #docker-compose v3+ do not use ip_range
          ip_range: 172.28.5.0/24

с хоста, с которым вы можете протестировать, используя:

docker-compose up -d
curl 172.20.128.2

Современный docker-compose будет автоматически создавать контейнеры с статический ip для вас.

Чтобы найти статические ips всех контейнеров в вашей docker-compose в одной строке, используйте:

for s in `docker-compose ps -q`; do echo ip of `docker inspect -f "{{.Name}}" $s` is `docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $s`; done

Если вы хотите автоматизировать, вы можете использовать что-то вроде этого пример gist

39
ответ дан zainengineer 16 August 2018 в 05:23
поделиться
  • 1
    Похоже, это будет работать только в docker-compose v2, v3. – Hoto 27 March 2018 в 17:04
  • 2
    При использовании docker-compose v3 + remove ip_range – Hoto 27 March 2018 в 17:12
  • 3
    Однако я не получаю ip_range. не покрывается ли подсеть? В любом случае, спасибо! Это фиксировало мой «я должен снова взглянуть на ip моего контейнера для монго» & quot; - выпуск – Ben 8 May 2018 в 14:36
  • 4
    есть ли способ указать ip-адрес в составе версии 3? – ealeon 9 May 2018 в 18:12
  • 5
    Решение работает отлично для меня без ip_range. Я использую версию: «3.4». – Mikhail Morfikov 12 May 2018 в 15:19
0
ответ дан Nils Zenker 29 October 2018 в 10:36
поделиться
Другие вопросы по тегам:

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