web-dev-qa-db-ja.com

Dockerコンテナの中から、どうやってマシンのローカルホストに接続するのですか?

だから私は港湾労働者のコンテナの中で実行されているNginxを持っている、私はlocalhostで実行されているMySQLを持っている、私は自分のNginx内からMySqlに接続したい。 MySqlはlocalhostで実行されていて、外部の世界にポートを公開していないので、localhostにバインドされていて、マシンのIPアドレスにバインドされていません。

このdockerコンテナ内からMySqlまたはlocalhost上の他のプログラムに接続する方法はありますか?

926
Phil

編集: Docker-for-mac または Docker-for-mac 18.03+)を使用している場合は、Host Host.docker.internalを使用してmysqlサービスに接続してください。 

Docker 18.04以降、これはDocker for Linuxでは機能しません。 ただし、 qoomon's answer で説明されているようにコンテナを使用すると、うまく動作させることができます。


TLDR

--network="Host"コマンドでdocker runを使用すると、dockerコンテナの127.0.0.1がdocker Hostを指すようになります。

注:このモードはDocker for Linux、 ドキュメンテーション に従って)でのみ機能します。


Docker containerネットワーキングモードに関する注意

Dockerはコンテナの実行時に 異なるネットワークモード を提供します。選択したモードに応じて、docker Host上で実行されているMySQLデータベースへの接続方法が異なります。

docker run --network = "bridge"(デフォルト)

Dockerはデフォルトでdocker0という名前のブリッジを作成します。 docker Hostとdocker containerの両方がそのブリッジにIPアドレスを持っています。

dockerホストでSudo ip addr show docker0と入力すると、次のような出力になります。

[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

だからここで私のdocker Hostは172.17.42.1ネットワークインターフェースのIPアドレスdocker0を持っています。

新しいコンテナを起動して、その上にシェルを取得します。docker run --rm -it ubuntu:trusty bashコンテナ内でip addr show eth0そのメインネットワークインターフェイスの設定方法を確認します。

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

このコンテナのIPアドレスは172.17.1.192です。それではルーティングテーブルを見てください。

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

そのため、docker HostのIPアドレス172.17.42.1がデフォルトルートとして設定されており、コンテナからアクセスできます。

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"

あるいは、 ネットワーク設定をHost に設定したもの)でdockerコンテナーを実行することもできます。そのようなコンテナーはdocker Hostとネットワーク・スタックを共有し、コンテナーの観点からはlocalhostまたは127.0.0.1)はdocker Hostを参照します。

Dockerコンテナで開かれているポートはすべてdockerホストで開かれることに注意してください。そしてこれは_(-p-Pdocker run option を必要としない。

DockerホストのIP設定

[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

そして Host モードのdockerコンテナから:

[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

ご覧のとおり、docker Hostとdocker containerは、まったく同じネットワークインターフェースを共有しているため、同じIPアドレスを持っています。


コンテナからMySQLに接続する

ブリッジモード

ブリッジモードのコンテナからdocker Host上で実行されているMySQLにアクセスするには、MySQLサービスが172.17.42.1 IPアドレスでの接続をリッスンしていることを確認する必要があります。

そのためには、MySQLの設定ファイル(my.cnf)にbind-address = 172.17.42.1またはbind-address = 0.0.0.0があることを確認してください。 

ゲートウェイのIPアドレスで環境変数を設定する必要がある場合は、コンテナ内で次のコードを実行できます。

export DOCKER_Host_IP=$(route -n | awk '/UG[ \t]/{print $2}')

その後、アプリケーションで、DOCKER_Host_IP環境変数を使用してMySQLへの接続を開きます。

注: bind-address = 0.0.0.0を使用すると、MySQLサーバーはすべてのネットワークインターフェースで接続を待機します。それはあなたのMySQLサーバがインターネットからアクセスできることを意味します。それに応じてファイアウォールルールを設定してください。

注2: あなたがbind-address = 172.17.42.1を使うと、あなたのMySQLサーバーは127.0.0.1への接続を待ち受けません。 MySQLに接続したいと思うdocker Hostで実行されているプロセスは172.17.42.1 IPアドレスを使用しなければならないでしょう。

ホストモード

ホストモードのコンテナからdocker Host上で実行されているMySQLにアクセスするには、あなたのMySQL設定でbind-address = 127.0.0.1を保持することができ、あなたがする必要があるのはあなたのコンテナから127.0.0.1に接続することです:

[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>

注意: mysql -h 127.0.0.1ではなくmysql -h localhostを使用してください。そうでなければ、MySQLクライアントはUNIXソケットを使用して接続しようとします。

1233
Thomasleveil

MacOSとWindowsの場合

Docker v 18.03以降(2018年3月21日以降)

内部IPアドレスを使用するか、ホストが使用する内部IPアドレスに解決される特別なDNS名Host.docker.internalに接続します。

Linuxのサポートは保留中です https://github.com/docker/for-linux/issues/264

MacOSと以前のバージョンのDocker

Docker for Mac v 17.12からv 18.02

上記と同じですが、代わりにdocker.for.mac.Host.internalを使用してください。

Docker for Mac v 17.06からv 17.11

上記と同じですが、代わりにdocker.for.mac.localhostを使用してください。

Docker for Mac 17.05以下

Docker containerからHost machineにアクセスするには、ネットワークインターフェースにIPエイリアスを添付する必要があります。どのIPを使用しても構いませんが、使用していないことを確認してください。

Sudo ifconfig lo0 alias 123.123.123.123/24 

次に、サーバーが上記のIPまたは0.0.0.0をリ​​ッスンしていることを確認してください。 localhostの127.0.0.1をリ​​ッスンしている場合は、接続を受け入れません。

それからあなたのdockerコンテナをこのIPに向けるだけで、あなたはHostマシンにアクセスすることができます!

テストするためにはコンテナの中でcurl -X GET 123.123.123.123:3000のようなものを実行することができます。

エイリアスは再起動のたびにリセットされるので、必要に応じて起動スクリプトを作成します。

ここにソリューションとより多くのドキュメンテーション: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

247
Janne Annala

私は、ローカルIPをコンテナ内のエイリアス名(DNS)にマッピングする上記の投稿に似たハックをしています。主な問題は、 LinuxとOSXのホストIPアドレス の両方で動作する単純なスクリプトで動的に取得することです。私はこのスクリプトを両方の環境で動作するようにしました("$LANG" != "en_*"が設定されたLinuxディストリビューションでも)。

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を使用した場合、完全な構成は次のようになります。

起動スクリプト(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"

次に、コードのhttp://localhosthttp://dockerhostに変更します。

どのようにDOCKERHOSTスクリプトをカスタマイズするかについてのより進んだガイドのためにそれがどのように働くかの説明と共に この記事 を見てください。

57
Mariano Ruiz

これは私にとってNGINX/PHP-FPMスタック上で動作しました。アプリがlocalhostに接続できることを期待しているコードやネットワークには一切触れません

ホストからコンテナの内側にmysqld.sockをマウントします。

Mysqlを実行しているホスト上でmysql.sockファイルの場所を見つけます。
netstat -ln | awk '/mysql(.*)?\.sock/ { print $9 }'

そのファイルをdockerの予想される場所にマウントします。
docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock

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
32
user833482

Linux用のソリューション(カーネル> = 3.6)。 

わかりました、あなたのlocalhostサーバーにはデフォルトのdockerインターフェース docker0 とipアドレス 172.17.0.1 があります。あなたのコンテナはデフォルトのネットワーク設定 --net = "bridge" で始まりました。 

  1. Docker0インターフェイスに対してroute_localnetを有効にします。
    $ sysctl -w net.ipv4.conf.docker0.route_localnet=1
  2. このルールを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. 「%」からのアクセス権を持つmysqlユーザーを作成します。つまり、localhostを除くすべてのユーザーからアクセスします。
    CREATE USER 'user'@'%' IDENTIFIED BY 'password';
  4. スクリプトでmysql-serverアドレスを172.17.0.1に変更します。


カーネルのドキュメントから

route_localnet - BOOLEAN:ルーティング中にループバックアドレスを火星の送信元または送信先と見なさないでください。これはローカルルーティング目的のために127/8の使用を可能にします( デフォルトFALSE )。

11
Ray D

Windows 10用のソリューション

Docker Community Edition 17.06.0-ce-win18 2017-06-28(安定版)

内部IPに解決するために、ホストのDNS名docker.for.win.localhostを使用できます。 (いくつかの情報源に警告はwindowsを述べましたが、それはwinであるべきです)

概要
同様のことをする必要がありました。それは私のDockerコンテナからAzure Storage EmulatorCosmosDB Emulatorを実行していた私のローカルホストへの接続です。

Azure Storage Emulatorはデフォルトで127.0.0.1をリッスンしますが、IPの範囲も変更できますが、デフォルト設定で機能する解決策を探していました。

これは私のDockerコンテナからSQL ServerIISへの接続にも働きます。どちらもデフォルトのポート設定で私のホスト上でローカルに動作します。

10
Ralph Willgoss

Windowsの場合は、ブリッジネットワークドライバを使用していると仮定して、MySQLをhyper-vネットワークインタフェースのIPアドレスに明示的にバインドする必要があります。 

これは通常隠されているC:\ ProgramData\MySQLフォルダの下の設定ファイルを通して行われます。 

0.0.0.0にバインドしても機能しません。必要なアドレスはdocker設定にも表示され、私の場合は10.0.75.1でした。

8
Casey

編集:私はGitHubでコンセプトを試作しました。チェックアウト: https://github.com/sivabudh/system-in-a-box


まず、私の答えは、Macを使う人とLinuxを使う人の2つのグループに向けられています。

Host ネットワークモードはMacでは機能しません。 IPエイリアスを使用する必要があります。 https://stackoverflow.com/a/43541681/2713729 を参照してください。

ホストネットワークモードとは何ですか?参照してください: https://docs.docker.com/engine/reference/run/#/network-settings

第二に、Linuxを使っている人たち(私の直接の経験はUbuntu 14.04 LTSを使っていて、すぐに16.04 LTSにアップグレードする予定です)、 yes なら、Dockerコンテナ内でサービスを走らせることができますDockerホスト上で実行されているlocalhostサービス(例えばあなたのラップトップ)に接続してください。

どうやって?

重要なのは、Dockerコンテナを実行するときに、 Host モードで実行する必要があるということです。コマンドは次のようになります。

docker run --network="Host" -id <Docker image ID>

コンテナ内でifconfigifconfigを呼び出し可能にするにはapt-get install net-toolsを作成する必要があります)を実行すると、ネットワークインターフェイスはDocker Hostのものと同じになります(例:ラップトップ)。 

私はMacユーザーですが、Parallelsの下でUbuntuを実行しているので、Macを使用することはデメリットではありません。 ;-)

そしてこれがNGINXコンテナをlocalhost上で動作するMySQLに接続する方法です。

7
sivabudh

host.docker.internalがすべてのプラットフォームで動作するまで、手動でセットアップすることなくNATゲート​​ウェイとして機能する私のコンテナを使用できます https://github.com/qoomon/docker-Host

5
qoomon

Mac OSX用の最もシンプルなソリューション

MacのIPアドレスを使うだけです。 Macでは、これを実行してIPアドレスを取得し、コンテナ内から使用します。

$ ifconfig | grep 'inet 192'| awk '{ print $2}'

Mac上または別のdocker containerでローカルに実行されているサーバーが0.0.0.0をリッスンしている限り、docker containerはそのアドレスにアクセスできます。

0.0.0.0をリッスンしている別のdockerコンテナにアクセスしたいだけであれば、172.17.0.1を使用できます。

4
dansalmo

ここに私の解決策があります:それは私の場合に機能します

  • /etc/mysql/mysql.conf.dのコメント#bind-address = 127.0.0.1によってローカルmysqlサーバーをパブリックアクセスに設定します

  • mysqlサーバーを再起動しますSudo /etc/init.d/mysql restart

  • 次のコマンドを実行して、任意のホストmysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;のユーザールートアクセスを開きます。

  • shスクリプトの作成:run_docker.sh

#!bin/bash 
 
 HOSTIP = `ip -4 addr show scope global dev 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 
 
 
  • docker-composerで実行する

    バージョン: '2.1' 
     
    
    サービス:
    tomcatwar: extra_hosts: -"local:10.1.2.232" image:sopheamak/springboot_docker_mysql
    ポート: -8080:8080 環境: -DATABASE_Host = local -DATABASE_USER = root -DATABASE_PASSWORD = root -DATABASE_NAME = demo -DATABASE_PORT = 3306
4
sopheamak

これは実際の質問に対する答えではありません。これは私が同様の問題を解決した方法です。ソリューションは、完全に以下から得られます。 コンテナが通信できるようにDockerコンテナネットワーキングを定義 。 Nic Raboyに感謝

あるコンテナと別のコンテナ間でREST呼び出しを行いたいと思う他の人のためにここに残してください。質問への回答:Docker環境でlocalhostの代わりに何を使用するか?

ネットワークがどのように見えるかを取得しますdocker network ls

新しいネットワークを作成docker network create -d my-net

最初のコンテナdocker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>を開始します

最初のコンテナdocker inspect first_containerのネットワーク設定を確認してください。 「ネットワーク」:「my-net」が必要です

2番目のコンテナdocker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>を開始します

2番目のコンテナdocker inspect second_containerのネットワーク設定を確認します。 「ネットワーク」:「my-net」が必要です

2番目のコンテナdocker exec -it second_container shまたはdocker exec -it second_container bashにsshします。

2番目のコンテナー内では、ping first_containerで最初のコンテナーにpingを実行できます。また、http://localhost:5000などのコード呼び出しはhttp://first_container:5000に置き換えることができます

3

いくつかの解決策が思い浮かびます:

  1. 最初に依存関係をコンテナーに移動します
  2. 他のサービスを外部からアクセス可能にし、その外部IPでそれらに接続します
  3. ネットワークを分離せずにコンテナーを実行する
  4. ネットワーク経由での接続を避け、代わりにボリュームとしてマウントされているソケットを使用します

これがすぐに動作しない理由は、コンテナがデフォルトで独自のネットワーク名前空間で実行されるためです。つまり、ローカルホスト(またはループバックインターフェイスを指す127.0.0.1)はコンテナごとに一意です。これに接続すると、コンテナー自体に接続され、ドッカーの外部または別のドッカーコンテナーの内部で実行されるサービスではありません。

オプション1:依存関係をコンテナに移動できる場合、最初にこれを行います。他の人が自分の環境でコンテナを実行しようとするため、アプリケーションスタックが移植可能になります。また、移行されていない他のサービスが引き続きアクセスできるホストでポートを公開できます。 Dockerホストのlocalhostインターフェイスにポートを公開して、公開されたポートの-p 127.0.0.1:3306:3306のような構文で外部からアクセスできるようにすることもできます。

オプション2:コンテナー内からホストIPアドレスを検出する方法はさまざまですが、それぞれが機能するシナリオの数は限られています(例:Docker for Macが必要)。最も移植性の高いオプションは、環境変数または構成ファイルのようなものを使用して、ホストIPをコンテナーに注入することです。

docker run --rm -e "Host_IP=$(ip r s 0/0 | awk '{print $3}')" ...

これには、サービスがその外部インターフェイスでリッスンしている必要がありますが、これはセキュリティ上の問題になる可能性があります。コンテナ内部からホストIPアドレスを取得する他の方法については、 この投稿を参照

オプション3:ネットワーク分離なしで実行、つまり--net Hostで実行すると、アプリケーションはホストネットワーク名前空間で実行されます。これにより、コンテナの分離が少なくなり、DNSを使用して共有ドッカーネットワーク経由で他のコンテナにアクセスできなくなります(代わりに、公開されたポートを使用して他のコンテナ化されたアプリケーションにアクセスする必要があります)。ただし、ホスト上の127.0.0.1でのみリッスンしているホスト上の他のサービスにアクセスする必要があるアプリケーションの場合、これが最も簡単なオプションです。

オプション4:さまざまなサービスにより、ファイルシステムベースのソケットを介したアクセスも許可されます。このソケットは、バインドマウントボリュームとしてコンテナにマウントできるため、ネットワークを経由せずにホストサービスにアクセスできます。 Dockerエンジンへのアクセスについては、/var/run/docker.sockをコンテナにマウントする例がよく見られます(そのコンテナルートがホストにアクセスできるようにします)。 mysqlでは、-v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sockのようなものを試してから、localhostに接続して、mysqlがソケットを使用するように変換します。

3
BMitch

私はThomasleveilからの答えに同意しません。

Mysqlを172.17.42.1にバインドすると、他のプログラムがホスト上のデータベースを使用してアクセスできなくなります。これは、すべてのデータベースユーザーがdockerizedされている場合にのみ機能します。

Mysqlを0.0.0.0にバインドすると、データベースが外部に公開されます。これは非常に悪いことであるだけでなく、元の質問作成者がやりたいこととは反対です。彼は、「MySqlはlocalhostで実行されていて、外部の世界にポートを公開していないので、localhostにバインドされている」と明確に述べています。

Ivantからのコメントに回答する

「なぜmysqlをdocker0にもバインドしないのですか?」

これは不可能です。 mysql/mariadbのドキュメントには、複数のインターフェースにバインドすることは不可能であることが明示的に記載されています。 0、1、またはすべてのインターフェイスにしかバインドできません。

結論として、私はdockerコンテナからホスト上の(localhostのみ)データベースにアクセスする方法を見つけていません。それは間違いなく非常に一般的なパターンのように思えますが、私はそれを行う方法がわかりません。

2
orzel

CGroupsとNamespacesはContainer Ecosystemで大きな役割を果たしています。

名前空間は分離の層を提供します。各コンテナは別々のネームスペースで実行され、そのアクセスはそのネームスペースに制限されます。 Cgroupsは各コンテナーのリソース使用率を制御しますが、Namespaceはプロセスがそれぞれのリソースを見てアクセスできるものを制御します。 

これがあなたが従うことができる解決策アプローチの基本的な理解です、

ネットワークネームスペースを使用する

コンテナーがイメージから生成されると、ネットワークインターフェースが定義され作成されます。これにより、コンテナーに固有のIPアドレスとインターフェースが与えられます。

$ docker run -it Alpine ifconfig

名前空間をホストに変更することによって、cotainersネットワークはそのインターフェースから分離されたままではなく、プロセスはホストマシンのネットワークインターフェースにアクセスできるようになります。

$ docker run -it --net=Host Alpine ifconfig

プロセスがポートをリッスンする場合、それらはホストインターフェースでリッスンされ、コンテナにマッピングされます。

PID名前空間の使用 Pid名前空間を変更することで、コンテナは通常の範囲を超えて他のプロセスと対話することができます。

このコンテナはそれ自身の名前空間で動作します。

$ docker run -it Alpine ps aux

名前空間をHostに変更することで、コンテナはシステム上で実行されている他のすべてのプロセスも見ることができます。

$ docker run -it --pid=Host Alpine ps aux

名前空間を共有する

脆弱性や盗聴者への容易なアクセスをもたらす可能性があるコンテナセキュリティモデルから抜け出しているため、これは実稼働環境ではこれを行うのは悪い習慣です。これは、ツールをデバッグし、コンテナセキュリティの抜け穴を理解するためだけのものです。

最初のコンテナはnginxサーバーです。これにより、新しいネットワークとプロセスのネームスペースが作成されます。このコンテナは、新しく作成されたネットワークインタフェースのポート80に自分自身をバインドします。 

$ docker run -d --name http nginx:Alpine

別のコンテナがこの名前空間を再利用できるようになりました

$ docker run --net=container:http mohan08p/curl curl -s localhost

また、このコンテナは共有コンテナ内のプロセスとのインタフェースを見ることができます。

$ docker run --pid=container:http Alpine ps aux

これにより、アプリケーションを変更したり再起動したりせずに、より多くの特権をコンテナに付与できます。同様に、ホスト上のmysqlに接続し、アプリケーションを実行してデバッグすることができます。しかし、それはこの方法で行くことをお勧めしません。それが役に立てば幸い。 

2
mohan08p

あなたはアルパインイメージを使用してホストIPを取得することができます

docker run --rm Alpine ip route | awk 'NR==1 {print $3}'

コマンドを実行するために常にAlpineを使用しているので、これはより一貫性があります。

Marianoの答えと同様に、環境変数を設定するために同じコマンドを使うことができます

DOCKER_Host=$(docker run --rm Alpine ip route | awk 'NR==1 {print $3}') docker-compose up
2
hasnat

Windowsマシンの場合: -

ビルド時にdocker portをランダムに公開するために下記のコマンドを実行してください。

$docker run -d --name MyWebServer -P mediawiki

enter image description here

enter image description here

上記のコンテナリストで、32768として割り当てられたポートを見ることができます。アクセスしてみてください 

localhost:32768 

あなたはmediawikiページを見ることができます

1
Lokesh S

とても簡単で素早く、あなたのホストIPをifconfig(linux)かipconfig(windows)でチェックしてから

docker-compose.yml

version: '3' # specify docker-compose version

services:
  nginx:
    build: ./ # specify the directory of the Dockerfile
    ports:
      - "8080:80" # specify port mapping
    extra_hosts:
      - "dockerhost:<yourIP>"

これにより、あなたのコンテナはあなたのホストにアクセスできるようになります。 DBにアクセスするときは、以前に指定した名前(この場合は "dockerhost")と、DBが稼働しているホストのポートを忘れずに使用してください。

1
Felipe Toledo

fixmasterブランチにマージされない限り、ホストIPはコンテナの内側から実行されます。

ip -4 route list match 0/0 | cut -d' ' -f3

@Mahoneyhere で示唆されているように)。

0
patryk.beza

Windows 10 Home上でDocker Toolboxを使用しても、答えはどれも私にとってはうまくいきませんでしたが、 10.0.2.2 でした。これは、ホストをこのアドレスのVMに公開するVirtualBoxを使用するためです。

0
Elad