ฉันไม่แน่ใจว่าฉันเข้าใจผิดบางอย่างที่นี่ แต่ดูเหมือนว่าเป็นไปได้ที่จะตั้งค่าการแมปพอร์ตด้วยการสร้างคอนเทนเนอร์ใหม่จากรูปภาพ มีวิธีกำหนดการแมปพอร์ตให้กับคอนเทนเนอร์ 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กล่าว forwardings พอร์ตสามารถระบุเฉพาะกับ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 ตัวแรกเป็นพอร์ตภายในเครื่องและ 8080 ตัวที่สองคือพอร์ตคอนเทนเนอร์
docker start
?
หากโดย "มีอยู่" คุณหมายถึง "กำลังทำงาน" แสดงว่าเป็นไปไม่ได้ที่จะเพิ่มการแมปพอร์ต (ในปัจจุบัน)
อย่างไรก็ตามคุณสามารถเพิ่มอินเทอร์เฟซเครือข่ายใหม่ด้วยเช่นPipeworkหากคุณจำเป็นต้องเปิดเผยบริการในภาชนะที่ใช้งานอยู่โดยไม่ต้องหยุด / เริ่มต้นใหม่
ไม่แน่ใจว่าคุณสามารถใช้การแมปพอร์ตกับคอนเทนเนอร์ที่รันอยู่หรือไม่ คุณสามารถใช้การส่งต่อพอร์ตในขณะที่เรียกใช้คอนเทนเนอร์ที่แตกต่างจากการสร้างคอนเทนเนอร์ใหม่
$ docker run -p <public_port>:<private_port> -d <image>
จะเริ่มเรียกใช้คอนเทนเนอร์ บทช่วยสอนนี้อธิบายการเปลี่ยนเส้นทางพอร์ต
docker run
สร้างและเริ่มคอนเทนเนอร์ใหม่ มันเทียบเท่ากับการทำตามด้วยdocker create
docker start
การแก้ไขhostconfig.jsonดูเหมือนจะไม่ทำงานในขณะนี้ มันจะจบลงด้วยพอร์ตที่ถูกเปิดเผย แต่ไม่ได้เผยแพร่ไปยังโฮสต์ การผูกมัดและสร้างตู้คอนเทนเนอร์นั้นไม่ใช่วิธีที่ดีที่สุดสำหรับฉัน ไม่มีใครพูดถึงdocker network
?
ทางออกที่ดีที่สุดคือการใช้ reverse proxy ภายในเครือข่ายเดียวกัน
สร้างเครือข่ายใหม่หากคอนเทนเนอร์ก่อนหน้าของคุณไม่ได้อยู่ในเครือข่ายที่มีชื่อ
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
เลือกที่จะลบ default.confใน nginx
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;
}
ในตัวอย่างของ Fujimoto Youichi 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
ใช้รหัสของภาชนะเป้าหมายของคุณและไปที่:
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 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 เพื่อให้บรรลุสิ่งนี้ได้อย่างง่ายดาย
ฉันใช้อูบุนตูโฮสต์และอิมเมจจาก docker
เมื่อจำเป็นต้องทำการแมปพอร์ตใหม่
ภายใน docker ให้รันคำสั่งต่อไปนี้
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1 เป็น ip ของส่วนต่อประสานนักเชื่อมต่อ (คุณสามารถรับสิ่งนี้ได้จากการทำงาน
ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
บนโฮสต์)
ที่นี่ฉันมีพอร์ต 8888 ในเครื่องที่แมปกลับไปยังโฮสต์ 8888 คุณสามารถเปลี่ยนพอร์ตได้ตามต้องการ
หากคุณต้องการพอร์ตเพิ่มอีกหนึ่งพอร์ตคุณสามารถฆ่า ssh และเพิ่มหนึ่งบรรทัดของ -R ไปยังพอร์ตใหม่ด้วยพอร์ตใหม่
ฉันได้ทดสอบสิ่งนี้กับ netcat
/var/lib/docker/containers/${container_id}
ไดเรกทอรีและแก้ไขhostconfig.json
PortBindings.HostPort
ที่คุณต้องการเปลี่ยนแปลงสำหรับผู้ใช้ Windows & Mac มีวิธีอื่นที่ง่ายและเป็นมิตรในการเปลี่ยนพอร์ตการทำแผนที่:
ดาวน์โหลด kitematic
ไปที่หน้าการตั้งค่าของคอนเทนเนอร์บนแท็บพอร์ตคุณสามารถแก้ไขพอร์ตที่เผยแพร่ได้โดยตรง
เริ่มภาชนะอีกครั้ง
คำตอบสั้น ๆ : คุณไม่สามารถกำหนดการจับคู่พอร์ตให้กับคอนเทนเนอร์ Docker ที่มีอยู่ได้
คุณต้องมีคอนเทนเนอร์ใหม่ ... จัดการกับมัน
หากคุณเพียงต้องการเปลี่ยนพอร์ตของคอนเทนเนอร์ที่ใช้งานอยู่คุณจะต้อง:
sudo docker หยุด NAME
sudo docker run -d -p 81:80 NAME
ที่ไหน:
"-d" เป็นพื้นหลัง / deamon the docker
"-p" เปิดใช้งานการแมปพอร์ต
พอร์ต "81" ภายนอก (เปิดเผย) ที่คุณใช้เพื่อเข้าถึงด้วยเบราว์เซอร์ของคุณ
คอนเทนเนอร์นักเทียบท่าภายใน "80" ฟังพอร์ต
docker run
คำสั่งNAME
คือชื่อของอิมเมจเพื่อรันคอนเทนเนอร์ในขณะที่ในdocker stop
การNAME
อ้างถึงชื่อของคอนเทนเนอร์ที่จะหยุด