#!/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
Comments