1. ホーム
  2. docker

[解決済み] ライブDockerコンテナでポートを公開する

2022-03-20 14:57:15

質問

完全な仮想マシンのように動作するDockerコンテナを作成しようとしています。Dockerfileの中でEXPOSE命令を使ってポートを公開できることは知っていますし、また、Dockerfileの中で -p フラグを docker run を使用してポートを割り当てることができますが、コンテナが実際に実行されると、追加のポートをライブで開く/マッピングするコマンドはありますか?

例えば、sshdが動作しているDockerコンテナがあるとします。そのコンテナを使用している他の誰かが、sshでログインしてhttpdをインストールしたとします。コンテナ上のポート80を公開し、それをホスト上のポート8080にマップすることで、コンテナを再起動することなく、コンテナ内で動作するWebサーバにアクセスできるようにする方法はないでしょうか?

解決方法は?

Docker経由ではできませんが、ホストマシンからコンテナの未公開ポートにアクセスすることは可能です。

コンテナのポート8000で何かが動いている場合、そのコンテナに対して

wget http://container_ip:8000

コンテナのIPアドレスを取得するために、2つのコマンドを実行します。

docker ps
docker inspect container_name | grep IPAddress

内部的には、Dockerはイメージを実行するときにiptablesを呼び出すようにシェルしているので、多分これの何らかのバリエーションがうまくいくでしょう。

コンテナのポート8000をlocalhostのポート8001で公開すること。

iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000

この問題を解決する一つの方法は、別のコンテナを希望のポートマッピングでセットアップし、そのコンテナの iptables-save コマンドを実行します (ただし、Docker プロキシを経由するトラフィックを強制する他のオプションのいくつかを削除する必要がありました)。

注意:これはdockerを破壊しているので、青い煙が出る可能性があることを認識した上で行う必要があります。

または

もうひとつの方法は、(新しい? 0.6.6 以降?) -P オプションを見て、ランダムなホストポートを使い、それを配線することです。

または

0.6.5 では、LINKs 機能を使って、既存のコンテナに話しかける新しいコンテナを立ち上げ、そのコンテナの -p フラグにいくつかの追加リレーを行うことができるのでは?(私はまだLINKsを使ったことがありません)。

または

docker 0.11では? docker run --net host .. を使うと、コンテナをホストのネットワークインターフェースに直接アタッチすることができます (つまり、net は名前空間ではありません)。 すべて ポートが公開されます。