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;
}
Несколько моментов:
Легко с версией 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/
Если вы хотите, чтобы ваш контейнер имел собственный виртуальный сетевой сокет (с его собственным MAC-адресом), iptables, затем используйте драйвер Macvlan. Это может быть необходимо для маршрутизации трафика на ваш / интернет-маршрутизатор.
https://docs.docker.com/engine/userguide/networking/get-started-macvlan
Вы можете получить доступ к службе других контейнеров по их имени (ping apache
получит ip или curl http://apache
для доступа к службе http). И это может быть альтернативой статического ip.
Вы можете установить 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
Не прямой ответ, но он может помочь.
Я запускаю большинство моих докционированных сервисов, связанных с собственными статическими ips, используя следующий подход:
Образец:
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
...
Я наткнулся на эту проблему во время попытки докереза Avahi , которая должна быть осведомлена о том, что ее публичный IP функционирует должным образом. Назначение статического IP-адреса в контейнере сложно из-за отсутствия поддержки статического присвоения IP в Docker.
В этой статье описывается метод назначения статического IP-адреса к контейнеру на Debian :
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
/etc/init.d/networking start
. Кроме того, скрипт ввода должен редактировать или заполнять файл /etc/hosts
, чтобы удалить ссылки на IP-адрес, назначенный Docker. Для 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
ip_range
. Я использую версию: «3.4».
– Mikhail Morfikov
12 May 2018 в 15:19