วิธีเข้าถึงพอร์ตโฮสต์จากคอนเทนเนอร์นักเทียบท่า


278

ฉันมีนักเทียบท่าที่ใช้งานเจนกินส์ ในฐานะส่วนหนึ่งของกระบวนการสร้างฉันจำเป็นต้องเข้าถึงเว็บเซิร์ฟเวอร์ที่เรียกใช้ในเครื่องบนเครื่องโฮสต์ มีวิธีโฮสต์เว็บเซิร์ฟเวอร์ (ซึ่งสามารถกำหนดค่าให้ทำงานบนพอร์ต) สามารถสัมผัสกับภาชนะเจนกินส์?

แก้ไข: ฉันใช้นักเทียบท่าโดยกำเนิดบนเครื่อง Linux

UPDATE:

นอกจาก @larsks ตอบด้านล่างเพื่อรับที่อยู่ IP ของ Host IP จากเครื่องโฮสต์ฉันทำดังต่อไปนี้:

ip addr show docker0 | grep -Po 'inet \K[\d.]+'

ใช้ความคิดเห็นตั้งแต่นี้เป็นคำตอบที่น่ากลัว แต่ฉันเชื่อว่าคุณสามารถเข้าถึงได้ใน 172.17.1.78 - เว้นแต่ว่านี่เป็นการตั้งค่า boot2docker
CashIsClay

@CashIsClay ฉันลองและได้รับข้อผิดพลาดนี้ยังคงcurl: (7) Failed to connect to 172.17.1.78 port 7000: No route to host
Tri Nguyen

คุณไม่ได้ระบุ คุณใช้ boot2docker หรือว่าคุณกำลังใช้ Docker อยู่แล้วบน Linux?
larsks

@ larsks ขอโทษฉันเพิ่งปรับปรุงคำถาม - ฉันใช้มันโดยกำเนิดบน Linux
Tri Nguyen

คำตอบ:


206

เมื่อรัน Docker บน Linux คุณสามารถเข้าถึงบริการโฮสต์โดยใช้ที่อยู่ IP ของdocker0อินเทอร์เฟซ จากภายในคอนเทนเนอร์นี่จะเป็นเส้นทางเริ่มต้นของคุณ

ตัวอย่างเช่นในระบบของฉัน:

$ ip addr show docker0
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link 
       valid_lft forever preferred_lft forever

และภายในภาชนะบรรจุ:

# ip route show
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  src 172.17.0.4 

ค่อนข้างง่ายที่จะแยกที่อยู่ IP นี้โดยใช้เชลล์สคริปต์แบบง่าย:

#!/bin/sh

hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip

คุณอาจต้องแก้ไขiptablesกฎบนโฮสต์ของคุณเพื่ออนุญาตการเชื่อมต่อจากคอนเทนเนอร์ Docker สิ่งนี้จะทำเคล็ดลับ:

# iptables -A INPUT -i docker0 -j ACCEPT

นี่จะอนุญาตให้เข้าถึงพอร์ตใด ๆ บนโฮสต์จากคอนเทนเนอร์ Docker โปรดทราบว่า:

  • มีการจัดระเบียบกฎ iptables และกฎนี้อาจหรืออาจไม่ทำในสิ่งที่ถูกต้องขึ้นอยู่กับกฎอื่น ๆ มาก่อน

  • คุณจะสามารถเข้าถึงบริการโฮสต์ที่ (a) กำลังฟังINADDR_ANY(aka 0.0.0.0) หรือที่กำลังฟังบนdocker0อินเตอร์เฟสอย่างชัดเจน


1
ขอบคุณ การที่อยู่ IP ได้รับสิ่งที่จำเป็นสำหรับฉันโดยไม่ต้องแก้ไข iptables :) ความ
ไตรเหงียน


7
แล้ว Docker สำหรับ MAC ล่ะ? AFAIK ไม่มีเครือข่ายนักเทียบท่า 0 ที่ใช้ได้สำหรับ "นักเทียบท่าสำหรับ MAC" ในกรณีนั้นฉันจะเชื่อมต่อโฮสต์จากคอนเทนเนอร์ได้อย่างไร
วีเจย์

17
หากคุณใช้การเทียบท่าสำหรับ Mac วี 17.06 หรือสูงกว่าเพียงแค่ใช้docker.for.mac.localhostแทนหรือlocalhost 127.0.0.1นี่คือdoc
Merito

1
ฉันได้ใช้ชื่อโฮสต์ของโฮสต์แทนการรับที่อยู่ IP (คำสั่ง hostname บนโฮสต์)
Marek F

312

สำหรับ macOS และ Windows

นักเทียบท่า v 18.03 ขึ้นไป (ตั้งแต่วันที่ 21 มีนาคม 2561)

ใช้ที่อยู่ IP ภายในของคุณหรือเชื่อมต่อกับชื่อ DNS พิเศษhost.docker.internalซึ่งจะแก้ไขไปยังที่อยู่ IP ภายในที่โฮสต์ใช้

การสนับสนุน Linux รอการhttps://github.com/docker/for-linux/issues/264

MacOS พร้อม Docker รุ่นก่อนหน้า

นักเทียบท่าสำหรับ Mac v 17.12 ถึง v 18.02

เหมือนข้างบน แต่ใช้docker.for.mac.host.internalแทน

นักเทียบท่าสำหรับ Mac v 17.06 ถึง v 17.11

เหมือนข้างบน แต่ใช้docker.for.mac.localhostแทน

นักเทียบท่าสำหรับ Mac 17.05 และต่ำกว่า

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

sudo ifconfig lo0 alias 123.123.123.123/24

จากนั้นให้แน่ใจว่าคุณเซิร์ฟเวอร์ฟัง IP 0.0.0.0ดังกล่าวข้างต้นหรือ หากกำลังฟังบน localhost 127.0.0.1จะไม่ยอมรับการเชื่อมต่อ

จากนั้นเพียงชี้คอนเทนเนอร์นักเทียบท่าของคุณไปที่ IP นี้และคุณสามารถเข้าถึงเครื่องโฮสต์ได้!

ในการทดสอบคุณสามารถเรียกใช้บางอย่างเช่นcurl -X GET 123.123.123.123:3000ภายในคอนเทนเนอร์

นามแฝงจะรีเซ็ตทุกครั้งที่ทำการรีบูตดังนั้นสร้างสคริปต์เริ่มต้นหากจำเป็น

วิธีแก้ไขปัญหาและเอกสารเพิ่มเติมที่นี่: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds


ฉันทดสอบสิ่งนี้สำเร็จแล้ว ไม่จำเป็นต้องปิดไฟร์วอลล์
2560

15
ตั้งแต่วันที่ 17.06 เป็นต้นไปจะเปิดตัวในเดือนมิถุนายน 2560 ข้อเสนอแนะของพวกเขาคือเชื่อมต่อกับชื่อ DNS เฉพาะ Mac เท่านั้นdocker.for.mac.localhostซึ่งจะแก้ไขไปยังที่อยู่ IP ภายในที่โฮสต์ใช้! ... ฉันทดสอบแล้วและมันใช้งานได้จริง! :)
Kyr

ระบุคำตอบสำหรับผู้ใช้ Mac อย่างฉัน ขอบคุณ สิ่งหนึ่งที่ฉันไม่เข้าใจคือทำไมip route show | awk '/default/ {print $3}'มอบ IP หนึ่งและdocker.for.mac.localhostเป็นอีกIP หนึ่ง
dmmd

8
เปลี่ยนเป็นhost.docker.internal docs.docker.com/docker-for-mac/networking/…
สโนว์บอล

1
แนะนำให้ใช้host.docker.internalในคอนเทนเนอร์นักเทียบท่าและกำหนดค่า127.0.0.1 host.docker.internalในไฟล์โฮสต์
Junlin

84

ใช้--net="host"ในdocker runคำสั่งของคุณจากนั้นlocalhostในคอนเทนเนอร์นักเทียบท่าของคุณจะชี้ไปที่โฮสต์นักเทียบท่าของคุณ


15
จะไม่ทำงานสำหรับผู้ที่ใช้ Dpcker สำหรับ Windows / Docker สำหรับ Mac เท่าที่ฉันเข้าใจเนื่องจากภาชนะที่ทำงานในสภาพแวดล้อมเสมือนจริง: Hyper-V (Windows) / xhyve (Mac)
ninjaboy

6
นี้! นี่คือคำตอบ!
user3751385

14
เพียงเพื่อบันทึก: ภายใน Docker Componse network_mode: "host"
jbarros

สิ่งนี้ไม่ทำงานสำหรับฉันใน Docker สำหรับ Mac เวอร์ชั่น 19.03.1 บนไคลเอ็นต์และเซิร์ฟเวอร์ ฉันหวังว่ามันจะใช้งานได้ แต่ก็ไม่เป็นเช่นนั้น
ดินเหนียว

1
แม้ว่าผมบน Mac ก็ทำงานได้เมื่อคุณต้องการการสื่อสารระหว่างสองภาชนะท่าเรือและที่ผมเปลี่ยนแอพลิเคชันทั้งหมดไปที่ภาพนักเทียบท่ามันก็เพียงพอสำหรับฉัน
bormat

26

โซลูชันที่ประกอบไปด้วย docker-compose: สำหรับการเข้าถึงบริการโฮสต์คุณสามารถใช้network_modeพารามิเตอร์ https://docs.docker.com/compose/compose-file/#network_mode

version: '3'
services:
  jenkins:
    network_mode: host

แก้ไข 2020-04-27: แนะนำให้ใช้ในสภาพแวดล้อมการพัฒนาท้องถิ่นเท่านั้น


ถ้าเช่นนั้นจะเข้าถึงเจนกินส์ได้อย่างไร? ดูเหมือนว่าการส่งต่อพอร์ตไม่ทำงานหากใช้โหมดเครือข่ายโฮสต์
Jeff Tian

1
มันเป็นวิธีที่มีความเสี่ยงและไม่แนะนำเลย เราไม่ควรเปิดเครือข่ายโฮสต์ของเราไปยังตู้คอนเทนเนอร์เว้นแต่ต้องการอย่างชัดเจน
Fatemeh Majd

12

ปัจจุบันวิธีที่ง่ายที่สุดในการทำเช่นนี้บน Mac และ Windows กำลังใช้โฮสต์host.docker.internalซึ่งแก้ไขเป็นที่อยู่ IP ของเครื่องโฮสต์ น่าเสียดายที่มันยังไม่สามารถใช้งานกับ linux ได้ (จนถึงเดือนเมษายน 2018)


วิธีนี้ใช้ได้กับ Docker รุ่น 19.03.1 วิธีแก้ปัญหาอื่น ๆ ที่ระบุในที่นี้ไม่สามารถใช้งานได้ เอกสารนี้มีไว้ที่docs.docker.com/docker-for-mac/networking/ ......
Clay

12

ฉันสร้างคอนเทนเนอร์นักเทียบท่าเพื่อทำสิ่งนั้น https://github.com/qoomon/docker-host

จากนั้นคุณสามารถใช้ชื่อคอนเทนเนอร์เพื่อเข้าถึงระบบโฮสต์เช่น curl http://dockerhost:9200


นั่นเป็นทางออกที่ฉลาด คุณทราบหรือไม่ว่ามีสิ่งใดที่ใช้สิ่งนี้กับการจราจรจำนวนมาก? อาจมีค่าใช้จ่ายในการพร็อกซีการรับส่งข้อมูลทั้งหมดผ่านคอนเทนเนอร์นี้
bcoughlan

3
ใช่มันใช้งานได้ค่อนข้างดีไม่มีค่าใช้จ่ายเลยเพราะมันใช้งานได้กับอุปกรณ์ลูปแบ็ค
qoomon

11

เราพบว่าวิธีที่ง่ายกว่าสำหรับขยะเครือข่ายทั้งหมดนี้คือการใช้ซ็อกเก็ตโดเมนสำหรับบริการ หากคุณกำลังพยายามเชื่อมต่อกับโฮสต์อยู่ให้เมานต์ซ็อกเก็ตเป็นโวลุ่มและคุณก็กำลังเดินทาง สำหรับ postgresql นี่เป็นเรื่องง่ายเหมือน:

docker run -v /var/run/postgresql:/var/run/postgresql

จากนั้นเราเพิ่งตั้งค่าการเชื่อมต่อฐานข้อมูลเพื่อใช้ซ็อกเก็ตแทนเครือข่าย แท้จริงแล้วง่าย


นี่เป็นทางออกที่ดี งานที่ดี!
เงิน nerd

2
ในปีนี้เราพบปัญหาใหญ่กับสิ่งนี้: Docker for Mac ไม่รองรับซ็อกเก็ตที่ติดตั้งในโวลุ่ม สิ่งนี้ไปว่ายน้ำจนกระทั่งคน Mac ลอง :(
mlissner

ขอบคุณ! ทำงานเหมือนมีเสน่ห์บน Linux!
Marcelo Cardoso

7

ฉันได้สำรวจโซลูชันที่หลากหลายและฉันพบว่านี่เป็นวิธีแก้ปัญหาที่แฮ็กน้อยที่สุด:

  1. กำหนดที่อยู่ IP แบบคงที่สำหรับบริดจ์เกตเวย์ IP
  2. เพิ่มเกตเวย์ IP เป็นรายการพิเศษในextra_hostsคำสั่ง

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

นี่คือตัวอย่างการเขียน Docker:

version: '2.3'

services:
  redis:
    image: "redis"
    extra_hosts:
      - "dockerhost:172.20.0.1"

networks:
  default:
    ipam:
      driver: default
      config:
      - subnet: 172.20.0.0/16
        gateway: 172.20.0.1

จากนั้นคุณสามารถเข้าถึงพอร์ตบนโฮสต์จากภายในคอนเทนเนอร์โดยใช้ชื่อโฮสต์ "dockerhost"


7

สำหรับระบบลินุกซ์ที่คุณสามารถ - เริ่มต้นจากรุ่นใหญ่20.04- host.docker.internalตอนนี้ยังสื่อสารกับโฮสต์ผ่าน สิ่งนี้จะไม่ทำงานโดยอัตโนมัติแต่คุณต้องระบุการตั้งค่าสถานะการทำงานต่อไปนี้:

--add-host=host.docker.internal:host-gateway

ดู


3

คุณสามารถเข้าถึงเว็บเซิร์ฟเวอร์ท้องถิ่นที่ทำงานอยู่ในเครื่องโฮสต์ของคุณได้สองวิธี

  1. วิธีที่ 1 ด้วย IP สาธารณะ

    ใช้ที่อยู่ IP สาธารณะของเครื่องโฮสต์เพื่อเข้าถึงเว็บเซิร์ฟเวอร์ในคอนเทนเนอร์นักเทียบท่าของเจนกินส์

  2. เข้าหา 2 ด้วยเครือข่ายโฮสต์

    ใช้ "- โฮสต์ของเน็ต" เพื่อเพิ่มคอนเทนเนอร์นักเทียบท่าของเจนกินส์ในสแต็กเครือข่ายของโฮสต์ คอนเทนเนอร์ที่ปรับใช้บนสแต็กของโฮสต์มีการเข้าถึงอินเตอร์เฟสโฮสต์ทั้งหมด คุณสามารถเข้าถึงเว็บเซิร์ฟเวอร์ในตู้คอนเทนเนอร์ด้วยที่อยู่ IP ส่วนตัวของเครื่องโฮสต์

NETWORK ID          NAME                      DRIVER              SCOPE
b3554ea51ca3        bridge                    bridge              local
2f0d6d6fdd88        host                      host                local
b9c2a4bc23b2        none                      null                local

สตาร์ทคอนเทนเนอร์ด้วยเครือข่ายโฮสต์ Eg: docker run --net host -it ubuntuและรันifconfigเพื่อแสดงรายการที่อยู่ IP เครือข่ายที่มีอยู่ทั้งหมดซึ่งสามารถเข้าถึงได้จากคอนเทนเนอร์นักเทียบท่า

เช่น: ฉันเริ่มเซิร์ฟเวอร์ nginx ในเครื่องโฮสต์ของฉันและฉันสามารถเข้าถึง URL เว็บไซต์ nginx จาก Ubuntu docker container

docker run --net host -it ubuntu

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a604f7af5e36        ubuntu              "/bin/bash"         22 seconds ago      Up 20 seconds                           ubuntu_server

การเข้าถึงเว็บเซิร์ฟเวอร์ Nginx (ทำงานในเครื่องโฮสต์ท้องถิ่น) จากตู้คอนเทนเนอร์ Ubuntu docker พร้อมที่อยู่ IP เครือข่ายส่วนตัว

root@linuxkit-025000000001:/# curl 192.168.x.x -I
HTTP/1.1 200 OK
Server: nginx/1.15.10
Date: Tue, 09 Apr 2019 05:12:12 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 26 Mar 2019 14:04:38 GMT
Connection: keep-alive
ETag: "5c9a3176-264"
Accept-Ranges: bytes

3

สำหรับการdocker-composeใช้เครือข่ายบริดจ์เพื่อสร้างเครือข่ายส่วนตัวระหว่างคอนเทนเนอร์โซลูชันที่ยอมรับใช้docker0ไม่ทำงานเนื่องจากอินเตอร์เฟส egress จากคอนเทนเนอร์ไม่ได้docker0แต่เป็นรหัสอินเตอร์เฟสที่สร้างขึ้นแบบสุ่มแทนเช่น:

$ ifconfig

br-02d7f5ba5a51: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.32.1  netmask 255.255.240.0  broadcast 192.168.47.255

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

เขียนตัวอย่างไฟล์:

version: "3.7"

services:
  mongodb:
    image: mongo:4.2.2
    networks:
    - mynet
    # rest of service config and other services removed for clarity

networks:
  mynet:
    name: mynet
    ipam:
      driver: default
      config:
      - subnet: "192.168.32.0/20"

คุณสามารถเปลี่ยนซับเน็ตได้หากสภาพแวดล้อมของคุณต้องการ ฉันเลือกโดยพลการ192.168.32.0/20โดยใช้docker network inspectเพื่อดูสิ่งที่ถูกสร้างขึ้นโดยค่าเริ่มต้น

กำหนดค่าiptablesบนโฮสต์เพื่ออนุญาตให้ subnet ส่วนตัวเป็นแหล่งที่มา:

$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT

นี่เป็นวิธีที่ง่ายที่สุดที่เป็นไปได้ iptablesกฎที่คุณอาจต้องการเพิ่มข้อ จำกัด อื่น ๆ เช่นโดยพอร์ตปลายทาง อย่าลืมยืนยันกฎ iptables ของคุณเมื่อคุณพอใจที่ใช้งานได้

วิธีนี้มีความได้เปรียบในการทำซ้ำและทำให้เป็นไปโดยอัตโนมัติ ฉันใช้templateโมดูลของ ansible เพื่อปรับใช้ไฟล์เขียนของฉันด้วยการแทนที่ตัวแปรแล้วใช้iptablesและshellโมดูลเพื่อตั้งค่าและคงกฎไฟร์วอลล์ตามลำดับ


ฉันเห็นคำตอบหลายคำแนะนำiptables -A INPUT -i docker0 -j ACCEPTแต่นั่นไม่ได้ช่วยฉันในขณะที่iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPTคำแนะนำที่นี่แก้ปัญหาของฉันได้
เทอร์รี่บราวน์

1

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

นอกจากนี้ในการใช้--net="host"วิธีการนี้เป็นวิธีการที่หยาบมากซึ่งไม่สามารถใช้ได้เมื่อต้องการมีการกำหนดค่าเครือข่ายที่แยกได้ดีพร้อมกับคอนเทนเนอร์จำนวนมาก

ดังนั้นวิธีการของฉันคือการแยกที่อยู่โฮสต์ 'ที่ด้านโฮสต์แล้วส่งไปยังภาชนะที่มี--add-hostพารามิเตอร์:

$ docker run --add-host=docker-host:`ip addr show docker0 | grep -Po 'inet \K[\d.]+'` image_name

หรือบันทึกที่อยู่ IP ของโฮสต์ในตัวแปรสภาพแวดล้อมและใช้ตัวแปรภายหลัง:

$ DOCKERIP=`ip addr show docker0 | grep -Po 'inet \K[\d.]+'`
$ docker run --add-host=docker-host:$DOCKERIP image_name

จากนั้นdocker-hostจะถูกเพิ่มไปยังไฟล์โฮสต์ของคอนเทนเนอร์และคุณสามารถใช้มันในสตริงการเชื่อมต่อฐานข้อมูลหรือ URL ของ API


0

เมื่อคุณมีภาพนักเทียบท่าสองภาพที่ "สร้างแล้ว" และคุณต้องการให้มีสองคอนเทนเนอร์เพื่อสื่อสารกับอีกแบบหนึ่ง

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

เมื่อคุณอยู่ในสถานการณ์อย่างตัวฉันและมันก็เป็นของคุณ

docker build -t "centos7/someApp" someApp/ 

นั่นจะหยุดลงเมื่อคุณพยายามที่จะ

curl http://172.17.0.1:localPort/fileIWouldLikeToDownload.tar.gz > dump.tar.gz

และคุณติดอยู่ที่ "curl / wget" โดยไม่ส่งคืน "เส้นทางไปยังโฮสต์"

เหตุผลคือการรักษาความปลอดภัยที่กำหนดไว้ในสถานที่โดยนักเทียบท่าที่โดยค่าเริ่มต้นคือการห้ามการสื่อสารจากภาชนะที่มีต่อโฮสต์หรือภาชนะอื่น ๆ ที่ทำงานบนโฮสต์ของคุณ นี่เป็นเรื่องที่ค่อนข้างน่าประหลาดใจสำหรับฉันฉันต้องบอกว่าคุณคาดหวังว่าระบบ echosystem ของเครื่องเทียบท่าที่ทำงานบนเครื่องท้องถิ่นนั้นไร้ที่ติสามารถเข้าถึงซึ่งกันและกันได้โดยไม่กีดขวางมากเกินไป

คำอธิบายสำหรับสิ่งนี้อธิบายไว้ในรายละเอียดในเอกสารต่อไปนี้

http://www.dedoimedo.com/computers/docker-networking.html

มีวิธีแก้ไขปัญหาด่วนสองประการที่ช่วยให้คุณเคลื่อนย้ายได้โดยลดความปลอดภัยของเครือข่ายลง

ทางเลือกที่ง่ายที่สุดคือปิดไฟร์วอลล์ - หรืออนุญาตทั้งหมด ซึ่งหมายถึงการรันคำสั่งที่จำเป็นซึ่งอาจเป็น systemctl หยุดการไฟร์วอลล์ firewallt, iptables -F หรือเทียบเท่า

หวังว่าข้อมูลนี้จะช่วยคุณ


3
เช่นเดียวกับโน้ต--linkตอนนี้เลิกใช้แล้ว
Mr.Budris

0

สำหรับผม (Windows 10 หางเครื่องยนต์ v19.03.8) มันเป็นส่วนผสมของhttps://stackoverflow.com/a/43541732/7924573และhttps://stackoverflow.com/a/50866007/7924573

  1. เปลี่ยน host / ip เป็นhost.docker.internal
    เช่น: LOGGER_URL = " http: //host.docker.internal: 8085 / log "
  2. ตั้ง network_mode เป็นbridge (หากคุณต้องการรักษาการส่งต่อพอร์ตหากไม่ได้ใช้โฮสต์ ):
    version: '3.7' services: server: build: . ports: - "5000:5000" network_mode: bridge หรืออีกวิธี: ใช้--net="bridge"ถ้าคุณไม่ได้ใช้ docker-compose (คล้ายกับhttps://stackoverflow.com/a/48806927/7924573 )
    ดังที่ได้กล่าวไว้ในคำตอบก่อนหน้า: สิ่งนี้ควรใช้ในสภาพแวดล้อมการพัฒนาท้องถิ่นเท่านั้น
    สำหรับข้อมูลเพิ่มเติมโปรดอ่าน: https://docs.docker.com/compose/compose-file/#network_modeและhttps://docs.docker.com/docker-for-windows/networking/#use-cases-and-workarounds
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.