ここで何かを誤解したかどうかはわかりませんが、イメージから新しいコンテナを作成することによってのみポートマッピングを設定できるように思われます。既存のDockerコンテナーにポートマッピングを割り当てる方法はありますか?
ここで何かを誤解したかどうかはわかりませんが、イメージから新しいコンテナを作成することによってのみポートマッピングを設定できるように思われます。既存のDockerコンテナーにポートマッピングを割り当てる方法はありますか?
回答:
次の場所でhostconfig.json
ファイルを直接編集して、ポートマッピングを変更できます。
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
[hash_of_the_container]はdocker inspect <container_name>
コマンドを使用して決定でき、「Id」フィールドの値はハッシュです。
1) stop the container
2) stop docker service (per Tacsiazuma's comment)
3) change the file
4) restart your docker engine (to flush/clear config caches)
5) start the container
したがって、このアプローチでイメージを作成する必要はありません。ここで再起動フラグを変更することもできます。
PS ホストマシンごとにドッカーエンジンを正しく再起動する方法については、https://docs.docker.com/engine/admin/にアクセスしてください。私は使用sudo systemctl restart docker
のUbuntu 16.04上で実行されている私のドッカエンジンを再起動します
hostconfig.json
を変更config.v2.json
し、これを機能させることが重要です。詳細を確認するには、@ rohitmohtaが提供するリンクを使用してください。
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
ttyが実行されたら、次のことができます/ var / lib /
この問題にも興味があります。
以下のよう@Thasmoが述べたように、ポート転送はONLYで指定することができますdocker run
(とdocker create
)コマンド。
他のコマンドにdocker start
は-p
オプションがなく、docker port
現在の転送のみを表示します。
ポート転送を追加するには、常に次の手順に従います。
コンテナの実行を停止する
docker stop test01
コンテナをコミットする
docker commit test01 test02
注:上記test02
は、私がtest01
コンテナから構築している新しいイメージです。
コミットされたイメージから再実行
docker run -p 8080:8080 -td test02
最初の8080はローカルポートで、2番目の8080はコンテナポートです。
docker start
ますか?
実行中のコンテナーにポートマッピングを適用できるかどうかは不明です。新しいコンテナーの作成とは異なるコンテナーの実行中にポート転送を適用できます。
$ docker run -p <public_port>:<private_port> -d <image>
コンテナの実行を開始します。このチュートリアルでは、ポートのリダイレクトについて説明します。
docker run
新しいコンテナを作成して開始します。これは、doのdocker create
後にを続けた場合と同じdocker start
です。
hostconfig.jsonの編集が機能していないようです。そのポートが公開されていてホストに公開されていないだけです。コンテナをコミットして再作成することは、私にとって最善の方法ではありません。誰も言及していませんdocker network
か?
最善の解決策は、同じネットワーク内でリバースプロキシを使用することです。
以前のコンテナが名前付きコンテナにない場合は、新しいネットワークを作成します。
docker network create my_network
作成したネットワークに既存のコンテナーを結合します
docker network connect my_network my_existing_container
同じネットワークに参加して、必要なポートを公開するリバースプロキシサービス(nginxなど)を開始します
docker run -d --name nginx --network my_network -p 9000:9000 nginx
オプションでnginx のdefault.confを削除します
docker exec nginx rm /etc/nginx/conf.d/default.conf
新しいnginx構成を作成する
server
{
listen 9000;
location / {
proxy_pass http://my_existing_container:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
設定をnginxコンテナにコピーします。
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
nginxを再起動します
docker restart nginx
利点:新しいポートを公開するために、ビジネスコンテナーに触れることなく、必要に応じてnginxコンテナーを安全に停止/更新/再作成できます。nginxのゼロダウンタイムが必要な場合は、同じネットワークに参加するリバースプロキシサービスをさらに追加することができます。さらに、コンテナは複数のネットワークに参加できます。
編集:
非HTTPサービスをリバースプロキシするために、構成ファイルは少し異なります。以下に簡単な例を示します。
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
藤本洋一の例test01
はコンテナtest02
ですが、画像です。
実行する前にdocker run
、元のコンテナを削除してから、コンテナに同じ名前を再度割り当てることができます。
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
(-P
手動で割り当てるのではなく、ポートをランダムなポートに公開するために使用します)。
実行docker run <NAME>
すると、新しいイメージが生成されますが、これはおそらく望んでいるものではありません。
現在の画像を変更したい場合は、以下を実行してください。
docker ps -a
ターゲットコンテナのIDを取得して、次の場所に移動します。
cd /var/lib/docker/containers/<conainerID><and then some:)>
コンテナを停止します。
docker stop <NAME>
ファイルを変更する
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
そしてファイルを変更する
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
Dockerを再起動すると動作します。
逆に、Dockerの深度構成に慣れていない場合は、IPtablesが役に立ちます。
iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}
iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}
iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}
これはトリックであり、私のシナリオでこれが機能することをお勧めしません。コンテナーを停止できなかったため、同様に役立つことを願っています。
DOCKER_PORT
する場合MACHINE_PORT
、どの部分を変更する必要がありますか?
sshのような便利なツールを使用して、これを簡単に実現します。
私はubuntuホストとubuntuベースのDockerイメージを使用していました。
新しいポートをマッピングする必要がある場合、
Docker内で次のコマンドを実行します
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1は、DockerインターフェイスのIPでした(ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
ホストで実行することで取得でき
ます)。
ここでは、ローカルの8888ポートをホストの8888にマッピングしました。必要に応じてポートを変更できます。
もう1つのポートが必要な場合は、sshを強制終了し、新しいポートを使用してそれに-Rの行を1つ追加できます。
これをnetcatでテストしました。
@ Fujimoto-Youichiの応答を補足するものとして
を使用$ docker run -P CONTAINER
して、コンテナーの作成中にポートをランダムにマップすることもできますが、セキュリティascpectに注意してください!
-P
eq to--publish-all
: "すべての公開されたポートをランダムなポートに公開します"、
次にdocker inspect CONTAINER
、以下の画像に示すように、ポートマッピングのフィンを実行します。
詳細について読むdocker run -P
にドッカラン
WindowsおよびMacユーザーの場合、マッピングポートを変更する簡単で使いやすい方法がもう1つあります。
kitematicをダウンロード
コンテナーの設定ページに移動し、[ポート]タブで、公開されているポートを直接変更できます。
コンテナをもう一度起動します
短い回答:ポートマッピングを既存のDockerコンテナーに割り当てることはできません
新しいコンテナが必要です...それに対処してください。
実行中のコンテナーのポートを変更するだけの場合は、次のようにします。
sudo docker stop NAME
sudo docker run -d -p 81:80 NAME
ここで:
「-d」を背景に/ Dockerをデーモン化
"-p"ポートマッピングを有効にする
ブラウザでアクセスするために使用する "81"外部(公開)ポート
「80」内部Dockerコンテナーの待機ポート
docker run
コマンドNAME
で一方からコンテナを実行するために画像の名前で停止するコンテナの名前を指します。docker stop
NAME