Score:0

ไม่สามารถผูกพอร์ตโฮสต์ 14433 กับพอร์ตคอนเทนเนอร์ 433 โดยใช้ localhost แต่ https ทำงานโดยใช้คอนเทนเนอร์ IP (เช่น 172.21.0.2)

ธง bd

เมื่อฉันทำ แมวป่าชนิดหนึ่ง localhost:14080 จากโฮสต์มันใช้งานได้ เว็บไซต์ถูกโหลดจากคอนเทนเนอร์

เมื่อฉันทำ แมวป่าชนิดหนึ่ง localhost:14433 จากโฮสต์ไม่ทำงาน

เมื่อฉันทำ ลิงซ์ https://localhost:14433 จากโฮสต์ไม่ทำงาน ข้อผิดพลาด: ไม่สามารถเชื่อมต่อกับโฮสต์ระยะไกลได้อย่างปลอดภัย

คอนเทนเนอร์กำลังทำงานบนเครือข่ายบริดจ์ ซึ่งเปิดใช้งานโดยนักเทียบท่า-เขียน IP ของคอนเทนเนอร์คือ: 172.21.0.2

แต่เมื่อฉันทำ ลิงซ์ https://172.21.0.2 มันได้ผล...

...โหลดเว็บไซต์จากคอนเทนเนอร์โดยใช้ https และใบรับรอง SSL ฉันได้รับคำเตือน SSL เท่านั้น:

172.21.02!=cert(CN<example.com>)-ดำเนินการต่อหรือไม่

...ซึ่งหมายความว่า CN ของใบรับรองไม่ตรงกับ IP ที่ฉันพยายามเปิด แต่ฉันยังสามารถเพิกเฉยต่อคำเตือนนี้และเปิดไซต์ต่อไปได้

ซึ่งหมายความว่า http กำลังทำงานบน localhost (และใช้งานได้เมื่อฉันใช้คอนเทนเนอร์ IP)

แต่ https ใช้งานได้เฉพาะเมื่อฉันพยายามเชื่อมต่อโดยใช้คอนเทนเนอร์ IP แต่มันไม่ทำงานเมื่อฉันใช้ localhost

นี่คือเหตุผลที่ฉันคิดว่ามีข้อผิดพลาดในการผูกพอร์ตของเครือข่ายที่สร้างโดยนักเทียบท่า

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

นี่คือการตั้งค่า apache2 ของฉันบนโฮสต์:

ไฟล์ example.com.conf ในโฮสต์ apache conf ของฉัน:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin [email protected]
    CustomLog /var/www/docker/example.com/log/host/custom.log combined
    ErrorLog /var/www/docker/example.com/log/host/error.log
    Redirect permanent / https://example.com/
    ProxyRequests off
    ProxyPreserveHost On
    ProxyPass        "/" "http://172.21.0.2/"
    ProxyPassReverse "/" "http://172.21.0.2/"
</VirtualHost>

ไฟล์ example.com-le-ssl.conf ในโฮสต์ apache conf ของฉัน:

<IfModule mod_ssl.c>
ErrorLog /var/www/docker/example.com/log/host/error.log
LogLevel debug
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    ProxyPreserveHost on
    ServerAdmin [email protected]
    LogLevel debug
    CustomLog /var/www/docker/example.com/log/host/custom.log combined
    ErrorLog /var/www/docker/example.com/log/host/error.log
    <If "%{HTTP_HOST} == 'www.example.com'">
      Redirect permanent / https://example.com/
    </If>
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLProxyEngine on
    SSLEngine on
    ProxyRequests off
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    <Proxy *>
        Order allow,deny
        Allow from all
    </Proxy>
    ProxyPass        "/" "http://172.21.0.2/"
    ProxyPassReverse "/" "http://172.21.0.2/"
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
</IfModule>

นี่คือ apache conf ของฉันในคอนเทนเนอร์:

ไฟล์ default-ssl.conf ในโฮสต์ apache conf ของฉัน:

ชื่อเซิร์ฟเวอร์ example.com

<โฮสต์เสมือน _default_:80>
    ชื่อเซิร์ฟเวอร์ example.com
    ServerAlias ​​www.example.com
    ServerADmin [email protected]
    DocumentRoot /var/www/html/www
    ErrorLog /var/log/container/error.log
    รวม CustomLog /var/log/container/custom.log
</เวอร์ชวลโฮสต์>

<IfModule mod_ssl.c>
ดีบัก LogLevel
    <โฮสต์เสมือน _default_:443>
        ชื่อเซิร์ฟเวอร์ example.com
        ServerAlias ​​www.example.com
        ผู้ดูแลระบบเซิร์ฟเวอร์ [email protected]
        DocumentRoot /var/www/html/www
        ดีบัก LogLevel
        ErrorLog /var/log/container/error.log
        รวม CustomLog /var/log/container/custom.log
        รวม /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</เวอร์ชวลโฮสต์>
</หากโมดูล>

นี่คือไฟล์ docker-compose.yml ของฉัน:

รุ่น: '3.7'

เครือข่าย:
  ตัวอย่างเว็บแอป:
    คนขับ: สะพาน

บริการ:
  การอ้างอิง:
    container_name: examplewebapp
    สร้าง:
      บริบท: ./
      นักเทียบท่าไฟล์: Dockerfile
      เป้าหมาย: ผู้พัฒนา
    รูปภาพ: ตัวอย่างเว็บแอป
    รีสตาร์ท: เว้นแต่จะหยุด
    เครือข่าย:
      - ตัวอย่างเว็บแอป
    พอร์ต:
      **-"14433:433"
      - "14080:80"**
    working_dir: /var/www/html
    ปริมาณ:
      - ./container_apache_conf:/etc/apache2/sites-available
      - ./api:/var/www/html/api
      - ./archive:/var/www/html/archive
      - ./log/container:/var/log/container
      - ./log/host:/var/log/host
      - ./etc/letsencrypt:/etc/letsencrypt
      - ./www:/var/www/html/www

นี่คือ Dockerfile ของฉัน:

จาก php:7.4-apache AS ฐาน
RUN apt-รับการปรับปรุง
RUN mkdir -p /var/www/html/www # เว็บไซต์จะถูกบันทึกไว้ที่นี่
RUN mkdir -p /var/log/container # บันทึก apache จะถูกบันทึกไว้ที่นี่
# การเชื่อมต่อ mysql และความเป็นสากลสำหรับ php
RUN docker-php-ext-install mysqli.dll
RUN docker-php-ext-enable mysqli.dll
RUN apt-get install -y libicu-dev
RUN docker-php-ext-กำหนดค่า intl
RUN docker-php-ext-install intl
# เปิดใช้งาน https สำหรับ apache
เรียกใช้ a2enmod ssl
เรียกใช้ a2ensite เริ่มต้น-ssl.conf


จากฐาน AS dev
RUN pecl ติดตั้ง xdebug-3.1.1
RUN docker-php-ext-enable xdebug

จากการทดสอบฐาน AS

จากฐาน AS ผลิตภัณฑ์

นี่คือสิ่งที่สร้างขึ้นโดย:

เครือข่ายนักเทียบท่าตรวจสอบ examplecom_example


[
    {
        "ชื่อ": "examplecom_example",
        "รหัส": "7311d1a7254466bd6ab44833362460cde4336ade622bca87def62bb3d840ef3f" ,
        "สร้างแล้ว": "2022-02-13T21:16:34.861655456Z",
        "ขอบเขต": "ท้องถิ่น",
        "คนขับ": "สะพาน",
        "เปิดใช้งาน IPv6": เท็จ
        "IPAM": {
            "ไดรเวอร์": "ค่าเริ่มต้น",
            "ตัวเลือก": null,
            "การกำหนดค่า": [
                {
                    "ซับเน็ต": "172.21.0.0/16",
                    "เกตเวย์": "172.21.0.1"
                }
            ]
        },
        "ภายใน": เท็จ
        "แนบได้": จริง,
        "ทางเข้า": เท็จ
        "ConfigFrom": {
            "เครือข่าย": ""
        },
        "ConfigOnly": เท็จ
        "คอนเทนเนอร์": {
            "be53d5b37e2fbcaae49bb111b921dfd4caf5db20ed680403083333ffac983b93": {
                "ชื่อ": "ตัวอย่าง",
                "EndpointID": "fb1428d29e2fc9564b3e1758a7efac15909a897021320b15f 1df8c1d600efd89",
                "ที่อยู่ Mac": "00:00:00:00:00:00",
                "ที่อยู่ IPv4": "172.21.0.2/16",
                "ที่อยู่ IPv6": ""
            },
    }
]

นี่คือผลลัพธ์ของนักเทียบท่า ps:

รหัสคอนเทนเนอร์ IMAGE คำสั่งสร้างสถานะชื่อพอร์ต
be53d5b37e2f ตัวอย่าง "docker-php-entrypoiâ¦" 11 ชั่วโมงที่แล้ว ขึ้น 11 ชั่วโมง 443/tcp, 0.0.0.0:14080->80/tcp, :::14080->80/tcp, 0.0.0.0:14433->433 /tcp, :::14433->433/tcp ตัวอย่าง

ฉันใช้อิมเมจ php docker อย่างเป็นทางการ

และในการเขียนนักเทียบท่าฉันกำลังสร้างเครือข่ายบริดจ์และฉันกำลังทำแผนที่:

  • "14433:433"
  • "14080:80"

คำถามของฉันคือ:

  1. เหตุใดฉันจึงสามารถเชื่อมต่อจากโฮสต์ไปยังคอนเทนเนอร์โดยใช้ http บน http://127.0.0.1:14080แต่ไม่ได้ใช้ https บน https://127.0.0.1:14433แม้ว่าทั้งพอร์ตสำหรับ http และ https (14080:80 และ 14433:433) ควรถูกแมปในลักษณะเดียวกัน แล้วทำไม https ถึงยังใช้งานได้เมื่อฉันเชื่อมต่อกับคอนเทนเนอร์โดยใช้ https บน https://172.21.0.2.

  2. ฉันควรทำอย่างไรเพื่อให้สามารถเปลี่ยนเส้นทางการรับส่งข้อมูล https จากโฮสต์ apache ของฉัน (เป็นพร็อกซีย้อนกลับ) ไปยังคอนเทนเนอร์ apache ของฉันโดยใช้ localhost เช่น https://127.0.0.1:14433/ - เพื่อให้คอนเทนเนอร์ของฉันสามารถเข้าถึงได้จากอินเทอร์เน็ต โดยใช้ https เช่นกัน ดังนั้นฉันจึงไม่จำเป็นต้องระบุ IP ของคอนเทนเนอร์ในการกำหนดค่าโฮสต์ apache ของพร็อกซี https ย้อนกลับ

Score:0
ธง in

ทำไมถึงมี * เหล่านี้?

      **- "14433:433"
      - "14080:80"**

ลองด้วย

รุ่น: '3.7'

เครือข่าย:
  ตัวอย่างเว็บแอป:
    คนขับ: สะพาน

บริการ:
  การอ้างอิง:
    container_name: examplewebapp
    สร้าง:
      บริบท: ./
      นักเทียบท่าไฟล์: Dockerfile
      เป้าหมาย: ผู้พัฒนา
    รูปภาพ: ตัวอย่างเว็บแอป
    รีสตาร์ท: เว้นแต่จะหยุด
    เครือข่าย: เหล่านี้
      - ตัวอย่างเว็บแอป
    พอร์ต:
      - "14433:433"
      - "14080:80"
    working_dir: /var/www/html
    ปริมาณ:
      - ./container_apache_conf:/etc/apache2/sites-available
      - ./api:/var/www/html/api
      - ./archive:/var/www/html/archive
      - ./log/container:/var/log/container
      - ./log/host:/vatheser/log/host
      - ./etc/letsencrypt:/etc/letsencrypt
      - ./www:/var/www/html/www

และโปรดแสดงผลของ นักเทียบท่า PS.

และสำหรับ Apache ในฐานะ Proxy แม้ว่าฉันจะได้ยินว่า nginx เป็นที่ต้องการในปัจจุบัน คุณสามารถใช้ Config แบบนี้ได้

<VirtualHost *:80>

ServerName your.vhost.tld

RewriteEngine on
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

ErrorLog ${APACHE_LOG_DIR}/your.vhost.tld-error.log
CustomLog ${APACHE_LOG_DIR}/your.vhost.tld-access.log vhost_combined

</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>

ServerName your.vhost.tld
<Proxy *>
order deny,allow
Allow from all
</Proxy>

SSLEngine on
SSLCertificateFile      /etc/apache2/ssl/your.vhost.tld/certificate.crt
SSLCertificateKeyFile   /etc/apache2/ssl/your.vhost.tld/certificate.key
#SSLCACertificateFile   /etc/apache2/ssl/your.vhost.tld/cert.cabundle

SetEnv           force-proxy-request-1.0 1
SetEnv           proxy-nokeepalive       1
SetEnv           proxy-initial-not-pooled 1

ErrorLog ${APACHE_LOG_DIR}/your.vhost.tld-error.log
CustomLog ${APACHE_LOG_DIR}/your.vhost.tld-access.log vhost_combined

ProxyTimeout 600
SSLProxyEngine On
#ProxyRequests On
#ProxyPreserveHost On
RewriteEngine off

#PROXY's
ProxyRequests Off
<Location "/">
ProxyPreserveHost On
ProxyPass https://localhost:14443
ProxyPassReverse https://localhost:14443
</VirtualHost>
</IfModule>
bd flag
**- "14433:433" - "14080:80"** เป็นเพียงข้อผิดพลาดในการสะกดบนเซิร์ฟเวอร์ผิดพลาด docker-compose.yml มีการสะกดคำที่ถูกต้องโดยไม่มี **
bd flag
อะไรคือความแตกต่างในไฟล์ docker-compose.yml? ข้อแตกต่างเพียงอย่างเดียวที่ฉันเห็นคือการเพิ่ม "เหล่านี้" หลัง "เครือข่าย:" แต่สิ่งนี้ทำให้ฉันเกิดข้อผิดพลาดเมื่อพยายามเรียกใช้การเขียนนักเทียบท่า ข้อผิดพลาด: yaml.scanner.ScannerError: ขณะสแกนคีย์ธรรมดา ใน "./docker-compose.yml" บรรทัดที่ 16 คอลัมน์ 5 ไม่พบสิ่งที่คาดหวัง ':' ใน "./docker-compose.yml" บรรทัดที่ 18 คอลัมน์ 5
bd flag
openssl s_client -crlf -เชื่อมต่อ localhost:14433 -ชื่อเซิร์ฟเวอร์ www.example.com ให้ฉัน: เชื่อมต่อแล้ว(00000003) เขียน:errno=104 --- ไม่มีใบรับรองเพื่อน --- ไม่มีการส่งชื่อ CA ของใบรับรองไคลเอ็นต์ --- SSL handshake อ่าน 0 ไบต์และเขียน 310 ไบต์ การยืนยัน: ตกลง --- ใหม่ (ไม่มี) รหัสคือ (ไม่มี) ไม่สนับสนุนการเจรจาใหม่อย่างปลอดภัย การบีบอัด: ไม่มี การขยายตัว: ไม่มี ไม่มีการเจรจา ALPN ข้อมูลต้นไม่ได้ถูกส่ง ตรวจสอบรหัสส่งคืน: 0 (ตกลง) ---
bd flag
ฉันเห็นด้วย nginx เป็นวิธีที่ดีกว่า แต่ฉันลังเลที่จะเรียกใช้ nginx และ apache2 บนเครื่องเดียวกัน และฉันยังลังเลที่จะย้ายเว็บไซต์อื่นทั้งหมดไปยัง docker หรือ nginx เนื่องจากมีเซิร์ฟเวอร์และการตั้งค่า apache2 จำนวนมาก
bd flag
ฉันลองตั้งค่าของคุณแล้ว แต่ข้อผิดพลาดยังคงอยู่ Lynx ให้ฉัน: แจ้งเตือน!: ข้อผิดพลาดในการอ่านเครือข่ายที่ไม่คาดคิด; การเชื่อมต่อถูกยกเลิก ไม่สามารถเข้าถึง `example.com' Alert!: ไม่สามารถเข้าถึงเอกสาร
bd flag
ฉันละทิ้งปัญหาและลองใช้ nginx มันได้ผล. ตอนนี้ฉันจะย้ายทุกอย่างไปที่ nginx แทน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา