#!/bin/bash set -x set -u set -e set -o pipefail # ustawiamy sobie kilka zmiennych ETH_INT=$(ip route | grep ^default | cut -d ' ' -f 5) # z wyniku polecenia `ip route` pobieramy wiersz # zaczynający się od `default` następnie robimy # string split z separatorem na "spację" i wyciągamy piąty element # - w tym przypadku nazwę interfejsu sieciowego IP_GW=$(ip route | grep ^default | cut -d ' ' -f 3) # jak wyżej, tylko, że zamiast piątego elementu, # bierzemy trzeci - czyli adres IP przypisany do interfejsu IP_BASE=${IP_GW%.*} # bash env substract - wycinamy ostatni człon po kropce, # np. dla 192.168.0.10 w zmiennej zostanie tylko 192.168.0 # tworzymy nowy wirtualny mostek sieciowy "bridge2" linkujący do naszego głównego interfejsu sieciowego sudo ip link add bridge2 link ${ETH_INT} type macvlan mode bridge # podnosimy wirtualny interface sudo ip link set bridge2 up # przypisujemy adres IP z maską do interfejsu sudo ip addr add ${IP_BASE}.192/29 dev bridge2 # tworzymy sieć dockerową z driverem macvlan i odpowiednimi ustawieniami sieci docker network create -d macvlan -o parent=${ETH_INT} --gateway ${IP_GW} --subnet ${IP_BASE}.0/24 --ip-range ${IP_BASE}.198/30 bridge2 # uruchamiamy kontener nginx w nowej sieci docker run --rm --name nginx -itd --network bridge2 nginx:alpine # sprawdzamy, czy możemy pobrać zawartość `/` z nginx odpytując go po adresie z puli subnetu hosta curl ${IP_BASE}.196 # docker kill nginx # docker network rm bridge2 # sudo ip link delete bridge2