項目訪問使用docker bridge網(wǎng)絡(luò)模式(端口映射)配置過程
在平常的開發(fā)工作中,我們經(jīng)常需要部署項目。比如部署測試環(huán)境、生產(chǎn)環(huán)境等,使用 docker 方式部署很便捷,可以有效的減少同樣的代碼換環(huán)境運(yùn)行的問題。docker 常見的網(wǎng)絡(luò)模式有 host、bridge 等。host 模式直接共享宿主機(jī)的網(wǎng)絡(luò)棧,容器之間沒有進(jìn)行網(wǎng)絡(luò)隔離,容器內(nèi)的應(yīng)用監(jiān)聽的端口會直接映射到主機(jī)的端口上,無需進(jìn)行端口映射,網(wǎng)絡(luò)安全性相對較差。bridge 是 docker 默認(rèn)的網(wǎng)絡(luò)模式 ,docker 守護(hù)進(jìn)程會建立 docker0 的虛擬網(wǎng)橋,容器會連接到這個網(wǎng)橋上,并獲得一個獨(dú)立的 IP 地址,容器之間及容器與外部網(wǎng)絡(luò)之間都通過 docker0 網(wǎng)橋進(jìn)行通信,需要進(jìn)行網(wǎng)絡(luò)地址轉(zhuǎn)換 (NAT)。今天,我們總結(jié)下 bridge 橋接模式的用法。
一:概述
bridge 模式為 docker 默認(rèn)的網(wǎng)絡(luò)模式,docker 會創(chuàng)建一個 docker0 的虛擬網(wǎng)橋。主要用于連接宿主機(jī)和容器之間的網(wǎng)絡(luò)通信。通過創(chuàng)建虛擬的橋接設(shè)備,將物理網(wǎng)絡(luò)接口與虛擬網(wǎng)絡(luò)網(wǎng)絡(luò)接口連接起來,進(jìn)行網(wǎng)絡(luò)隔離,使得容器的訪問更加的安全。
在同一 bridge 網(wǎng)絡(luò)中,容器可以通過 IP 地址或者容器名互相訪問,每個容器有獨(dú)立的 IP 地址,網(wǎng)絡(luò)內(nèi)部有 DNS 解析服務(wù),將容器名解析到對應(yīng)的 IP 地址,實現(xiàn)通過容器名訪問。
二:docker 網(wǎng)絡(luò)命令
1:查看所有的網(wǎng)絡(luò):
docker network ls
2:創(chuàng)建網(wǎng)絡(luò):
docker network create my_network
3:刪除網(wǎng)絡(luò):
docker network rm my_network
4:查看網(wǎng)絡(luò)詳細(xì)信息:
docker network inspect my_network
5:將容器連接到網(wǎng)絡(luò):
docker network connect my_network my_container
6:將容器與某個網(wǎng)絡(luò)的連接斷開:
docker network disconnect my_network my_container
7:刪除未使用的網(wǎng)絡(luò):docker network prune
三:nginx 端口映射
在 docker-compose.yml 文件中進(jìn)行端口映射,配置使用 my_network 自定義網(wǎng)絡(luò),如下:
services: nginx: image: nginx:latest container_name: nginx environment: TZ: Asia/Shanghai ports: - "80:80" - "443:443" - "8090:8090" volumes: # 配置文件映射 - /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf # 頁面目錄 - /usr/local/docker:/usr/share/nginx/html privileged: true networks: - my_network # 如果定義了多個服務(wù),自定義網(wǎng)絡(luò)一定要放在配置文件末尾 networks: my_network: external: true drive: bridge
ports 端口相關(guān)配置命令解釋:
指將容器的端口映射到宿主機(jī)端口上,格式為:宿主機(jī)端口:容器端口,80 端口映射為 http 方式訪問默認(rèn)端口,443 端口為 https 方式訪問默認(rèn)端口。
8090 一般為自定義的端口映射。通過 ports 端口映射,瀏覽器等可以通過宿主機(jī)的 IP 和端口訪問容器內(nèi)的服務(wù)。如果沒有 ports 映射,容器內(nèi)的服務(wù)只能在 Docker 網(wǎng)絡(luò)內(nèi)部訪問,外部網(wǎng)絡(luò)無法訪問。通過 ports 端口映射,可以靈活便捷的管理端口。
瀏覽器能訪問的端口必須在 ports 中定義,否則外部網(wǎng)絡(luò)無法訪問容器內(nèi)的服務(wù)。如果不需要外部網(wǎng)絡(luò)訪問,僅容器之間互相通信,可以不配置 ports,使用 Docker 內(nèi)部網(wǎng)絡(luò)即可。
四:后端服務(wù)端口配置
1:Dockerfile 配置
# 使用OpenJDK 17基礎(chǔ)鏡像 FROM openjdk:17 RUN mkdir -p /ruoyi/logs # 切換工作目錄 WORKDIR /ruoyi # 配置環(huán)境變量 ENV SERVER_PORT=9016 \ LC_ALL=C.UTF-8 \ JAVA_OPTS="" # 暴露應(yīng)用端口 EXPOSE 9016 # 添加應(yīng)用Jar包到容器中 ADD ruoyi-admin.jar ./app.jar # 設(shè)置容器的啟動命令,支持暴露兩個端口 ENTRYPOINT ["java", \ "-Dserver.port=${SERVER_PORT}", \ "-jar", "app.jar"]
端口配置相關(guān)命令解釋:
ENV SERVER_PORT=9016:如果項目中是動態(tài)獲取監(jiān)聽端口,那么需要在 Dockerfile 中進(jìn)行配置是必要的,如果在應(yīng)用程序中已經(jīng)硬編碼了監(jiān)聽端口,那么在 Dockerfile 中 ENV SERVER_PORT=9016 設(shè)置就沒有實際意義。
EXPOST 端口1 端口2:這個暴露的端口其實是一種指導(dǎo)作用,EXPOSE 并不會真正的將端口暴露給外部網(wǎng)絡(luò),容器內(nèi)的應(yīng)用程序是否監(jiān)聽該端口,宿主機(jī)能否訪問該端口,要通過其他配置實現(xiàn),實際是指導(dǎo)告訴鏡像的使用人員應(yīng)用程序可能監(jiān)聽了這些端口。一般為了使用清晰和方便端口管理,建議EXPOSE 的端口和應(yīng)用程序監(jiān)聽的端口保持一致。使用時注意,防止端口沖突。
2:后端項目 docker-compose.yml 配置文件
services: ruoyi-admin: image: ruoyi-admin:v1.0 container_name : ruoyi-admin ports: - "9016:9016" environment: - SERVER_PORT=9016 - TZ=Asia/Shanghai restart: always networks: - my_network networks: my_network: external: true
3:nginx.conf 配置
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 8090; server_name localhost; charset utf-8; location / { # 容器之間通過 IP 互相訪問 proxy_pass http://172.24.0.2:9016; # 容器之間通過 容器名稱 互相訪問 proxy_pass http://ruoyi-admin:9016; index index.html index.htm; } } }
注意:
在自定義 docker 網(wǎng)絡(luò)中,每個容器之間網(wǎng)絡(luò)是隔離的。localhost 在每個容器中都指向容器自身的網(wǎng)絡(luò)接口。當(dāng)用 localhost 轉(zhuǎn)發(fā)時,會轉(zhuǎn)發(fā)到 nginx 容器自身,而不是后端服務(wù)。在這種情況下,應(yīng)該使用容器在 docker 內(nèi)的 IP 地址或者 容器名稱進(jìn)行互相通信。
當(dāng)網(wǎng)絡(luò)模式為 host 模式時,共享主機(jī)的網(wǎng)絡(luò)棧,容器和宿主機(jī)共享相同的 IP 地址和端口。容器內(nèi)的 localhost 即 宿主機(jī)的 localhost。那么在 nginx 文件中配置 http://localhost:端口號 時,就可以轉(zhuǎn)發(fā)到對應(yīng)的后端服務(wù)。nginx 容器和后端服務(wù)都在同一網(wǎng)絡(luò)環(huán)境下,localhost 能夠指向宿主機(jī)上的對應(yīng)端口。
五:測試
啟動 nginx、啟動 java 項目,輸入 nginx 監(jiān)聽的端口或者 后端服務(wù)docker-compose.yml 中定義的端口映射,訪問成功,頁面如下:
六:總結(jié)
如果是開發(fā)環(huán)境,可以直接使用 host 網(wǎng)絡(luò)模式,直接共享宿主機(jī)的網(wǎng)絡(luò)棧,使用起來更加的方便,減少端口管理問題。
如果是測試環(huán)境或者生產(chǎn)環(huán)境,建議使用自定義網(wǎng)絡(luò)模式,不同的容器在不同的網(wǎng)絡(luò)模式中,可以保證容器訪問的安全,與外部網(wǎng)絡(luò)互相隔離。容器內(nèi)部之間可以通過 docker 內(nèi)部網(wǎng)絡(luò) IP 地址或者容器名稱進(jìn)行互相通信。使用自定義網(wǎng)絡(luò)模式,一定要注意端口映射,端口管理相對復(fù)雜。
network_mode 和 networks 都是 docker 網(wǎng)絡(luò)配置相關(guān)。network_mode 直接指定網(wǎng)絡(luò)模式,支持 bridge、host、none 等模式。只支持一種網(wǎng)絡(luò)模式。networks 支持自定義網(wǎng)絡(luò)、多網(wǎng)絡(luò)配置,支持 bridge、overlay 等驅(qū)動,支持一個容器加入多個網(wǎng)絡(luò)。
使用自定義網(wǎng)絡(luò),如果后端服務(wù)沒有暴露端口,那么要確保 nginx、后端服務(wù)等容器在同一個 docker 網(wǎng)絡(luò)中,這樣在瀏覽器中能訪問 nginx 監(jiān)聽的端口轉(zhuǎn)發(fā)到后端服務(wù)。使用自定義網(wǎng)絡(luò),就是為了網(wǎng)絡(luò)隔離,容器一般情況下不給外部暴露端口。如 mysql 服務(wù) 和 后端服務(wù)沒有在同一個自定義網(wǎng)絡(luò)中,但是ports 主要就是將容器內(nèi)的端口映射到宿主機(jī)的端口,允許外部網(wǎng)絡(luò)訪問容器內(nèi)的服務(wù)。后端項目如果沒有定義 ports,外部網(wǎng)絡(luò)無法直接訪問后端服務(wù),nginx 可以通過容器名稱訪問后端服務(wù)。nginx 定義了 ports,將宿主機(jī)的端口映射到容器的端口上,外部網(wǎng)絡(luò)可以訪問 nginx,nginx 將請求轉(zhuǎn)發(fā)到后端服務(wù)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 解決docker網(wǎng)絡(luò)錯誤(network bridge not found)
- docker的WARNING:bridge-nf-call-iptables is disabled的解決方案
- docker容器間互相訪問(docker bridge網(wǎng)絡(luò))
- 解決docker安裝完成報:bridge-nf-call-iptables is disabled問題
- Docker與iptables及實現(xiàn)bridge方式網(wǎng)絡(luò)隔離與通信操作
- Docker 默認(rèn)bridge網(wǎng)絡(luò)中配置DNS的方法
- Docker 配置網(wǎng)絡(luò)使用bridge網(wǎng)絡(luò)的方法
相關(guān)文章
Docker下利用jenkins和docker實現(xiàn)持續(xù)交付
這篇文章主要介紹了利用jenkins和docker實現(xiàn)持續(xù)交付功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05docker搭建CMS點(diǎn)播系統(tǒng)帶播放器功能
熟悉docker的童鞋都知道,安裝是非常的便利的,也可以在線體驗的,今天通過本文給大家介紹docker搭建CMS點(diǎn)播系統(tǒng)帶播放器功能,感興趣的朋友跟隨小編一起看看吧2021-05-05windows安裝Docker與docker-compose套裝的詳細(xì)教程
這篇文章主要介紹了windows安裝Docker與docker-compose套裝的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12