การเปิดเผยพอร์ตบนคอนเทนเนอร์ Docker สด


408

ฉันกำลังพยายามสร้างคอนเทนเนอร์ Docker ที่ทำหน้าที่เหมือนเครื่องเสมือนจริงเต็มรูปแบบ ฉันรู้ว่าฉันสามารถใช้คำแนะนำ EXPOSE ภายใน Dockerfile เพื่อเปิดเผยพอร์ตและฉันสามารถใช้การ-pตั้งค่าสถานะด้วยdocker runเพื่อกำหนดพอร์ต แต่เมื่อคอนเทนเนอร์กำลังทำงานจริงมีคำสั่งให้เปิด / แมปพอร์ตเพิ่มเติมอยู่หรือไม่

ตัวอย่างเช่นสมมติว่าฉันมีคอนเทนเนอร์ Docker ที่กำลังเรียกใช้ sshd มีคนอื่นใช้ container ssh's ในและติดตั้ง httpd มีวิธีการเปิดเผยพอร์ต 80 บนคอนเทนเนอร์และแมปกับพอร์ต 8080 บนโฮสต์เพื่อให้ผู้คนสามารถเยี่ยมชมเว็บเซิร์ฟเวอร์ที่ทำงานอยู่ในคอนเทนเนอร์โดยไม่ต้องรีสตาร์ทหรือไม่


1
คุณสามารถมอบ IP ที่กำหนดเส้นทางได้ในคอนเทนเนอร์ดังนั้นจึงไม่จำเป็นต้องทำการจับคู่พอร์ต
แมตต์

คำตอบ:


331

คุณไม่สามารถทำสิ่งนี้ผ่าน Docker แต่คุณสามารถเข้าถึงพอร์ตที่ไม่ได้รับการบรรจุของเครื่องโฮสต์ได้

หากคุณมีคอนเทนเนอร์ที่มีบางสิ่งกำลังทำงานอยู่บนพอร์ต 8000 คุณสามารถใช้งานได้

wget http://container_ip:8000

ในการรับที่อยู่ IP ของคอนเทนเนอร์ให้รันคำสั่ง 2:

docker ps

docker inspect container_name | grep IPAddress

ภายใน Docker shells จะเรียก iptables เมื่อคุณเรียกใช้รูปภาพดังนั้นอาจมีการเปลี่ยนแปลงบางอย่างในการทำงาน

วิธีเปิดเผยพอร์ตของคอนเทนเนอร์ 8000 บนโลคัลโฮสต์ของคุณพอร์ต 8001:

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

วิธีหนึ่งที่คุณสามารถทำสิ่งนี้ได้คือการตั้งค่าคอนเทนเนอร์อื่นด้วยการจับคู่พอร์ตที่คุณต้องการและเปรียบเทียบผลลัพธ์ของคำสั่งiptables-save (แม้ว่าฉันต้องลบตัวเลือกอื่น ๆ บางตัวที่บังคับให้ทราฟฟิกส่งผ่านนักเทียบท่า) พร็อกซี่)

หมายเหตุ: นี่เป็นการทำลายนักเทียบท่าดังนั้นควรทำโดยตระหนักว่ามันอาจสร้างควันสีน้ำเงินได้

หรือ

อีกทางเลือกหนึ่งคือดูตัวเลือก (ใหม่โพสต์ 0.6.6?) -P ซึ่งจะใช้พอร์ตโฮสต์แบบสุ่มและต่อสายเหล่านั้น

หรือ

ด้วย 0.6.5 คุณสามารถใช้คุณสมบัติลิงค์เพื่อสร้างคอนเทนเนอร์ใหม่ที่พูดถึงสิ่งที่มีอยู่ด้วยการถ่ายทอดเพิ่มเติมไปยังแฟล็ก container's นั้นหรือไม่? (ฉันยังไม่ได้ใช้ลิงค์)

หรือ

ด้วยนักเทียบท่า 0.11? คุณสามารถใช้docker run --net host ..เพื่อแนบคอนเทนเนอร์ของคุณโดยตรงกับอินเทอร์เฟซเครือข่ายของโฮสต์ (เช่น net ไม่เว้นระยะชื่อ) และทำให้พอร์ตทั้งหมดที่คุณเปิดในคอนเทนเนอร์ถูกเปิดเผย


6
สิ่งนี้ดูเหมือนจะไม่ทำงานกับนักเทียบท่า 1.3.0 เป็นอย่างน้อย กฎ DOCKER DNAT ถูกสร้างขึ้นเมื่อเรียกใช้นักเทียบท่าด้วย -p แต่ดูเหมือนว่าการเพิ่มด้วยตนเองจะไม่อนุญาตการเชื่อมต่อ การลบกฎอย่างผิดปกติในขณะที่ภาชนะกำลังทำงานดูเหมือนว่าจะไม่ทำให้กฎทำงานได้ ...
silasdavis

4
ขอบคุณ ฉันรู้สึกถึงความปลอดภัยที่พอร์ตที่ไม่ได้รับการสัมผัสนั้นปลอดภัย
seanmcl

การทำสิ่งต่าง ๆ โดยอัตโนมัติและการใช้ jq + sed อาจเป็นประโยชน์: CONTAINER_IP=$(docker inspect container_name | jq .[0].NetworkSettings.IPAddress | sed -r 's/\"([^\"]+)\"/\1/''])'); iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination ${CONTAINER_IP}:8000
ericson.cepeda

5
@ ericson.cepeda แทนที่จะใช้การแจ้งหนี้jqและsedคุณสามารถใช้-fตัวเลือกของdocker inspect:CONTAINER_IP=$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' container_name)
pwes

สำหรับผู้ที่ต้องการkmkeen.com/jshon jshon -e 0 -e NetworkSettings -e Networks -e bridge -e IPAddress -u
slf

138

นี่คือสิ่งที่ฉันจะทำ:

  • คอมมิทคอนเทนเนอร์สด
  • เรียกใช้คอนเทนเนอร์อีกครั้งด้วยภาพใหม่โดยเปิดพอร์ต (ฉันขอแนะนำให้ติดตั้งวอลลุ่มที่แชร์และเปิดพอร์ต ssh ด้วย)
sudo docker ps 
sudo docker commit <containerid> <foo/live>
sudo docker run -i -p 22 -p 8000:80 -m /data:/data -t <foo/live> /bin/bash

31
ส่วนสำคัญของคำถามของฉันคือสิ่งนี้ต้องเกิดขึ้นโดยไม่ต้องรีสตาร์ทคอนเทนเนอร์ ... การย้ายไปที่คอนเทนเนอร์ใหม่อาจเก็บไฟล์ไว้ แต่จะฆ่ากระบวนการที่กำลังทำงานอยู่ได้อย่างมีประสิทธิภาพและจะคล้ายกับการรีบูตเครื่องทางกายภาพ ฉันต้องทำสิ่งนี้โดยไม่เกิดอะไรขึ้น ขอบคุณแม้ว่า!
reberhardt

ไม่เป็นไร ฉันจะเปรียบเทียบมันมากกว่าเพื่อเริ่มต้นอินสแตนซ์แบบขนาน เนื่องจากทั้งคู่กำลังทำงานอยู่ (เก่าและใหม่) การพร็อกซีไปยังคอนเทนเนอร์ใหม่อาจทำได้ง่ายขึ้นเมื่อทำการย้ายข้อมูลที่จำเป็นเสร็จสิ้น
bosky101

ใช่อินสแตนซ์แบบขนานและการย้อนกลับแบบพร็อกซี่เป็นสาเหตุอันดับต้น ๆ ที่ฉันชอบนักเทียบท่า อย่างไรก็ตามในสถานการณ์นี้ฉันต้องเก็บรักษากระบวนการที่กำลังทำงานอยู่ทั้งหมดในคอนเทนเนอร์ที่อาจเริ่มต้นผ่าน SSH ในขณะที่ไฟล์ประมวลผลจะถูกเก็บไว้ในการสร้างอิมเมจและเริ่มต้นอินสแตนซ์แบบขนาน แต่ไฟล์เอ็กซีคิวต์จะไม่เริ่มต้นและอะไรก็ตามที่อยู่ใน RAM จะหายไป
reberhardt

6
ทำไมคุณถึงวิ่งsudo dockerและไม่ใช่แค่docker?
Thiago Figueiro

เคล็ดลับนี้ช่วยฉันได้มากเพราะฉันติดตั้งแพ็คเกจจำนวนมากในเครือข่ายที่ช้า เมื่อทำงานdocker commitฉันก็พร้อมที่จะทดสอบแอปพลิเคชันอีกครั้งแทนที่จะใช้เวลาหลายชั่วโมงเพื่อติดตั้งทุกอย่าง
gustavohenke

49

ในขณะที่คุณไม่สามารถเปิดเผยพอร์ตใหม่ของคอนเทนเนอร์ที่มีอยู่คุณสามารถเริ่มคอนเทนเนอร์ใหม่ในเครือข่ายนักเทียบท่าเดียวกันและนำมันไปข้างหน้าเพื่อรับส่งข้อมูลไปยังคอนเทนเนอร์ดั้งเดิม

# docker run \
  --rm \
  -p $PORT:1234 \
  verb/socat \
    TCP-LISTEN:1234,fork \
    TCP-CONNECT:$TARGET_CONTAINER_IP:$TARGET_CONTAINER_PORT

ตัวอย่างการทำงาน

เปิดเว็บบริการที่ฟังในพอร์ต 80 แต่ไม่ได้เปิดเผยพอร์ตภายใน 80 (โอ๊ะ!):

# docker run -ti mkodockx/docker-pastebin   # Forgot to expose PORT 80!

ค้นหาเครือข่ายนักเทียบท่า IP:

# docker inspect 63256f72142a | grep IPAddress
                    "IPAddress": "172.17.0.2",

เปิดตัวverb/socatด้วยพอร์ต 8080 ที่เปิดเผยและรับเพื่อส่งต่อการรับส่งข้อมูล TCP ไปยังพอร์ตของ IP นั้น:

# docker run --rm -p 8080:1234 verb/socat TCP-LISTEN:1234,fork TCP-CONNECT:172.17.0.2:80

ตอนนี้คุณสามารถเข้าถึง pastebin ได้ที่http: // localhost: 8080 /และคำขอของคุณจะsocat:1234ส่งต่อไปยังที่pastebin:80ใดและการตอบสนองจะเดินทางไปในเส้นทางเดียวกันในสิ่งที่ตรงกันข้าม


7
ฉลาดมาก! อาจใช้งานได้ดีกว่าverb/socat:alpineเนื่องจากรูปภาพนั้นมีรอยเท้า 5% (เว้นแต่คุณจะใช้งานร่วมกันไม่ได้กับ libc หรือ DNS )
jpaugh

3
นอกจากนี้ยังมีalpine/socat
Jamby

3
คำตอบที่ยอดเยี่ยม เรียบง่ายหนึ่งซับที่จะทำให้เสร็จโดยไม่ต้องแฮ็คสกปรก
Bruno Brant

2
มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉันขอบคุณ! ฉันต้องเพิ่มคำสั่งเรียกใช้--net myfoldername_defaultของฉันverb/socatตั้งแต่ฉันเริ่มต้นคอนเทนเนอร์ที่ไม่ถูกเปิดเผยในองค์ประกอบนักเทียบท่าซึ่งสร้างเครือข่าย
emazzotta

35

IPtables hacks ไม่ทำงานอย่างน้อยใน Docker 1.4.1

วิธีที่ดีที่สุดคือเรียกใช้คอนเทนเนอร์อื่นด้วยพอร์ตที่เปิดเผยและถ่ายทอดด้วย socat นี่คือสิ่งที่ฉันทำเพื่อ (ชั่วคราว) เชื่อมต่อกับฐานข้อมูลด้วย SQLPlus:

docker run -d --name sqlplus --link db:db -p 1521:1521 sqlplus

Dockerfile:

FROM debian:7

RUN apt-get update && \
    apt-get -y install socat && \
    apt-get clean

USER nobody

CMD socat -dddd TCP-LISTEN:1521,reuseaddr,fork TCP:db:1521

2
iptables แฮ็คควรจะเรียกใช้จากเครื่องโฮสต์ไม่ใช่คอนเทนเนอร์นักเทียบท่า มันคือการส่งต่อคำร้องขอไปยังพอร์ตบางตัวบนโฮสต์ไปยังพอร์ตคอนเทนเนอร์นักเทียบท่าที่เหมาะสม มันไม่ใช่นักเทียบท่าโดยเฉพาะเลยและคุณสามารถทำได้กับโฮสต์ที่ต่างกันโดยสิ้นเชิง คุณสามารถเพิ่มการจัดรูปแบบรหัสลงในไฟล์ Docker ของคุณได้หรือไม่? ดูเหมือนว่ามีประโยชน์ทีเดียว
AusIV

1
กุมภาพันธ์ 2559: เรียกใช้ Docker 1.9.1 นี่เป็นทางออกเดียวที่ประสบความสำเร็จสำหรับฉัน โซลูชัน IPTables ไม่ทำงาน ขอแนะนำให้ใช้FROMอิมเมจพื้นฐานเดียวกันกับคอนเทนเนอร์ DB ของคุณเพื่อการใช้ทรัพยากรอย่างมีประสิทธิภาพ
Excalibur

4
คุณอาจต้องการที่จะให้ apline / socatลอง มันมาพร้อมกับ socat ที่ติดตั้งไว้ล่วงหน้าและยอมรับตัวเลือก socat เป็นคำสั่งดังนั้นคุณไม่จำเป็นต้องเขียนไฟล์ Dockerfile เลย
trkoch

35

นี่คือแนวคิดอื่น ใช้ SSH เพื่อทำการส่งต่อพอร์ต สิ่งนี้มีประโยชน์ในการทำงานใน OS X (และอาจเป็น Windows) เมื่อโฮสต์ Docker ของคุณเป็น VM

docker exec -it <containterid> ssh -R5432:localhost:5432 <user>@<hostip>

4
ในกรณีของฉันภาพนักเทียบท่าที่ทำงานอยู่ไม่มีเลขฐานสอง ssh
Radu Toader

ฉันจำเป็นต้องสร้างคีย์ SSH บนเครื่องของฉันและใส่ลงในคอนเทนเนอร์ docker สำหรับสิ่งนี้หรือไม่?
Octavian

@octavian ssh-keygen -t rsa ภายในคอนเทนเนอร์ เพิ่ม pub key ให้กับ authorized_keys บนโฮสต์
Luke W

8

ฉันต้องจัดการกับปัญหาเดียวกันนี้และสามารถแก้ไขได้โดยไม่หยุดการทำงานของคอนเทนเนอร์ นี่เป็นวิธีแก้ปัญหาล่าสุดของเดือนกุมภาพันธ์ 2559 โดยใช้ Docker 1.9.1 อย่างไรก็ตามคำตอบนี้เป็นคำตอบโดยละเอียดของคำตอบ @ ricardo-branco แต่ในเชิงลึกสำหรับผู้ใช้ใหม่

ในสถานการณ์สมมติของฉันฉันต้องการเชื่อมต่อกับ MySQL ที่ทำงานอยู่ในคอนเทนเนอร์ชั่วคราวและเนื่องจากคอนเทนเนอร์ของแอปพลิเคชันอื่นเชื่อมโยงอยู่กับมันการหยุดการกำหนดค่าใหม่และการเรียกใช้คอนเทนเนอร์ฐานข้อมูลใหม่นั้นไม่ใช่การเริ่มต้น

เนื่องจากฉันต้องการเข้าถึงฐานข้อมูล MySQL ภายนอก (จาก Sequel Pro ผ่านทาง SSH tunneling) ฉันจะใช้พอร์ต33306บนเครื่องโฮสต์ (ไม่ใช่3306แค่ในกรณีที่มีอินสแตนซ์ MySQL ภายนอกทำงานอยู่)

ประมาณหนึ่งชั่วโมงของการปรับแต่งiptablesพิสูจน์แล้วว่าไร้ผลแม้ว่า:

ทีละขั้นตอนนี่คือสิ่งที่ฉันทำ:

mkdir db-expose-33306
cd db-expose-33306
vim Dockerfile

แก้ไขdockerfileวางไว้ภายใน:

# Exposes port 3306 on linked "db" container, to be accessible at host:33306
FROM ubuntu:latest # (Recommended to use the same base as the DB container)

RUN apt-get update && \
    apt-get -y install socat && \
    apt-get clean

USER nobody
EXPOSE 33306

CMD socat -dddd TCP-LISTEN:33306,reuseaddr,fork TCP:db:3306

จากนั้นสร้างภาพ:

docker build -t your-namespace/db-expose-33306 .

จากนั้นเรียกใช้โดยเชื่อมโยงไปยังคอนเทนเนอร์ที่ใช้งานอยู่ (ใช้-dแทน-rmเพื่อเก็บไว้ในพื้นหลังจนกว่าจะหยุดและลบอย่างชัดเจนฉันต้องการให้มันทำงานชั่วคราวในกรณีนี้)

docker run -it --rm --name=db-33306 --link the_live_db_container:db -p 33306:33306  your-namespace/db-expose-33306

คุณสามารถใช้ภาพ verb / socat หรือ alpine / socat โดยตรง ดูคำกริยา / socat
pjotr_dolphin

7

ในการเพิ่มโซลูชันคำตอบที่ยอมรับ iptablesฉันต้องเรียกใช้คำสั่งเพิ่มเติมอีกสองคำสั่งบนโฮสต์เพื่อเปิดสู่โลกภายนอก

HOST> iptables -t nat -A DOCKER -p tcp --dport 443 -j DNAT --to-destination 172.17.0.2:443
HOST> iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source 172.17.0.2 --destination 172.17.0.2 --dport https
HOST> iptables -A DOCKER -j ACCEPT -p tcp --destination 172.17.0.2 --dport https

หมายเหตุ: ฉันกำลังเปิดพอร์ต https (443) IP ภายในนักเทียบท่าของฉันคือ 172.17.0.2

หมายเหตุ 2: กฎเหล่านี้และชั่วขณะและจะคงอยู่จนกว่าจะรีสตาร์ทคอนเทนเนอร์


สิ่งนี้ใช้ได้กับฉัน ... แต่อย่างไรก็ตามภายหลังมีบาง Cavat อยู่ ตามหมายเหตุ 2 สิ่งนี้จะหยุดลงถ้าคอนเทนเนอร์เริ่มต้นใหม่อาจเป็น IP อื่นแล้ว แต่นักเทียบท่าที่สำคัญกว่าไม่มีความคิดเกี่ยวกับรายการ iptable นี้ดังนั้นจะไม่ลบรายการเหล่านั้นเมื่อคุณเริ่มบริการใหม่ในภายหลังและรับตัวเชื่อมต่อเพื่อดำเนินการอย่างถูกต้อง ผลลัพธ์คือรายการ iptable หลายรายการที่เหมือนกันทุกประการซึ่งทำให้รายการล้มเหลวโดยไม่มีข้อผิดพลาดหรือข้อบ่งชี้เกี่ยวกับสาเหตุเพียงเล็กน้อย เมื่อกฎพิเศษถูกปกครองแล้วปัญหาก็จะหายไป ในคำอื่น ๆ ให้ดูที่ตาราง IP ของคุณอย่างระมัดระวังหลังจากการเปลี่ยนแปลงใด ๆ
anthony

5

คุณสามารถใช้ SSH เพื่อสร้างอุโมงค์และแสดงที่เก็บของคุณในโฮสต์

คุณสามารถทำได้ทั้งสองวิธีจากคอนเทนเนอร์ไปยังโฮสต์และจากโฮสต์ไปยังคอนเทนเนอร์ แต่คุณต้องการเครื่องมือ SSH เช่น OpenSSH ทั้งคู่ (ไคลเอนต์หนึ่งและเซิร์ฟเวอร์อีกอัน)

ตัวอย่างเช่นในคอนเทนเนอร์คุณสามารถทำได้

$ yum install -y openssh openssh-server.x86_64
service sshd restart
Stopping sshd:                                             [FAILED]
Generating SSH2 RSA host key:                              [  OK  ]
Generating SSH1 RSA host key:                              [  OK  ]
Generating SSH2 DSA host key:                              [  OK  ]
Starting sshd:                                             [  OK  ]
$ passwd # You need to set a root password..

คุณสามารถค้นหาที่อยู่ IP ของคอนเทนเนอร์ได้จากบรรทัดนี้ (ในคอนเทนเนอร์):

$ ifconfig eth0 | grep "inet addr" | sed 's/^[^:]*:\([^ ]*\).*/\1/g'
172.17.0.2

จากนั้นในโฮสต์คุณสามารถทำได้:

sudo ssh -NfL 80:0.0.0.0:80 root@172.17.0.2

สิ่งนี้ใช้ได้ผลสำหรับฉันด้วยการแก้ไขเพียงเล็กน้อยเดียว ... คำสั่งนี้ใช้ได้: sudo ssh -NfL 25252: 172.17.0.50: 22 $ USER @ localhost
Alexander Guo

3

ในกรณีที่ไม่มีคำตอบสำหรับใครบางคน - ตรวจสอบว่าคอนเทนเนอร์เป้าหมายของคุณทำงานอยู่ในเครือข่ายนักเทียบท่าหรือไม่:

CONTAINER=my-target-container
docker inspect $CONTAINER | grep NetworkMode
        "NetworkMode": "my-network-name",

บันทึกไว้เพื่อใช้ในภายหลังในตัวแปร$NET_NAME:

NET_NAME=$(docker inspect --format '{{.HostConfig.NetworkMode}}' $CONTAINER)

ถ้าใช่คุณควรเรียกใช้พร็อกซีคอนเทนเนอร์ในเครือข่ายเดียวกัน

ถัดไปค้นหาชื่อแทนสำหรับคอนเทนเนอร์:

docker inspect $CONTAINER | grep -A2 Aliases
                "Aliases": [
                    "my-alias",
                    "23ea4ea42e34a"

บันทึกไว้เพื่อใช้ในภายหลังในตัวแปร$ALIAS:

ALIAS=$(docker inspect --format '{{index .NetworkSettings.Networks "'$NET_NAME'" "Aliases" 0}}' $CONTAINER)

ตอนนี้ทำงานsocatในคอนเทนเนอร์ในเครือข่าย$NET_NAMEเพื่อเชื่อมต่อกับ$ALIASพอร์ตที่ว่าง (แต่ไม่เผยแพร่) ของed container:

docker run \
    --detach --name my-new-proxy \
    --net $NET_NAME \
    --publish 8080:1234 \
    alpine/socat TCP-LISTEN:1234,fork TCP-CONNECT:$ALIAS:80

2

คุณสามารถใช้เครือข่ายโอเวอร์เลย์เช่นWeave Netซึ่งจะกำหนดที่อยู่ IP ที่ไม่ซ้ำกันให้กับแต่ละคอนเทนเนอร์และแสดงพอร์ตทั้งหมดให้กับทุกส่วนคอนเทนเนอร์ของเครือข่ายโดยปริยาย

สานนอกจากนี้ยังมีการรวมเครือข่ายโฮสต์ มันถูกยกเลิกโดยปริยาย แต่ถ้าคุณต้องการที่จะยังสามารถเข้าถึงที่อยู่ IP ภาชนะ (และพอร์ตทั้งหมดของมัน) weave exposeจากโฮสต์ที่คุณสามารถวิ่งเพียง

การเปิดเผยแบบเต็ม: ฉันทำงานที่ Weaveworks


2

มี wrapper HAProxy ที่มีประโยชน์

docker run -it -p LOCALPORT:PROXYPORT --rm --link TARGET_CONTAINER:EZNAME -e "BACKEND_HOST=EZNAME" -e "BACKEND_PORT=PROXYPORT" demandbase/docker-tcp-proxy

สิ่งนี้จะสร้าง HAProxy ไปยังคอนเทนเนอร์เป้าหมาย peasy ง่าย


2

นี่คือวิธีแก้ปัญหาบางอย่าง:

https://forums.docker.com/t/how-to-expose-port-on-running-container/3252/12

วิธีแก้ปัญหาการแมปพอร์ตขณะที่รันคอนเทนเนอร์

นักเทียบท่า run -d --net = host myvnc

ที่จะเปิดเผยและจับคู่พอร์ตกับโฮสต์ของคุณโดยอัตโนมัติ


1

อ่านคำตอบของRicardoก่อน สิ่งนี้ใช้ได้สำหรับฉัน

อย่างไรก็ตามมีสถานการณ์ที่ไม่สามารถใช้งานได้หากมีการเริ่มต้นคอนเทนเนอร์ที่ใช้โดยใช้นักเทียบท่าประกอบ นี่เป็นเพราะนักเทียบท่าเขียน (ฉันกำลังเรียกใช้นักเทียบท่า 1.17) สร้างเครือข่ายใหม่ วิธีแก้ไขสถานการณ์นี้จะเป็นอย่างไร

docker network ls

จากนั้นผนวกสิ่งต่อไปนี้ docker run -d --name sqlplus --link db:db -p 1521:1521 sqlplus --net network_name


0

เป็นไปไม่ได้ที่จะทำการแมปพอร์ตแบบสด แต่มีหลายวิธีที่คุณสามารถให้ตัวเชื่อมต่อคอนเทนเนอร์จำนวนเท่าใดกับอินเทอร์เฟซจริงเช่นเครื่องเสมือนจะมี

การเชื่อมต่อ Macvlan

เทียบท่าในขณะนี้รวมถึงไดรเวอร์เครือข่าย Macvlan สิ่งนี้จะแนบเครือข่ายนักเทียบท่ากับอินเทอร์เฟซ "โลกแห่งความเป็นจริง" และช่วยให้คุณกำหนดที่อยู่เครือข่ายโดยตรงไปยังคอนเทนเนอร์ (เช่นโหมดบริดจ์เครื่องเสมือน)

docker network create \
    -d macvlan \
    --subnet=172.16.86.0/24 \
    --gateway=172.16.86.1  \
    -o parent=eth0 pub_net

pipeworkยังสามารถแมปอินเทอร์เฟซจริงลงในคอนเทนเนอร์หรือตั้งค่าอินเทอร์เฟซย่อยใน Docker รุ่นเก่า

IP การกำหนดเส้นทาง

หากคุณมีการควบคุมเครือข่ายคุณสามารถกำหนดเส้นทางเครือข่ายเพิ่มเติมไปยังโฮสต์ Docker ของคุณเพื่อใช้ในคอนเทนเนอร์

จากนั้นคุณกำหนดเครือข่ายนั้นไปยังคอนเทนเนอร์และตั้งค่าโฮสต์ Docker ของคุณเพื่อกำหนดเส้นทางแพ็กเก็ตผ่านเครือข่ายนักเทียบท่า

อินเตอร์เฟสโฮสต์ที่แบ่งใช้

--net hostตัวเลือกที่ช่วยให้อินเตอร์เฟซที่เจ้าภาพจะใช้ร่วมกันลงในภาชนะ แต่ตอนนี้อาจจะไม่ติดตั้งที่ดีสำหรับการทำงานหลายคอนเทนเนอร์บนโฮสต์หนึ่งเนื่องจากลักษณะที่ใช้ร่วมกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.