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