Więc mam Nginx działający w kontenerze dokującym, mam mysql działający na localhost, chcę połączyć się z MySql z poziomu mojego Nginx. MySql działa na localhost i nie ujawnia portu światowi zewnętrznemu, więc jest powiązany z localhost, nie jest powiązany z adresem IP komputera.
Czy jest jakiś sposób na połączenie się z tym MySql lub innym programem na localhost z tego kontenera dokowanego?
To pytanie różni się od „Jak uzyskać adres IP hosta dokera z wnętrza kontenera dokera” ze względu na fakt, że adres IP hosta dokera może być publicznym adresem IP lub prywatnym adresem IP w sieci, który może lub może niedostępne z poziomu kontenera dokera (mam na myśli publiczny adres IP, jeśli jest hostowany w AWS lub coś takiego). Nawet jeśli masz adres IP hosta dokera, nie oznacza to, że możesz połączyć się z hostem dokera z poziomu kontenera, biorąc pod uwagę ten adres IP, ponieważ Twoja sieć Docker może być nakładką, hostem, mostem, macvlanem, brak itp., Co ogranicza dostępność ten adres IP.
network: host
ciebie nie możesz wrócić z kontenera do hosta. Tylko host do kontenera. To jest główna ideologia stojąca za pojemnikami. Są izolowane zarówno ze względu na stabilność, jak i bezpieczeństwo.Odpowiedzi:
Edycja: Jeśli używasz Docker-for-mac lub Docker-for-Windows 18.03+, po prostu połącz się z usługą mysql za pomocą hosta
host.docker.internal
(zamiast127.0.0.1
w ciągu połączenia).Począwszy od Docker 18.09.3, nie działa to w Docker-for-Linux. Fix został złożony w dniu 8 marca 2019 i mam nadzieję, że zostaną połączone z bazą kodu. Do tego czasu obejściem problemu jest użycie kontenera zgodnie z opisem w odpowiedzi qoomon .
2020-01: poczyniono pewne postępy . Jeśli wszystko pójdzie dobrze, powinno to wylądować w Docker 20.04
TLDR
Użyj
--network="host"
w swoimdocker run
poleceniu, a następnie127.0.0.1
w kontenerze dokera wskaże hosta dokera.Uwaga: Ten tryb działa tylko w systemie Docker dla systemu Linux, zgodnie z dokumentacją .
Uwaga na temat trybów pracy sieci kontenerów dokujących
Docker oferuje różne tryby sieci podczas uruchamiania kontenerów. W zależności od wybranego trybu połączenie z bazą danych MySQL działającą na hoście dokera będzie różne.
Uruchom okno dokowane --network = „most” (domyślnie)
Docker tworzy
docker0
domyślnie nazwany most . Zarówno host dokera, jak i kontenery dokują mają adres IP na tym moście.na hoście Docker wpisz
sudo ip addr show docker0
wynik wyglądający następująco:Więc tutaj mój host dokera ma adres IP
172.17.42.1
wdocker0
interfejsie sieciowym.Teraz uruchom nowy kontener i uzyskaj na nim powłokę:
docker run --rm -it ubuntu:trusty bash
i w obrębie typu kontenera,ip addr show eth0
aby dowiedzieć się, jak jest skonfigurowany jego główny interfejs sieciowy:Tutaj mój kontener ma adres IP
172.17.1.192
. Teraz spójrz na tabelę routingu:Dlatego adres IP hosta dokera
172.17.42.1
jest ustawiony jako domyślna trasa i jest dostępny z kontenera.Uruchom okno dokowane --network = "host"
Alternatywnie możesz uruchomić kontener dokerów z ustawieniami sieci ustawionymi na
host
. Taki kontener będzie dzielić stos sieciowy z hostem dokera iz punktu widzenia konteneralocalhost
(lub127.0.0.1
) będzie odnosił się do hosta dokera.Należy pamiętać, że każdy port otwarty w kontenerze dokera zostanie otwarty na hoście dokera. I to bez wymagania opcji
-p
lub-P
docker run
.Konfiguracja IP na moim hoście dokera:
oraz z kontenera dokowanego w trybie hosta :
Jak widać, zarówno host dokera, jak i kontener dokerów mają ten sam interfejs sieciowy i jako taki mają ten sam adres IP.
Łączenie się z MySQL z kontenerów
tryb pomostowy
Aby uzyskać dostęp do MySQL uruchomionego na hoście dokera z kontenerów w trybie mostu , musisz upewnić się, że usługa MySQL nasłuchuje połączeń na
172.17.42.1
adresie IP.Aby to zrobić, upewnij się, że masz albo
bind-address = 172.17.42.1
czybind-address = 0.0.0.0
w pliku konfiguracyjnym MySQL (my.cnf).Jeśli musisz ustawić zmienną środowiskową z adresem IP bramy, możesz uruchomić następujący kod w kontenerze:
następnie w aplikacji użyj
DOCKER_HOST_IP
zmiennej środowiskowej, aby otworzyć połączenie z MySQL.Uwaga: jeśli używasz
bind-address = 0.0.0.0
serwera MySQL, nasłuchuje połączeń na wszystkich interfejsach sieciowych. Oznacza to, że do twojego serwera MySQL można uzyskać dostęp z Internetu; upewnij się, że odpowiednio skonfigurowałeś reguły zapory.Uwaga 2: jeśli korzystasz
bind-address = 172.17.42.1
z serwera MySQL, nie będziesz nasłuchiwał nawiązywania połączeń127.0.0.1
. Procesy uruchomione na hoście dokera, które chciałyby połączyć się z MySQL, musiałyby korzystać z172.17.42.1
adresu IP.tryb hosta
Aby uzyskać dostęp do MySQL uruchomionego na hoście dokera z kontenerów w trybie hosta , możesz zachować
bind-address = 127.0.0.1
konfigurację MySQL, a wszystko, co musisz zrobić, to połączyć się127.0.0.1
z kontenerów:Uwaga: używaj
mysql -h 127.0.0.1
i niemysql -h localhost
; w przeciwnym razie klient MySQL próbowałby połączyć się przy użyciu gniazda unix.źródło
telnet 172.17.0.1 3306
-v /var/run/mysqld/mysqld.sock:/tmp/mysql.sock
ten sposób.Dla macOS i Windows
Docker przeciwko 18.03 i nowszym (od 21 marca 2018)
Użyj wewnętrznego adresu IP lub połącz się ze specjalną nazwą DNS,
host.docker.internal
która rozwiąże z wewnętrznym adresem IP używanym przez hosta.Wsparcie dla systemu Linux w oczekiwaniu na https://github.com/docker/for-linux/issues/264
MacOS z wcześniejszymi wersjami Dockera
Docker dla komputerów Mac w wersji od 17.12 do 18.02
To samo co powyżej, ale użyj
docker.for.mac.host.internal
zamiast tego.Docker dla komputerów Mac w wersji 17.06 do wersji 17.11
To samo co powyżej, ale użyj
docker.for.mac.localhost
zamiast tego.Docker na komputery Mac 17.05 i starsze
Aby uzyskać dostęp do komputera hosta z kontenera dokowanego, musisz dołączyć alias IP do interfejsu sieciowego. Możesz powiązać dowolny adres IP, po prostu upewnij się, że nie używasz go do niczego innego.
sudo ifconfig lo0 alias 123.123.123.123/24
Następnie upewnij się, że Twój serwer nasłuchuje adresu IP wspomnianego powyżej lub
0.0.0.0
. Jeśli nasłuchuje na localhost127.0.0.1
, nie zaakceptuje połączenia.Następnie po prostu skieruj kontener dokujący na ten adres IP, aby uzyskać dostęp do komputera hosta!
Aby przetestować, możesz uruchomić coś takiego jak
curl -X GET 123.123.123.123:3000
wewnątrz kontenera.Alias zostanie zresetowany przy każdym ponownym uruchomieniu, więc w razie potrzeby utwórz skrypt startowy.
Rozwiązanie i więcej dokumentacji tutaj: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
źródło
mysql -uroot -hdocker.for.mac.localhost
docker run -e HOSTNAME= docker.for.mac.host.internal
, kontener jest tworzony, ale nic się nie dzieje. Muszę wtedy crtl + C. Z--net=host -e HOSTNAME=localhost
co najmniej tras kontenerowych i narzeka, że nie może znaleźć muszę usług (MySQL db).Robię włamanie podobne do powyższych postów, aby lokalny adres IP zmapować na nazwę aliasu (DNS) w kontenerze. Głównym problemem jest dynamiczne uzyskanie prostego skryptu, który działa zarówno w systemie Linux, jak i OSX na adresie IP hosta . Zrobiłem ten skrypt, który działa w obu środowiskach (nawet w dystrybucji Linuksa ze
"$LANG" != "en_*"
skonfigurowanym):Tak więc przy użyciu Docker Compose pełna konfiguracja będzie:
Skrypt startowy (docker-run.sh) :
docker-compose.yml :
Następnie zmień na
http://localhost
nahttp://dockerhost
w swoim kodzie.Bardziej zaawansowany przewodnik na temat dostosowywania
DOCKERHOST
skryptu znajduje się w tym poście z wyjaśnieniem, jak działa.źródło
DOCKERHOST
wartości zamiast „localhost” lub 0.0.0.0 w dowolnej usłudze, z którą kontener dokerów musi się połączyć lokalnie.export DOCKERHOST=$(docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' <NETWORK-NAME> | awk -F "/" 'NR==1{print $1}')
gdzie <NAZWA SIECI> może być mostem lub nazwą sieci zdefiniowaną przez docker-compose (zwykle nazwa-ścieżki - nazwa_sieci ).dockerhost
jako hosta dla połączenia db (zwykle zamień nalocalhost
w plik konfiguracyjny).To działało dla mnie na stosie NGINX / PHP-FPM bez dotykania żadnego kodu ani sieci, do których aplikacja spodziewa się, że będzie mogła się połączyć
localhost
Zamontuj
mysqld.sock
od hosta do wnętrza kontenera.Znajdź lokalizację pliku mysql.sock na hoście, na którym działa mysql:
netstat -ln | awk '/mysql(.*)?\.sock/ { print $9 }'
Zamontuj ten plik w odpowiednim miejscu w oknie dokowanym:
docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock
Możliwe lokalizacje mysqld.sock:
źródło
Dopóki
host.docker.internal
nie działa na każdej platformie, możesz użyć mojego kontenera działającego jako brama NAT bez ręcznej konfiguracji:https://github.com/qoomon/docker-host
źródło
Rozwiązanie dla systemu Linux (jądro> = 3,6).
Ok, twój serwer lokalny ma domyślny interfejs dokera0 z adresem IP 172.17.0.1 . Twój kontener zaczął od domyślnych ustawień sieciowych --net = "bridge" .
$ sysctl -w net.ipv4.conf.docker0.route_localnet=1
$ iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
$ iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
Z dokumentacji jądra :
źródło
Rozwiązanie dla systemu Windows 10
Docker Community Edition 17.06.0-ce-win18 2017-06-28 (stabilny)
Możesz użyć nazwy DNS hosta
docker.for.win.localhost
, aby rozwiązać do wewnętrznego adresu IP. (Ostrzeżenie o niektórych źródłach wymienionych,windows
ale powinno byćwin
)Omówienie
Musiałem zrobić coś podobnego, to znaczy połączyć się z mojego kontenera Docker z moim hostem lokalnym, na którym działało
Azure Storage Emulator
iCosmosDB Emulator
.Azure Storage Emulator
Domyślnie nasłuchuje na 127.0.0.1 , podczas gdy można zmienić IP jego oprawioną też szukałem rozwiązania, które będzie pracować z ustawieniami domyślnymi.Działa to również w przypadku łączenia z mojego kontenera Docker do
SQL Server
iIIS
, oba działają lokalnie na moim hoście z domyślnymi ustawieniami portów.źródło
Bardzo proste i szybkie, sprawdź adres IP hosta za pomocą ifconfig (linux) lub ipconfig (Windows), a następnie utwórz
docker-compose.yml
W ten sposób Twój kontener będzie mógł uzyskać dostęp do Twojego hosta. Podczas uzyskiwania dostępu do bazy danych pamiętaj, aby użyć nazwy podanej wcześniej, w tym przypadku „dockerhost” i portu hosta, na którym działa baza danych
źródło
Żadna z odpowiedzi nie działała dla mnie podczas korzystania z Docker Toolbox w systemie Windows 10 Home, ale 10.0.2.2 tak, ponieważ używa VirtualBox, który udostępnia hosta maszynie wirtualnej pod tym adresem.
źródło
Ethernet adapter vEthernet (DockerNAT)
W przypadku systemu Windows, zakładając, że używasz sterownika sieciowego mostu, powinieneś w szczególności powiązać MySQL z adresem IP interfejsu sieciowego hyper-v.
Odbywa się to poprzez plik konfiguracyjny w normalnie ukrytym folderze C: \ ProgramData \ MySQL.
Powiązanie z 0.0.0.0 nie będzie działać. Potrzebny adres jest również wyświetlany w konfiguracji dokera, aw moim przypadku był to 10.0.75.1.
źródło
Edycja: Skończyłem prototypowanie koncepcji na GitHub. Sprawdź: https://github.com/sivabudh/system-in-a-box
Po pierwsze, moja odpowiedź jest skierowana do 2 grup ludzi: tych, którzy używają komputera Mac i tych, którzy używają Linuksa.
Gospodarz tryb sieciowy nie działa na Macu. Musisz użyć aliasu IP, patrz: https://stackoverflow.com/a/43541681/2713729
Co to jest tryb sieci hosta? Zobacz: https://docs.docker.com/engine/reference/run/#/network-settings
Po drugie, dla tych z was, którzy używają Linuksa (moje bezpośrednie doświadczenie dotyczyło Ubuntu 14.04 LTS, a ja wkrótce aktualizuję do wersji 16.04 LTS w produkcji), tak , można sprawić, aby usługa działająca w kontenerze Docker łączyła się z
localhost
usługami działającymi na Host dokera (np. Laptop).W jaki sposób?
Kluczem jest to, że kiedy uruchomisz kontener Docker, musisz go uruchomić w trybie hosta . Polecenie wygląda następująco:
docker run --network="host" -id <Docker image ID>
Kiedy zrobisz
ifconfig
(musisz miećapt-get install net-tools
swój kontener,ifconfig
aby można go było wywołać) wewnątrz swojego kontenera, zobaczysz, że interfejsy sieciowe są takie same jak na hoście Docker (np. Twój laptop).Ważne jest, aby pamiętać, że jestem użytkownikiem Maca, ale uruchamiam Ubuntu pod Parallels, więc korzystanie z Maca nie jest wadą. ;-)
I w ten sposób łączysz kontener NGINX z MySQL działającym na
localhost
.źródło
--network="host"
jaki sposób można znaleźć się w kontenerze z mysql hosta?localhost
. Sprawdź mój kod źródłowy GitHub: github.com/sivabudh/system-in-a-box/blob/master/dj_host_docker/… . Wyszukaj'HOST'
, zobaczysz 127.0.0.1, aby połączyć się z Postgresql.Najprostsze rozwiązanie dla Mac OSX
Wystarczy użyć adresu IP komputera Mac. Na komputerze Mac uruchom to, aby uzyskać adres IP i użyć go z kontenera:
Tak długo, jak serwer działający lokalnie na komputerze Mac lub w innym kontenerze dokera będzie nasłuchiwał wersji 0.0.0.0, kontener dokera będzie mógł dotrzeć do tego adresu.
Jeśli chcesz uzyskać dostęp do innego kontenera dokera, który nasłuchuje w wersji 0.0.0.0, możesz użyć 172.17.0.1
źródło
docker.for.mac.host.internal
teraz nazwę hosta.To nie jest odpowiedź na rzeczywiste pytanie. W ten sposób rozwiązałem podobny problem. Rozwiązanie pochodzi całkowicie z: Zdefiniuj Docker Container Networking, aby kontenery mogły się komunikować . Dzięki Nic Raboy
Pozostawiając to tutaj innym, którzy mogą chcieć wykonywać połączenia REST między jednym kontenerem a drugim. Odpowiada na pytanie: czego używać zamiast localhost w środowisku dokera?
Zobacz, jak wygląda Twoja sieć
docker network ls
Utwórz nową sieć
docker network create -d my-net
Uruchom pierwszy pojemnik
docker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>
Sprawdź ustawienia sieciowe dla pierwszego kontenera
docker inspect first_container
. „Sieci”: powinny mieć „my-net”Uruchom drugi pojemnik
docker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>
Sprawdź ustawienia sieciowe dla drugiego kontenera
docker inspect second_container
. „Sieci”: powinny mieć „my-net”ssh do drugiego pojemnika
docker exec -it second_container sh
lubdocker exec -it second_container bash
.Wewnątrz drugiego kontenera możesz pingować pierwszy kontener
ping first_container
. Ponadto wywołania kodu, takie jak,http://localhost:5000
mogą zostać zastąpione przezhttp://first_container:5000
źródło
Dla Windowsa,
Zmieniłem adres URL bazy danych w konfiguracji wiosennej:
spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/apidb
Następnie zbuduj obraz i uruchom. To zadziałało dla mnie.
źródło
Nie zgadzam się z odpowiedzią Thomasleveil.
Utworzenie mysql powiązania z 172.17.42.1 uniemożliwi innym programom korzystanie z bazy danych na hoście, aby do niej dotrzeć. Działa to tylko wtedy, gdy wszyscy użytkownicy bazy danych są zadokowani.
Zmuszenie mysql do powiązania z 0.0.0.0 spowoduje otwarcie bazy danych na świat zewnętrzny, co jest nie tylko bardzo złym posunięciem, ale także sprzeczne z tym, co autor chce zrobić z oryginalnym pytaniem. Mówi wprost: „MySql działa na localhost i nie udostępnia portu zewnętrznemu światu, więc jest związany z localhost”
Aby odpowiedzieć na komentarz od Ivant
To jest niemożliwe. Dokumentacja mysql / mariadb wyraźnie stwierdza, że nie można powiązać kilku interfejsów. Można powiązać tylko 0, 1 lub wszystkie interfejsy.
Podsumowując, NIE znalazłem żadnego sposobu na uzyskanie dostępu do bazy danych (tylko localhost) na hoście z kontenera dokującego. To zdecydowanie wydaje się być bardzo powszechnym wzorcem, ale nie wiem, jak to zrobić.
źródło
172.17.42.1
adresu. Ale twoja notatka ma rację inaczej. Również zredagowałem swoją odpowiedź whost
trybie sieciowym, który pozwala utrzymać serwer MySQL związany,127.0.0.1
a kontenery mogą się z nim połączyć0.0.0.0
a następnie skonfigurowania zapory ogniowej, aby db nie był dostępny z Internetu.Oto moje rozwiązanie: działa w moim przypadku
ustaw lokalny serwer mysql na publiczny dostęp przez komentarz
#bind-address = 127.0.0.1
w /etc/mysql/mysql.conf.dzrestartuj serwer mysql
sudo /etc/init.d/mysql restart
uruchom następujące polecenie, aby otworzyć dostęp użytkownika root do dowolnego hosta
mysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;
utwórz skrypt sh: run_docker.sh
uruchomić z dokerem-kompozytorem
źródło
Przychodzi na myśl kilka rozwiązań:
Powodem, dla którego to nie działa od razu jest fakt, że kontenery domyślnie działają z własną siecią nazw. Oznacza to, że localhost (lub 127.0.0.1 wskazujący na interfejs pętli zwrotnej) jest unikalny dla każdego kontenera. Łączenie się z tym spowoduje połączenie z samym kontenerem, a nie z usługami działającymi poza dokerem lub wewnątrz innego kontenera dokera.
Opcja 1 : Jeśli twoją zależność można przenieść do kontenera, zrobiłbym to pierwszy. Dzięki temu stos aplikacji jest przenośny, ponieważ inni próbują uruchomić Twój kontener we własnym środowisku. Nadal możesz opublikować port na hoście, na którym inne usługi, które nie zostały zmigrowane, nadal mogą do niego dotrzeć. Możesz nawet opublikować port w interfejsie localhost na hoście dokera, aby uniknąć jego zewnętrznego dostępu ze składnią typu:
-p 127.0.0.1:3306:3306
dla opublikowanego portu.Opcja 2 : Istnieje wiele sposobów wykrywania adresu IP hosta z wnętrza kontenera, ale każdy z nich ma ograniczoną liczbę scenariuszy, w których działają (np. Wymagające Docker dla komputerów Mac). Najbardziej przenośną opcją jest wstrzyknięcie adresu IP hosta do kontenera za pomocą zmiennej środowiskowej lub pliku konfiguracyjnego, np .:
Wymaga to, aby Twoja usługa nasłuchiwała na tym zewnętrznym interfejsie, co może stanowić zagrożenie bezpieczeństwa. Inne metody uzyskania adresu IP hosta z wnętrza kontenera znajdują się w tym poście .
Opcja 3 : Praca bez izolacji sieci, tj. Praca z
--net host
, oznacza, że aplikacja działa w sieciowej przestrzeni nazw hosta. Jest to mniej izolacja dla kontenera i oznacza, że nie można uzyskać dostępu do innych kontenerów za pośrednictwem wspólnej sieci dokerów z DNS (zamiast tego należy użyć opublikowanych portów, aby uzyskać dostęp do innych aplikacji w kontenerach). Ale w przypadku aplikacji, które muszą uzyskać dostęp do innych usług na hoście, które nasłuchują tylko127.0.0.1
na hoście, może to być najłatwiejsza opcja.Opcja 4 : Różne usługi umożliwiają również dostęp przez gniazdo oparte na systemie plików. To gniazdo można zamontować w kontenerze jako wolumin zamontowany na powiązaniu, co umożliwia dostęp do usługi hosta bez konieczności łączenia się z siecią. Aby uzyskać dostęp do mechanizmu dokowania, często można zobaczyć przykłady montażu
/var/run/docker.sock
w kontenerze (dające dostęp rootowi kontenera do hosta). Za pomocą mysql możesz spróbować czegoś takiego,-v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sock
a następnie połączyć się, zlocalhost
którym mysql konwertuje na używanie gniazda.źródło
Możesz uzyskać adres IP hosta za pomocą obrazu alpejskiego
Byłoby to bardziej spójne, ponieważ zawsze używasz alpine do uruchomienia polecenia.
Podobnie do odpowiedzi Mariano, możesz użyć tego samego polecenia, aby ustawić zmienną środowiskową
źródło
W systemie Linux, w którym nie można zmienić interfejsu, z którym łączy się usługa localhost
Są dwa problemy, które musimy rozwiązać
Pierwszy problem można rozwiązać za pomocą obrazu dokera -hosta qoomon , podanego w innych odpowiedziach.
Będziesz musiał dodać ten kontener do tej samej sieci mostowej, co drugi kontener, aby uzyskać do niego dostęp. Otwórz terminal w kontenerze i upewnij się, że możesz pingować
dockerhost
.Teraz trudniejszy problem, dzięki któremu usługa jest dostępna dla dokerów.
Możemy użyć telnetu, aby sprawdzić, czy możemy uzyskać dostęp do portu na hoście (być może trzeba go zainstalować).
Problem polega na tym, że nasz kontener będzie mógł uzyskać dostęp tylko do usług wiążących się ze wszystkimi interfejsami, takimi jak SSH:
Ale usługi powiązane tylko z hostem lokalnym będą niedostępne:
Właściwym rozwiązaniem byłoby tutaj powiązanie usługi z siecią mostów dokerów. Jednak ta odpowiedź zakłada, że nie można tego zmienić. Więc zamiast tego użyjemy
iptables
.Najpierw musimy znaleźć nazwę sieci mostów, z którą korzysta doker
ifconfig
. Jeśli używasz nienazwanego mostu, tak właśnie będziedocker0
. Jeśli jednak używasz nazwanej sieci, będziesz mieć most zaczynający się odbr-
tego dokera. Mój jestbr-5cd80298d6f4
.Po uzyskaniu nazwy tego mostu musimy zezwolić na routing z tego mostu do hosta lokalnego. Jest to domyślnie wyłączone ze względów bezpieczeństwa:
Teraz skonfiguruj naszą
iptables
regułę. Ponieważ nasz kontener ma dostęp tylko do portów w sieci mostu dokującego, będziemy udawać, że nasza usługa jest faktycznie związana z portem w tej sieci.W tym celu przekażemy wszystkie prośby
<docker_bridge>:port
dolocalhost:port
Na przykład dla mojej usługi na porcie 1025
Powinieneś teraz mieć dostęp do swojej usługi z kontenera:
źródło
sysctl -w net.ipv4.conf.docker0.route_localnet=1
iiptables -t nat -A PREROUTING -p tcp -i docker0 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025
Musisz znać bramę ! Moim rozwiązaniem z lokalnym serwerem było ujawnienie go poniżej
0.0.0.0:8000
, a następnie uruchomienie dokera z podsiecią i uruchomienie kontenera w następujący sposób :Teraz możesz uzyskać dostęp do pętli zwrotnej za pośrednictwem
http://172.35.0.1:8000
źródło
Grupy C i przestrzenie nazw odgrywają główną rolę w ekosystemie kontenerowym.
Przestrzeń nazw zapewnia warstwę izolacji. Każdy kontener działa w osobnej przestrzeni nazw, a jego dostęp jest ograniczony do tej przestrzeni nazw. Grupy C kontrolują wykorzystanie zasobów każdego kontenera, podczas gdy Przestrzeń nazw kontroluje to, co proces może zobaczyć i uzyskać dostęp do odpowiedniego zasobu.
Oto podstawowe zrozumienie podejścia, które możesz zastosować,
Użyj sieciowej przestrzeni nazw
Kiedy kontener odradza się z obrazu, interfejs sieciowy jest definiowany i tworzony. To daje kontenerowi unikalny adres IP i interfejs.
Zmieniając przestrzeń nazw na host, sieci cotainers nie pozostają odizolowane od swojego interfejsu, proces będzie miał dostęp do interfejsu sieciowego maszyn hosta.
Jeśli proces nasłuchuje na portach, zostaną one nasłuchane na interfejsie hosta i zmapowane do kontenera.
Użyj przestrzeni nazw PID Zmieniając przestrzeń nazw PID, umożliwia kontenerowi interakcję z innym procesem poza jego normalnym zakresem.
Ten kontener będzie działał we własnej przestrzeni nazw.
Zmieniając przestrzeń nazw na host, kontener może również zobaczyć wszystkie inne procesy uruchomione w systemie.
Udostępnianie przestrzeni nazw
Jest to zła praktyka, aby to zrobić w produkcji, ponieważ wychodzisz z modelu zabezpieczeń kontenera, który może otworzyć się na luki i łatwy dostęp do podsłuchu. Służy to wyłącznie do debugowania narzędzi i niedopuszczania luk w zabezpieczeniach kontenerów.
Pierwszy kontener to serwer nginx. Spowoduje to utworzenie nowej sieci i przestrzeni nazw procesów. Ten kontener połączy się z portem 80 nowo utworzonego interfejsu sieciowego.
Kolejny kontener może teraz ponownie wykorzystać tę przestrzeń nazw,
Ponadto ten kontener może zobaczyć interfejs z procesami we wspólnym kontenerze.
Umożliwi to przyznanie większej liczby uprawnień kontenerom bez zmiany lub ponownego uruchomienia aplikacji. W podobny sposób możesz połączyć się z mysql na hoście, uruchomić i debugować aplikację. Ale nie zaleca się, aby przejść tą drogą. Mam nadzieję, że to pomoże.
źródło
Spróbuj tego:
Aby uzyskać
192.168.1.202
, używaifconfig
To zadziałało dla mnie. Mam nadzieję, że to pomoże!
źródło
W przypadku komputera z systemem Windows: -
Uruchom poniższe polecenie, aby ujawnić losowo port dokera podczas kompilacji
Na powyższej liście kontenerów widać port przypisany jako 32768. Spróbuj uzyskać dostęp
Możesz zobaczyć stronę mediawiki
źródło
Dopóki poprawka nie zostanie scalona z
master
gałęzią, aby uzyskać adres IP hosta, wystarczy uruchomić z wnętrza kontenera:(zgodnie z sugestią @Mahoney tutaj ).
źródło
Rozwiązałem to, tworząc użytkownika w MySQL dla adresu IP kontenera:
Następnie na pojemniku:
jdbc:mysql://<b>172.17.0.1</b>:3306/database_name
źródło
W ten sposób przekazuję adres IP hosta jako zmienną środowiskową do kontenera. Kontener następnie uzyskuje dostęp do hosta za pomocą tej zmiennej.
źródło