Jak podłączyć się z wnętrza kontenera dokującego do lokalnego hosta maszyny?
Więc mam Nginx uruchomiony wewnątrz kontenera docker, mam mysql uruchomiony na localhost, chcę połączyć się z MySql z mojego Nginx. MySql jest uruchomiony na localhost i nie wystawia portu na świat zewnętrzny, więc jest związany z localhost, a nie związany z adresem ip maszyny.
Czy Jest jakiś sposób, aby połączyć się z tym MySql lub innym programem na localhost z poziomu tego kontenera Dockera?
15 answers
Edit: jeśli używasz Docker-for-maclub Docker-for-Windows 18.03+, po prostu połącz się z usługą mysql za pomocą hosta host.docker.internal
.
Od wersji Docker 18.04 nie działa to na Docker-for-Linux.
TLDR
Użyj --network="host"
w Komendzie docker run
, a 127.0.0.1
w kontenerze dokera wskaże Twój host dokera.
Uwaga na tryby sieciowe kontenerów Dockera
Docker oferuje różne tryby sieci podczas uruchamiania kontenerów. W zależności od wybranego trybu połączysz się z bazą danych MySQL działającą na hoście docker inaczej.
Docker run --network= "bridge" (domyślnie)Docker domyślnie tworzy most o nazwie docker0
. Zarówno host docker, jak i kontenery docker mają adres IP na tym mostku.
Na serwerze Docker wpisz sudo ip addr show docker0
będziesz miał wyjście wyglądające następująco:
[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::5484:7aff:fefe:9799/64 scope link
valid_lft forever preferred_lft forever
Więc tutaj mój docker host posiada adres IP 172.17.42.1
w interfejsie sieciowym docker0
.
Teraz uruchom nowy kontener i zainstaluj na nim powłokę: docker run --rm -it ubuntu:trusty bash
oraz wewnątrz typu kontenera ip addr show eth0
, aby dowiedzieć się, jak skonfigurowany jest jego główny interfejs sieciowy:
root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.192/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
valid_lft forever preferred_lft forever
Tutaj mój kontener ma adres IP 172.17.1.192
. Teraz spójrz na tabelę routingu:
root@e77f6a1b3740:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 * 255.255.0.0 U 0 0 0 eth0
Tak więc Adres IP hosta dokera {[14] } jest ustawiony jako domyślna trasa i jest dostępny z kontenera.
root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms
Docker run -- network= "host"
Alternatywnie można uruchomić kontener dokera z ustawieniami sieci ustawionymi na host
. Taki kontener będzie współdzielił stos sieci z hostem Dockera i z punktu widzenia kontenera, localhost
(lub 127.0.0.1
) będzie odnosił się do hosta Dockera.
Należy pamiętać, że każdy port otwarty w kontenerze Dockera zostanie otwarty na hoście Dockera. I to bez konieczności -p
lub -P
docker run
opcja .
Konfiguracja IP na moim dockerze gospodarz:
[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
I z kontenera Dockera w trybie host :
[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
valid_lft forever preferred_lft forever
Jak widać zarówno host Dockera, jak i kontener Dockera mają dokładnie ten sam interfejs sieciowy i jako taki mają ten sam adres IP.
Łączenie się z MySQL z kontenerów
Bridge mode
Aby uzyskać dostęp do MySQL uruchomionego na hoście docker z kontenerów w trybie bridge , musisz upewnić się, że usługa MySQL nasłuchuje połączeń na 172.17.42.1
adres IP.
Aby to zrobić, upewnij się, że masz bind-address = 172.17.42.1
lub bind-address = 0.0.0.0
w pliku konfiguracyjnym MySQL (my.cnf).
Jeśli chcesz ustawić zmienną środowiskową z adresem IP bramy, możesz uruchomić następujący kod w kontenerze:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')
Następnie w aplikacji użyj zmiennej środowiskowej DOCKER_HOST_IP
, aby otworzyć połączenie z MySQL.
Uwaga: jeśli używasz bind-address = 0.0.0.0
Twój serwer MySQL będzie nasłuchiwał połączeń na wszystkich interfejsach sieciowych. Oznacza to, że twój serwer MySQL może być dostępny z Internetu ; upewnij się, że odpowiednio skonfigurujesz reguły zapory.
Uwaga 2: jeśli używasz bind-address = 172.17.42.1
Twój serwer MySQL nie będzie nasłuchiwał połączeń wykonanych do 127.0.0.1
. Procesy działające na hoście Dockera, które chciałyby połączyć się z MySQL, musiałyby używać adresu IP 172.17.42.1
.
Tryb hosta
Aby uzyskać dostęp do MySQL uruchomionego na hoście docker z kontenerów w trybie hosta , możesz zachować bind-address = 127.0.0.1
w swoim MySQL konfiguracja i wszystko, co musisz zrobić, to połączyć się z 127.0.0.1
ze swoich kontenerów:
[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Uwaga: używaj mysql -h 127.0.0.1
, a nie mysql -h localhost
; w przeciwnym razie klient MySQL spróbowałby połączyć się za pomocą gniazda unix.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-11 18:39:22
Dla macOS i Windows
Docker v 18.03 i nowsze (od 21 marca 2018)
Użyj swojego wewnętrznego adresu IP lub połącz się ze specjalną nazwą DNS host.docker.internal
, która rozwiąże się z wewnętrznym adresem IP używanym przez hosta.
Wsparcie dla Linuksa w oczekiwaniu https://github.com/docker/for-linux/issues/264
MacOS z wcześniejszymi wersjami Dockera
Docker for Mac v 17.12 to v 18.02
To samo co wyżej, ale użyj docker.for.mac.host.internal
zamiast tego.
Docker for Mac v 17.06 to v 17.11
To samo co wyżej, ale zamiast tego użyj docker.for.mac.localhost
.
Docker for Mac 17.05 and below
Aby uzyskać dostęp do komputera hosta z kontenera docker, należy dołączyć alias IP do interfejsu sieciowego. Możesz powiązać dowolny adres IP, tylko upewnij się, że nie używasz go do niczego innego.
sudo ifconfig lo0 alias 123.123.123.123/24
Następnie upewnij się, że serwer nasłuchuje adresu IP wymienionego powyżej lub 0.0.0.0
. Jeśli to nasłuchiwanie na localhost 127.0.0.1
nie zaakceptuje połączenia.
Następnie po prostu skieruj kontener Dockera na ten adres IP i uzyskaj dostęp do maszyny hosta!
Aby przetestować można uruchomić coś w rodzaju curl -X GET 123.123.123.123:3000
wewnątrz kontenera.
Alias będzie resetowany 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-15 19:42:25
Robię hack podobny do powyższych postów get the local IP to map to a alias name (DNS) in the container. Głównym problemem jest uzyskanie dynamicznie za pomocą prostego skryptu, który działa zarówno w Linux i OSX adres IP hosta . Zrobiłem skrypt, który działa w obu środowiskach (nawet w dystrybucji Linuksa z konfiguracją "$LANG" != "en_*"
):
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1
Więc, używając Dockera Compose, pełna konfiguracja będzie następująca:
Skrypt startowy (docker-run.sh):
export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
docker-compose -f docker-compose.yml up
Docker-compose.yml :
myapp:
build: .
ports:
- "80:80"
extra_hosts:
- "dockerhost:$DOCKERHOST"
Następnie zmień http://localhost
na http://dockerhost
w swoim kodzie.
DOCKERHOST
, zajrzyj do tego posta z wyjaśnieniem, jak to działa.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-21 19:18:20
To działa dla mnie na stosie NGINX/PHP-FPM bez dotykania kodu lub sieci, gdzie aplikacja oczekuje, że będzie w stanie połączyć się z localhost
Zamontować mysqld.sock
od hosta do wnętrza kontenera.
Znajdź lokalizację mysql.plik sock na hoście uruchamiającym mysql:netstat -ln | awk '/mysql(.*)?\.sock/ { print $9 }'
Zamontuj ten plik tam, gdzie jest oczekiwany w dockerze:docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock
Możliwe lokalizacje mysqld.sock:
/tmp/mysqld.sock
/var/run/mysqld/mysqld.sock
/var/lib/mysql/mysql.sock
/Applications/MAMP/tmp/mysql/mysql.sock # if running via MAMP
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 12:48:53
Rozwiązanie dla Windows 10
Docker Community Edition 17.06.0-ce-win18 2017-06-28 (wersja stabilna)
Możesz użyć nazwy DNS hosta docker.for.win.localhost
, aby rozwiązać wewnętrzny adres IP. (Uwaga Niektóre źródła wymienione windows
ale powinno być win
)
Przegląd
Musiałem zrobić coś podobnego, to jest połączyć się z mojego kontenera Docker do mojego localhost, który był uruchomiony Azure Storage Emulator
i CosmosDB Emulator
.
Azure Storage Emulator
domyślnie nasłuchuje na 127.0.0.1, chociaż można zmienić IP jego związany zbyt, szukałem rozwiązania, które będzie działać z ustawieniami domyślnymi.
Działa to również przy łączeniu się z kontenerem Docker do SQL Server
i IIS
, oba działają lokalnie na moim hoście z domyślnymi ustawieniami portu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-03 14:57:11
Dla tych w systemie Windows, zakładając, że używasz sterownika sieci bridge, będziesz chciał konkretnie powiązać MySQL z adresem ip interfejsu sieciowego hyper - V.
Odbywa się to poprzez plik konfiguracyjny pod normalnie ukrytym C:\ProgramData\MySQL folder.
Powiązanie z 0.0.0.0 nie będzie działać. Potrzebny adres jest również pokazany w konfiguracji Dockera, a w moim przypadku był to 10.0.75.1.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-10 15:53:05
Edit: skończyłem z prototypowaniem koncepcji na Githubie. Zobacz też: https://github.com/sivabudh/system-in-a-box
Po pierwsze, moja odpowiedź jest skierowana do 2 grup ludzi: tych, którzy używają Maca i tych, którzy używają Linuksa.
Tryb sieciowyhost nie działa na komputerze Mac. Musisz użyć aliasu IP, zobacz: https://stackoverflow.com/a/43541681/2713729
Co to jest tryb sieci hosta? Zobacz też: 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 było z Ubuntu 14.04 LTS i wkrótce aktualizuję do 16.04 LTS w produkcji), Tak , możesz sprawić, że usługa działająca wewnątrz kontenera Dockera połączy się z localhost
usługami działającymi na hoście Dockera (np. twój laptop).
Klucz polega na tym, że gdy uruchomisz kontener Dockera, musisz go uruchomić z hostem mode. Polecenie wygląda tak:
docker run --network="host" -id <Docker image ID>
Kiedy wykonasz ifconfig
(będziesz musiał apt-get install net-tools
twój kontener, aby ifconfig
mógł być wywołany) wewnątrz twojego 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 używam Ubuntu pod Parallels, więc korzystanie z Maca nie jest wadą. ;-)
I tak podłączasz kontener NGINX do MySQL działającego na localhost
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:00
Rozwiązanie dla Linuksa (kernel >=3.6).
OK, Twój serwer localhost ma domyślny interfejs docker docker0 z adresem ip 172.17.0.1. Kontener zaczynał się od domyślnych ustawień sieci --net= "bridge" .
- Włącz route_localnet dla interfejsu docker0:
$ sysctl -w net.ipv4.conf.docker0.route_localnet=1
- Dodaj ten Regulamin do iptables:
$ 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
- Utwórz użytkownika mysql z dostępem z"%", co oznacza-od każdego, z wyjątkiem localhost:
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
- Zmień w skrypcie adres serwera mysql na 172.17.0.1
Route_localnet - BOOLEAN: nie traktuj adresów loopback jako źródła lub miejsca docelowego podczas routingu. Umożliwia to użycie 127/8 do celów lokalnego routingu (default FALSE).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-27 13:22:52
Oto moje rozwiązanie: to 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.d Restart serwera mysql
sudo /etc/init.d/mysql restart
Uruchom następujące polecenie, aby otworzyć dostęp użytkownika root 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
#!bin/bash HOSTIP=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print \$2}' | cut -d / -f 1` docker run -it -d --name web-app \ --add-host=local:${HOSTIP} \ -p 8080:8080 \ -e DATABASE_HOST=${HOSTIP} \ -e DATABASE_PORT=3306 \ -e DATABASE_NAME=demo \ -e DATABASE_USER=root \ -e DATABASE_PASSWORD=root \ sopheamak/springboot_docker_mysql
-
Uruchom z Docker-composer
version: '2.1'
Services:
tomcatwar: extra_hosts: - "local:10.1.2.232" image: sopheamak/springboot_docker_mysql
ports: - 8080:8080 environment: - DATABASE_HOST=local - DATABASE_USER=root - DATABASE_PASSWORD=root - DATABASE_NAME=demo - DATABASE_PORT=3306
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-17 07:47:55
Nie zgadzam się z odpowiedzią Thomasleveil.
Powiązanie mysql z 172.17.42.1 uniemożliwi innym programom korzystającym z bazy danych na hoście dotarcie do niej. Będzie to działać tylko wtedy, gdy wszyscy użytkownicy bazy danych są dokowane.
Powiązanie mysql z 0.0.0.0 otworzy db na świat zewnętrzny, co jest nie tylko bardzo złe, ale także sprzeczne z tym, co autor pytania chce zrobić. Wyraźnie mówi " MySql działa na localhost i nie wystawia portu na świat zewnętrzny, więc jest związany z localhost "
Aby odpowiedzieć na komentarz od ivant
" dlaczego nie powiązać mysql z docker0?"
To niemożliwe. Dokumentacja mysql / mariadb wyraźnie mówi, że nie jest możliwe powiązanie z kilkoma interfejsami. Można powiązać tylko z 0, 1 lub wszystkimi interfejsami.
Podsumowując, nie znalazłem żadnego sposobu, aby dotrzeć do bazy danych (tylko localhost) na hoście z kontenera docker. To zdecydowanie wydaje się bardzo bardzo powszechny wzorzec, ale nie wiem jak to zrobić.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-11 14:23:23
Najprostsze rozwiązanie dla Mac OSX
Wystarczy użyć adresu IP komputera Mac. Na komputerze Mac uruchom to, aby pobrać adres IP i użyć go z wnętrza kontenera:
$ ifconfig | grep 'inet 192'| awk '{ print $2}'
Tak długo, jak serwer działający lokalnie na komputerze Mac lub w innym kontenerze Dockera nasłuchuje wersji 0.0.0.0, kontener Dockera będzie mógł dotrzeć pod tym adresem.
Jeśli chcesz uzyskać dostęp do innego kontenera Dockera, który nasłuchuje na 0.0.0.0, możesz użyć 172.17.0.1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 22:23:13
CGroups i przestrzenie nazw odgrywają ważną rolę w ekosystemie kontenerów.
Przestrzeń nazw zapewnia warstwę izolacji. Każdy kontener działa w oddzielnej przestrzeni nazw, a jego dostęp jest ograniczony do tej przestrzeni nazw. Cgroups kontroluje wykorzystanie zasobów każdego kontenera, podczas gdy Przestrzeń nazw kontroluje to, co proces może zobaczyć i uzyskać dostęp do danego zasobu.
Oto podstawowe zrozumienie podejścia do rozwiązania, które możesz zastosować,
Użycie Network Namespace
Gdy kontener pojawia się poza obrazem, definiuje się i tworzy interfejs sieciowy. Daje to kontenerowi unikalny adres IP i interfejs.
$ docker run -it alpine ifconfig
Zmieniając przestrzeń nazw NA host, sieci cotainerów nie pozostają odizolowane od swojego interfejsu, proces będzie miał dostęp do interfejsu sieciowego maszyn hostów.
$ docker run -it --net=host alpine ifconfig
Jeśli proces nasłuchuje na portach, będą one nasłuchiwane na interfejsie hosta i mapowane do kontenera.
Użycie Przestrzeń nazw PID Zmiana przestrzeni nazw Pid pozwala kontenerowi na interakcję z innym procesem poza jego normalnym zakresem.
Ten kontener będzie działał we własnej przestrzeni nazw.
$ docker run -it alpine ps aux
Zmieniając przestrzeń nazw NA host, kontener może również zobaczyć wszystkie inne procesy uruchomione w systemie.
$ docker run -it --pid=host alpine ps aux
Dzielenie Przestrzeni Nazw
Jest to zła praktyka, aby to zrobić w produkcji, ponieważ wyłamujesz się z modelu bezpieczeństwa kontenera, który może się otworzyć na luki i łatwy dostęp do podsłuchu. Służy to tylko do debugowania narzędzi i zaniżania luk w zabezpieczeniach kontenerów.Pierwszym kontenerem jest serwer nginx. Spowoduje to utworzenie nowej przestrzeni nazw sieci i procesów. Ten kontener połączy się z portem 80 nowo utworzonego interfejsu sieciowego.
$ docker run -d --name http nginx:alpine
Inny kontener może teraz ponownie użyć tej przestrzeni nazw,
$ docker run --net=container:http mohan08p/curl curl -s localhost
Również ten kontener może zobaczyć interfejs z procesami we współdzielonym Pojemnik.
$ docker run --pid=container:http alpine ps aux
Pozwoli Ci to nadać więcej uprawnień kontenerom bez zmiany lub ponownego uruchamiania aplikacji. W podobny sposób możesz połączyć się z mysql na hoście, uruchomić i debugować swoją aplikację. Ale nie zaleca się, aby przejść w ten sposób. Mam nadzieję, że to pomoże.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 12:05:22
Możesz uzyskać IP hosta używając alpine image
docker run --rm alpine ip route | awk 'NR==1 {print $3}'
Byłoby to bardziej spójne, ponieważ zawsze używasz alpine do uruchomienia polecenia.
Podobne do odpowiedzi Mariano, możesz użyć tego samego polecenia, aby ustawić zmienną środowiskową
DOCKER_HOST=$(docker run --rm alpine ip route | awk 'NR==1 {print $3}') docker-compose up
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-11 08:47:06
Dla Windows Machine :-
Uruchom poniższe polecenie, aby losowo wyświetlić port Dockera w czasie budowy
$docker run -d --name MyWebServer -P mediawiki
Na powyższej liście kontenerów można zobaczyć port przypisany jako 32768. Try accessing
localhost:32768
Możesz zobaczyć stronę mediawiki
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-22 06:07:32
Możesz użyć ngrok , aby utworzyć bezpieczny tunel do maszyny localhost, a następnie odsłonić ten tunel do kontenera docker.
Ngrok jest wolny od 22/05/2017.
Kroki:
1) Przejdź do ngrok
2) Pobierz klienta ngrok i postępuj zgodnie z instrukcjami instalacji
3) Zarejestruj się , aby założyć konto, a otrzymasz token uwierzytelniania. Rejestracja jest wymagana, ponieważ ngrok daje tylko tunel portu TCP po rejestracji. Nie ma kosztów lub karty kredytowej wymagane do rejestracji.
4) w terminalu do ngrok tcp 3306
. 3306
jest portem, który mysql działa na moim lokalnym, możesz to zrobić z każdym innym portem, jak również.
5) otrzymasz adres z kroku 4
taki jak ten: tcp://0.tcp.ngrok.io:10117
. To połączenie tunelowe z Twoją lokalną maszyną. 0.tcp.ngrok.io
jest mapowane do twojego localhost
, a port 10117
do twojego lokalnego portu 3306
. Teraz możesz uzyskać dostęp do portu localhost 3306 z dowolnego miejsca za pomocą ten adres, łącznie z każdym kontenerem dokującym działającym na tym komputerze. W kontenerze docker(gdziekolwiek jest), zakładając, że masz już zainstalowanego klienta mysql, wykonaj następujące czynności:]}
mysql --host 0.tcp.ngrok.io --port 10117 -u root
Będziesz mógł zalogować się na swoje root
konto lokalnej maszyny z wnętrza kontenera Dockera!
Pisałem na blogu o tym rozwiązaniu Zobacz więcej szczegółów tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 22:30:42