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