Isännöi useita aliverkkotunnuksia/sovelluksia yhdellä isännällä Dockerin avulla
Docker sopii yhä paremmin henkilökohtaisiin ympäristöihin, erityisesti yksityisiin palvelimiin, joita voidaan siirtää hyvin usein.
Kehittäjällä on yleensä useampi kuin yksi sovellus omalla yksityisellä palvelimellaan, kuten blogissa, ja joitain kehityssovelluksia, kuten Jenkins, GitLab ja niin edelleen. Nämä sovellukset käyttävät todennäköisesti tavallista verkkoporttia 80. Koska tämä portti on jo sidottu esimerkiksi pääsivustoosi, Docker-instanssit eivät ole käytettävissä koko tämän portin aikana.
Tämä viesti näyttää sinulle yhden tavan isännöidä useita sovelluksia, kuten blogia, henkilökohtaista verkkosivustoa ja monia muita, yhdellä palvelimella Docker-säilöillä.
Ihanteellinen arkkitehtuuri useiden sovellusten isännöimiseen erillisessä palvelimessa olisi paljastaa jokainen sovellus portissa 80 tietyn aliverkkotunnuksen (blog.domain.com, jenkins.domain.com) kautta. , gitlab.domain.com).
Nämä vaatimukset voidaan saavuttaa käyttämällä välityspalvelinta (kutsutaan myös käänteiseksi välityspalvelimeksi). Tässä on kaavio:
Tämä klassinen arkkitehtuuri voitaisiin toteuttaa käyttämällä Nginxiä käänteisenä välityspalvelimena, mutta tähän ratkaisuun liittyy haittoja:
tarve kirjoittaa määritystiedosto sovellusta/säilöä kohden Nginxin välityspalvelimen lataamiseksi uudelleen aina, kun sovellus tai säilö lisätään arkkitehtuuriin.Nginx-välityspalvelin koostuu yksinkertaisesta Nginxistä server anddocker-gen. Docker-gen on pieni Go-kielellä kirjoitettu työkalu, jota voidaan käyttää Nginx/HAProxy-määritystiedostojen luomiseen käyttämällä Docker-säilöjen metatietoja (saatu Docker API:n kautta).
Nämä kaksi sovellusta toimivat Docker-säilöinä, joten ne on helppo käynnistää. Kun nginx-proxy on aloitettu, se toimii käänteisenä välityspalvelimena isännän ja kaikkien aliverkkotunnustesi (blog.domain.com, jenkins.domain.com jne.) välillä ja reitittää saapuvat pyynnöt tehokkaasti VIRTUAL_HOST-ympäristömuuttujan avulla (jos se on asetettu). , jokaiselle Docker-kontille).
Jotta haluat välityspalvelimen Docker-säilön, sinun on periaatteessa esitettävä sovellusten käyttämä portti (esimerkiksi 80 WordPressille) ja lisättävä säilöön VIRTUAL_HOST-ympäristömuuttuja:
Käyttämällä docker run command:docker run -d --expose 80 -e VIRTUAL_HOST=blog.domain.com wordpress
Docker-compose.yml-tiedoston kautta:
wordpress:image: wordpresslinks:- db:mysqlexpose:- 80environment:- "VIRTUAL_HOST=blog.domain.com"db:image: mariadbenvironment:MYSQL_ROOT_PASSWORD: esimerkkiSeuraava kokoonpano voitaisiin esittää näin:
Kuten yllä näet, Nginx-välityspalvelin kuuntelee http-standardiporttia (80) ja välittää saapuvat pyynnöt sopivaan säiliöön. Katsotaan myöhemmin, miten tämä reititys tehdään.
Käynnistä nginx-proxy kirjoittamalla seuraava komento:
shell Docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy
Dokkerin kirjoitussyntaksin käyttäminen:
nginx-proxy:image: jwilder/nginx-proxyports:- "80:80"volumes:- /var/run/docker.sock:/tmp/docker.sockPäivitys:Kuten Moon ehdotti kommentissaan, voit lisää ylimääräinen suojaus piilottaaksesi Nginx-palvelinversion mukautetun määritystiedoston avulla:
server_tokens off;Jos haluat saada nginx-proxyn käyttämään mukautettua Nginx-määritystiedostoasi, käynnistä se tällä lipulla:
-v /path/to/my_proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro
Kuten voit arvata viimeisellä komennolla, nginx-proxy-säilö kuuntelee porttia 80 ja sillä on pääsy Docker-isäntäpistorasiaan. Antamalla Docker-isäntäpistokkeen nginx-proxy-säilö voi vastaanottaa Docker-tapahtumia (esim. säilön luontia, sammutuksia jne.) ja reagoida niihin.
Nginx-proxy-säilö etsii käynnistyksessään säilöjä, joissa on VIRTUAL_HOST-ympäristömuuttuja, ja luo niistä kullekin sopivan Nginx-perusmääritystiedoston. Nämä määritystiedostot kertovat Nginxille, kuinka saapuvat pyynnöt välitetään taustalla oleviin säilöihin.
Sitten aina, kun säilö käynnistyy, nginx-välityspalvelin vastaanottaa tapahtuman ja luo asianmukaisen Nginx-määrityksen, jota tarvitaan konttisovelluksen palvelemiseen ja Nginxin lataamiseen uudelleen.
Nginx-välityspalvelin reitittää pyynnöt säilöihin kunkin säilön VIRTUAL_HOST-ympäristömuuttujan mukaisesti. Tämä tarkoittaa, että jos haluat, että säilöä käytetään tietyllä verkkotunnuksella tai aliverkkotunnuksella, sinun on käynnistettävä tämä halutulla VIRTUAL_HOST-ympäristömuuttujalla.
Tässä on esimerkki:
# Käynnistä WordPress (db-osa jätetty pois selvyyden vuoksi) Docker run -d --name blogi --expose 80 -e VIRTUAL_HOST=blog.domain.com wordpress# Käynnistä Jenkinsdocker run -d --name jenkinsci --expose 8080 -e VIRTUAL_HOST= jenkins.domain.com -e VIRTUAL_PORT=8080 jenkinsTässä on jälleen vastaava kokoonpano Jenkins-instanssille, jossa käytetään docker-compose-syntaksia:
jenkins:image: jenkinsexpose:- 8080- 50000environment:- "VIRTUAL_HOST=jenkins.domain.com"- "VIRTUAL_PORT=8080"volumes:- "/your/home:/var/jenkins_home"Huomaa: portti, jota käyttää säiliön sisällä olevan sovelluksen on oltava esillä, jotta nginx-proxy voi nähdä sen. Jos sovellus paljastaa useita portteja, sinun on kerrottava nginx-proxylle, mikä portti välityspalvelimelle VIRTUAL_PORT-ympäristömuuttujan avulla.
Tässä esimerkissä nginx-proxy välittää kaikki pyynnöt, jotka vastaavat blog.domain.com-url-osoitetta WordPress-säilöyn. Kaikki osoitteella jenkins.domain.com alkavat pyynnöt kuitenkin välitetään Jenkins-säilöön.
Tämä työkalu on todella yksinkertainen ja tarjoaa suurta joustavuutta. Se mahdollistaa useiden Docker-säilöjen käytön samassa omistetussa palvelimessa kirjoittamatta paljon asetuksia.
Vinkki: Säilön yhdistäminen useisiin verkkotunnuksiin: Yleinen vaatimus on käyttää useita verkkotunnuksia tietylle säilölle. Voit tehdä tämän lisäämällä isännät VIRTUAL_HOST-muuttujaan seuraavasti: VIRTUAL_HOST=domain.com,www.domain.com,home.domain.com
Lisätietoja löytyy seuraavasta URL-osoitteesta: https://github.com/jwilder/nginx-proxy.