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?

Author: Kevin, 2014-06-20

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.

 1035
Author: Thomasleveil,
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

 212
Author: Janne Annala,
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.

Aby dowiedzieć się więcej o tym, jak dostosować skrypt DOCKERHOST, zajrzyj do tego posta z wyjaśnieniem, jak to działa.
 52
Author: Mariano Ruiz,
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
 30
Author: user833482,
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.

 9
Author: Ralph Willgoss,
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.

 8
Author: Casey,
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).

Jak?

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.

 7
Author: sivabudh,
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" .

  1. Włącz route_localnet dla interfejsu docker0:
    $ sysctl -w net.ipv4.conf.docker0.route_localnet=1
  2. 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
  3. Utwórz użytkownika mysql z dostępem z"%", co oznacza-od każdego, z wyjątkiem localhost:
    CREATE USER 'user'@'%' IDENTIFIED BY 'password';
  4. Zmień w skrypcie adres serwera mysql na 172.17.0.1


Z dokumentacji jądra :

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).

 7
Author: Ray D,
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

 3
Author: sopheamak,
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ć.

 2
Author: orzel,
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

 2
Author: dansalmo,
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.

 2
Author: mohan08p,
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
 2
Author: hasnat,
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

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

Na powyższej liście kontenerów można zobaczyć port przypisany jako 32768. Try accessing

localhost:32768 

Możesz zobaczyć stronę mediawiki

 1
Author: Lokesh S,
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

 -12
Author: Stephens,
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