完全な仮想マシンのように動作する Docker コンテナを作成しようとしています。Dockerfile 内で EXPOSE 命令を使用してポートを公開し、フラグを使用して-p
ポートdocker run
を割り当てることができることはわかっていますが、コンテナが実際に実行されたら、追加のポートをライブで開いたりマップしたりするコマンドはありますか?
たとえば、sshd を実行している Docker コンテナがあるとします。コンテナを使用している他のユーザーが ssh でログインし、httpd をインストールします。コンテナでポート 80 を公開し、それをホストのポート 8080 にマップして、コンテナを再起動せずにユーザーがコンテナ内で実行されている Web サーバーにアクセスできるようにする方法はありますか?
ベストアンサー1
Docker 経由でこれを実行することはできませんが、ホスト マシンからコンテナーの非公開ポートにアクセスすることはできます。
ポート8000で何かが動いているコンテナがある場合は、以下を実行できます。
wget http://container_ip:8000
コンテナの IP アドレスを取得するには、次の 2 つのコマンドを実行します。
docker ps
docker inspect container_name | grep IPAddress
内部的には、Docker はイメージを実行するときに iptables を呼び出すようにシェルアウトするので、おそらくこれのバリエーションが機能するでしょう。
コンテナのポート 8000 をローカルホストのポート 8001 に公開するには:
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
これを解決する 1 つの方法は、必要なポート マッピングを使用して別のコンテナーを設定し、iptables-saveコマンドの出力を比較することです (ただし、トラフィックを docker プロキシ経由で送信する他のオプションの一部を削除する必要がありました)。
注意: これは Docker を妨害するものなので、青い煙が発生する可能性があることを認識して実行する必要があります。
または
もう 1 つの選択肢は、(0.6.6 以降の新機能) -P オプションを確認することです。このオプションでは、ランダムなホスト ポートが使用され、それらのポートが接続されます。
または
0.6.5 では、LINK 機能を使用して、既存のコンテナと通信する新しいコンテナを起動し、そのコンテナの -p フラグへの追加のリレーを行うことができますか? (私はまだ LINK を使用していません。)
または
docker run --net host ..
docker 0.11? では、コンテナーをホストのネットワーク インターフェイスに直接接続することができます(つまり、net は名前空間化されていません)。そのため、コンテナー内で開いたすべてのポートが公開されます。