Назначить статический IP-адрес контейнера Docker

Теперь я пытаюсь назначить статический IP 172.17.0.1 при запуске контейнера Docker.

Я использую порт 2122 в качестве ssh-порта этого контейнера, чтобы позволить этому контейнеру прослушать порт 2122.

sudo docker run -i -t -p 2122:2122 ubuntu

Эта команда будет запускать контейнер Docker со случайным IP-адресом, например 172.17.0.5, но мне нужно назначить конкретный IP-адрес контейнеру.

Следующая оболочка script - это то, что я ссылаюсь на документацию Docker в расширенных сетевых настройках.

pid=$(sudo docker inspect -f '{{.State.Pid}}' <container_name> 2>/dev/null)
sudo rm -rf /var/run/netns/*
sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
sudo ip link add A type veth peer name B
sudo brctl addif docker0 A
sudo ip link set A up
sudo ip link set B netns $pid
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link delete eth0
sudo ip netns exec $pid ip link set dev B name eth0
sudo ip netns exec $pid ip link set eth0 address 12:34:56:78:9a:bc
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link set eth0 up
sudo ip netns exec $pid ip addr add 172.17.0.1/16 dev eth0
sudo ip netns exec $pid ip route add default via 172.17.42.1

Эта оболочка script назначит статический IP 172.17.0.1 и ссылку на мир. Но всякий раз, когда я пытаюсь передать ssh в этот контейнер из моего локального, это не сработало. Какая проблема, возможно, я встретил?

Ответ 1

Простая версия Docker версии 1.10.1, постройте 9e83765.

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

docker network create --subnet=172.18.0.0/16 mynet123

чем просто запустить изображение (я возьму 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/

Ответ 2

Для 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
          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

Ответ 3

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

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

  • Я создаю псевдонимы ip для всех сервисов на хосте docker.
  • Затем я запускаю каждую службу, перенаправляющую порты из этого 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
...

Ответ 4

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

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

  • Служба Docker должна начинаться с DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false". Я предполагаю, что мост br0 уже настроен.

  • Контейнер должен запускаться с --cap-add=NET_ADMIN --net=bridge

  • Внутренний контейнер 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. Ввод контейнера script должен начинаться с /etc/init.d/networking start. Кроме того, запись script должна редактировать или заполнять файл /etc/hosts, чтобы удалить ссылки на назначенный Docker IP-адрес.

Ответ 5

Вы можете установить 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

Ответ 6

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

Ответ 7

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

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