Puncte:0

NU poate lega portul gazdă 14433 la portul container 433 folosind localhost, dar https funcționează folosind IP container (de exemplu 172.21.0.2)

drapel bd

Cand fac lynx localhost:14080 de la gazdă, funcționează. Site-ul web este încărcat din container.

Cand fac lynx localhost:14433 de la gazdă, NU funcționează.

Cand fac lynx https://localhost:14433 de la gazdă, NU funcționează. Eroare: Nu se poate realiza o conexiune sigură la gazda de la distanță.

Containerul rulează pe o rețea bridge, lansată de docker-compose. IP-ul containerului este: 172.21.0.2.

DAR, când o fac lynx https://172.21.0.2 FUNCȚIONEAZĂ...

...site-ul web este încărcat din container folosind certificate https și SSL. Primesc doar avertisment SSL:

172.21.02!=cert(CN<example.com>)-Continuare?

...ceea ce înseamnă că CN-ul certificatului nu se potrivește cu IP-ul pe care încercam să îl deschid, dar încă pot ignora acest avertisment și continui să deschid site-ul.

Aceasta înseamnă că http funcționează pe localhost (și funcționează și când folosesc IP-ul containerului).

Dar https funcționează doar când încerc să mă conectez folosind IP-ul containerului, dar nu funcționează când folosesc localhost.

Acesta este motivul pentru care cred că există o eroare în legările de porturi ale rețelelor create de docker.

Aș dori să mă pot conecta la container folosind localhost, așa că nu trebuie să specific noul IP al containerului de fiecare dată când relansez containerul, deoarece plănuiesc să configurez un proxy apache2 invers pe gazdă, deci că lumea exterioară se poate conecta la site-ul meu în container folosind https.

Acestea sunt setările mele pentru apache2 pe gazdă:

Fișierul example.com.conf în gazda mea 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>

Fișierul example.com-le-ssl.conf în gazda mea 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>

Aceasta este conf. mea apache în container:

Fișierul default-ssl.conf în gazda mea apache conf:

ServerName example.com

<VirtualHost _default_:80>
    ServerName 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 combinat
</VirtualHost>

<IfModule mod_ssl.c>
Depanare LogLevel
    <VirtualHost _default_:443>
        ServerName example.com
        ServerAlias ​​www.example.com
        ServerAdmin [email protected]
        DocumentRoot /var/www/html/www
        Depanare LogLevel
        ErrorLog /var/log/container/error.log
        CustomLog /var/log/container/custom.log combinat
        Includeți /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
</IfModule>

Acesta este fișierul meu docker-compose.yml:

versiunea: „3.7”

retele:
  exemplu webapp:
    şofer: pod

Servicii:
  referint:
    container_name: examplewebapp
    construi:
      context: ./
      dockerfile: Dockerfile
      tinta: dev
    imagine: examplewebapp
    reporniți: dacă nu este oprit
    retele:
      - exemplu de aplicație web
    porturi:
      **- „14433:433”
      - „14080:80”**
    work_dir: /var/www/html
    volume:
      - ./container_apache_conf:/etc/apache2/sites-available
      - ./api:/var/www/html/api
      - ./archive:/var/www/html/archive
      - ./log/container:/var/log/container
      - ./log/gazdă:/var/log/gazdă
      - ./etc/letsencrypt:/etc/letsencrypt
      - ./www:/var/www/html/www

Acesta este fișierul meu Docker:

DIN php:7.4-apache AS baza
RUN apt-get update
RUN mkdir -p /var/www/html/www # site-ul web va fi salvat aici
RUN mkdir -p /var/log/container # jurnalele apache vor fi salvate aici
# conectivitate mysql și internaționalizare pentru php
RUN docker-php-ext-install mysqli
RUN docker-php-ext-enable mysqli
RUN apt-get install -y libicu-dev
RUN docker-php-ext-configure intl
RUN docker-php-ext-install intl
# activează https pentru apache
RUN a2enmod ssl
RUN a2ensite default-ssl.conf


DIN baza AS dev
RUN pecl install xdebug-3.1.1
RUN docker-php-ext-enable xdebug

DIN testul AS de bază

DE LA bază AS prod

Acesta este ceea ce este generat de:

docker network inspectați examplecom_example


[
    {
        „Nume”: „examplecom_example”,
        „Id”: „7311d1a7254466bd6ab44833362460cde4336ade622bca87def62bb3d840ef3f” ,
        „Creat”: „2022-02-13T21:16:34.861655456Z”,
        „Scope”: „local”,
        „Driver”: „pod”,
        „EnableIPv6”: fals,
        „IPAM”: {
            „Driver”: „implicit”,
            „Opțiuni”: nul,
            „Configurare”: [
                {
                    „Subrețea”: „172.21.0.0/16”,
                    „Gateway”: „172.21.0.1”
                }
            ]
        },
        „Intern”: fals,
        „Atașabil”: adevărat,
        „Ingress”: fals,
        „ConfigFrom”: {
            „Rețea”: „”
        },
        „ConfigOnly”: fals,
        „Containere”: {
            "be53d5b37e2fbcaae49bb111b921dfd4caf5db20ed680403083333ffac983b93": {
                „Nume”: „exemplu”,
                „EndpointID”: „fb1428d29e2fc9564b3e1758a7efac15909a897021320b15f 1df8c1d600efd89”,
                „MacAddress”: „00:00:00:00:00:00”,
                „IPv4Address”: „172.21.0.2/16”,
                „Adresa IPv6”: „”
            },
    }
]

Aceasta este rezultatul docker ps:

CONTAINER ID IMAGINE COMANDA CREAȚĂ STAREA PORTURI NUMELE
be53d5b37e2f exemplu „docker-php-entrypoi⦔ 11 ore în urmă Up 11 ore 443/tcp, 0.0.0.0:14080->80/tcp, :::14080->80/tcp, 0.0.0.0->44333333333333-> /tcp, :::14433->433/tcp exemplu

Folosesc imaginea oficială php docker.

Și în docker compose, creez o rețea de punte și mapez:

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

Întrebările mele sunt:

  1. De ce mă pot conecta de la gazda mea la containerul meu folosind http on http://127.0.0.1:14080, dar nu folosiți https https://127.0.0.1:14433, chiar dacă ambele porturi pentru http și https (14080:80 și 14433:433) ar trebui mapate în același mod? Și de ce încă funcționează https când mă conectez la container folosind https activat https://172.21.0.2.

  2. Ce ar trebui să fac pentru a putea redirecționa traficul https de la apache-ul meu gazdă (ca proxy invers), către apache-ul meu container folosind localhost, de ex. https://127.0.0.1:14433/ - astfel încât containerul meu să poată fi accesat de pe internet, folosind și https, și astfel nu trebuie să specific IP-ul containerului în configurația mea apache gazdă a proxy-ului https invers?

Puncte:0
drapel in

De ce sunt astea *?

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

Incearca cu

versiunea: „3.7”

retele:
  exemplu webapp:
    şofer: pod

Servicii:
  referint:
    container_name: examplewebapp
    construi:
      context: ./
      dockerfile: Dockerfile
      tinta: dev
    imagine: examplewebapp
    reporniți: dacă nu este oprit
    rețele: acestea
      - exemplu de aplicație web
    porturi:
      - „14433:433”
      - „14080:80”
    work_dir: /var/www/html
    volume:
      - ./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

Și vă rugăm să afișați rezultatul docker ps.

Și pentru Apache ca proxy, chiar dacă am auzit că nginx este preferatul în zilele noastre, ați putea folosi o configurație ca aceasta.

<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>
drapel bd
**- „14433:433” - „14080:80”** a fost doar o eroare de ortografie la serverfault. Docker-compose.yml avea ortografia corectă fără **.
drapel bd
Care este diferența în fișierul docker-compose.yml? Singura diferență pe care o văd este adăugarea lui „aceștia” după „rețele:”. Dar asta îmi dă o eroare când încerc să rulez Docker Compose. EROARE: yaml.scanner.ScannerError: în timpul scanării unei chei simple în „./docker-compose.yml”, rândul 16, coloana 5 nu a putut găsi așteptat „:” în „./docker-compose.yml”, rândul 18, coloana 5
drapel bd
openssl s_client -crlf -connect localhost:14433 -servername www.example.com Imi da: CONECTAT(00000003) scrie:errno=104 --- nu este disponibil niciun certificat de egalitate --- Nu s-au trimis nume de CA de certificat de client --- SSL handshake a citit 0 octeți și a scris 310 octeți Verificare: OK --- Nou, (NONE), Cipher este (NIMIC) Renegocierea sigură NU ESTE acceptată Compresie: NIMIC Extindere: NIMIC Nu s-a negociat ALPN Datele timpurii nu au fost trimise Verificați codul de returnare: 0 (ok) ---
drapel bd
Sunt de acord, nginx este modalitatea preferată, dar ezit să rulez nginx și apache2 pe aceeași mașină și, de asemenea, ezit să migrez toate celelalte site-uri web la docker sau nginx, deoarece au o mulțime de setări de server și apache2
drapel bd
Am încercat setările tale, dar eroarea persistă. Lynx îmi dă: Alertă!: Eroare neașteptată de citire a rețelei; conexiune întreruptă. Nu se poate accesa Alerta „example.com”!: Nu se poate accesa documentul.
drapel bd
Am renunțat la problemă și am încercat cu nginx. Funcționează. Acum voi migra totul în nginx.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.