หลังจากการติดตั้งนักเทียบท่าคุณมี 3 เครือข่ายตามค่าเริ่มต้น:
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
ฉันพยายามทำให้มันเรียบง่าย ดังนั้นหากคุณเริ่มคอนเทนเนอร์ตามค่าเริ่มต้นระบบจะสร้างคอนเทนเนอร์ภายในเครือข่ายบริดจ์ (docker0)
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
ใน dockerfile ของ jenkins พอร์ต8080
และ50000
ถูกเปิดเผย พอร์ตเหล่านั้นถูกเปิดสำหรับคอนเทนเนอร์บนเครือข่ายบริดจ์ เพื่อให้ทุกอย่างภายในเครือข่ายสะพานที่สามารถเข้าถึงภาชนะในพอร์ตและ8080
50000
ทุกอย่างในเครือข่ายสะพานอยู่ในช่วงของเอกชน"Subnet": "172.17.0.0/16",
หากคุณต้องการที่จะเข้าถึงได้จากภายนอกที่คุณต้อง map -p 8080:8080
พอร์ตด้วย สิ่งนี้จะแมปพอร์ตของคอนเทนเนอร์ของคุณกับพอร์ตของเซิร์ฟเวอร์จริงของคุณ (เครือข่ายโฮสต์) ดังนั้นการเข้าถึงเซิร์ฟเวอร์ของคุณ8080
จะกำหนดเส้นทางไปยัง bridgenetwork บนพอร์ตของ8080
คุณ
ตอนนี้คุณมีเครือข่ายโฮสต์แล้ว ซึ่งไม่ได้สร้างเครือข่ายคอนเทนเนอร์ ดังนั้นหากคุณเริ่มคอนเทนเนอร์ในเครือข่ายโฮสต์จะมีลักษณะดังนี้ (เป็นคอนเทนเนอร์แรก):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
ความแตกต่างคือกับพอร์ต ตอนนี้คอนเทนเนอร์ของคุณอยู่ในเครือข่ายโฮสต์ของคุณแล้ว ดังนั้นหากคุณเปิดพอร์ต8080
บนโฮสต์ของคุณคุณจะเข้าถึงคอนเทนเนอร์ทันที
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
ฉันได้เปิดพอร์ต8080
ในไฟร์วอลล์ของฉันและเมื่อ8080
ฉันเข้าถึงเซิร์ฟเวอร์ของฉันบนพอร์ตฉันกำลังเข้าถึงเจนกินส์ของฉัน ฉันคิดว่าบล็อกนี้ยังมีประโยชน์ในการทำความเข้าใจให้ดีขึ้น
--net=host
ภายใน Dockerfile