前端docker部署問題記錄

前端周刊發(fā)表每周前端技術(shù)相關(guān)的大事件、文章教程、一些框架的版本更新、以及代碼和工具。每周定期發(fā)表,歡迎大家關(guān)注、轉(zhuǎn)載。
<span style="color:red;">歡迎關(guān)注公眾號前端每周看</span>

前言

Docker 是一個開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的鏡像中,然后發(fā)布到任何流行的 Linux 或 Windows 操作系統(tǒng)的機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會有任何接口。
目前開發(fā)前后端分離模式非常流行,后端只需要提供 resetful api 接口,前端也是一個單獨(dú)的工程應(yīng)用,那么 NGINX 配置就必不可少。
下面列出了,前端項(xiàng)目 docker 部署所遇到的問題及解決辦法,1 和 2 是內(nèi)網(wǎng)部署問題,3 和 4 外網(wǎng)部署問題。

主要問題

1、宿主機(jī)不能上網(wǎng)

公司項(xiàng)目是打包到服務(wù)器一起發(fā)給客戶,機(jī)器在公司上網(wǎng)都是正常的,郵件到客戶那上不了網(wǎng)。主要是因?yàn)闄C(jī)器在公司注冊了路由表,先接入的網(wǎng)絡(luò)路由表沒有更新,執(zhí)行下面的命令清除路由表

sudo ip route flush table main

然后接入網(wǎng)絡(luò),重新獲取

2、docker 與宿主機(jī)網(wǎng)絡(luò)不通

docker 網(wǎng)絡(luò)模式

bridge:橋接模式

橋接模式是 docker 的默認(rèn)網(wǎng)絡(luò)設(shè)置,當(dāng) Docker 服務(wù)啟動時,會在主機(jī)上創(chuàng)建一個名為 docker0 的虛擬網(wǎng)橋,并選擇一個和宿主機(jī)不同的 IP 地址和子網(wǎng)分配給 docker0 網(wǎng)橋

host:主機(jī)模式

該模式下容器是不會擁有自己的 ip 地址,而是使用宿主機(jī)的 ip 地址和端口。這種模式的好處就是網(wǎng)絡(luò)性能比橋接模式的好。缺點(diǎn)就是會占用宿主機(jī)的端口,網(wǎng)絡(luò)的隔離性不太好

none:無網(wǎng)絡(luò)模式

網(wǎng)絡(luò)模式選擇橋接模式的容器,就會連接上 docker0 這個網(wǎng)橋,在通過 nat 的轉(zhuǎn)換,通過宿主機(jī)的網(wǎng)卡,連接外網(wǎng),就能達(dá)到上外網(wǎng)的目的。

查看網(wǎng)絡(luò)模式: docker network ls

問題解決

查看網(wǎng)橋 ip 為172.17.0.1,容器 ip 為172.0.0.2,發(fā)現(xiàn)宿主機(jī)能 ping 通網(wǎng)橋,但是無法連接容器,而容器無法連接網(wǎng)橋,無法連接宿主機(jī),更別談外網(wǎng)了,所以這里可以肯定是網(wǎng)橋出了問題

  • 網(wǎng)橋工具

    yum install bridge-utils
    brctl show
    
  • 這里docker network生成新的網(wǎng)橋不行,說明dockernetwork存在問題,我們利用剛才下載的bridge-utils來創(chuàng)建網(wǎng)橋。首先暫停docker服務(wù),利用指令

    systemctl stop docker
    
  • 添加網(wǎng)橋

    brctl addbr br0
    
  • 設(shè)置網(wǎng)關(guān)

    ip addr add 172.16.0.1/24 dev br0
    
  • 啟動網(wǎng)橋 br0

    ip link set dev br0 up
    
  • 查看網(wǎng)絡(luò) br0

    ifconfig br0
    
  • 修改 docker 默認(rèn)的網(wǎng)橋

    vi /etc/docker/daemon.json
    
    增加: "bridge":"br0"
    
  • 重啟 docker

    systemctl start docker
    
  • 驗(yàn)證

    1. 宿主機(jī)ping br0網(wǎng)關(guān)
    ping 172.16.0.1
    
    2. 創(chuàng)建運(yùn)行容器,進(jìn)入容器,假設(shè)已經(jīng)創(chuàng)建了容器 a
    docker exec -it a /bin/sh
    執(zhí)行:
    ip a
    可以看到eth0虛擬網(wǎng)卡的ip地址為: 172.16.0.x
    ping www.baidu.com
    3. 宿主機(jī)ping容器ip
    ping 172.16.0.x
    完成
    
    
  • 驗(yàn)證網(wǎng)橋重啟后會不會失效,如果失效需要加到服務(wù)器的配置中

參考: https://blog.csdn.net/qq_36059826/article/details/106550332

腳本設(shè)置

服務(wù)器重啟之后,上面的配置都失效,所以要設(shè)置永久橋接網(wǎng)絡(luò)。可以將生成網(wǎng)橋的命令寫在 rc.local 中,讓服務(wù)啟動時執(zhí)行

```
vi /etc/rc.d/rc.loal

增加下面的內(nèi)容:
/usr/sbin/brctl addbr br0
/usr/sbin/ip addr add 172.16.0.1.24 dev br0
/usr/sbin/ip link set dev br0 up

切記
chmod +x rc.local

重啟后 docker0網(wǎng)橋則被刪除
```

3、端口暴露

一個完整的項(xiàng)目有多個應(yīng)用,前端、后端、后處理等等,這些應(yīng)用部署在同一臺機(jī)器,每個應(yīng)用都有自己的服務(wù)端口。這些服務(wù)通信是在機(jī)器內(nèi)部,按理說只要開放一個前端端口就可以訪問,但是,關(guān)閉其他應(yīng)用端口就訪問失敗。
這是因?yàn)?nginx 配置 proxy_pass 使用公網(wǎng) ip,需要將公網(wǎng) ip 改成網(wǎng)關(guān) ip,其他服務(wù)也是對應(yīng)的修改

4、nginx 配置支持 https 和 wss

nginx 配置如下

map $http_upgrade $connection_upgrade {
 default upgrade;
 '' close;
}

upstream wsbackend {
 server 172.18.0.1:8000;
}
server {
     listen 443 ssl;
     server_name 域名;
     ssl_certificate     證書.crt;
     ssl_certificate_key 證書.key;
     ssl on;
     # ---
     ssl_prefer_server_ciphers on;
     ssl_verify_client off;
     ssl_session_cache shared:SSL:10m;
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;
     ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
     # ---

     root /dist;

     location ~* (.+)\.html {
           add_header Cache-Control no-cache;
         }

     location / {
             try_files $uri $uri/ /index.html;
         }

     location ~ ^/api {
                   proxy_pass http://wsbackend;
                   proxy_set_header Host $host;
                   proxy_set_header X-Real-IP $remote_addr;
                   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                   # Websocket代理配置
                   proxy_set_header Upgrade $http_upgrade;
                   proxy_set_header Connection "Upgrade";
                   proxy_buffering off;
                   proxy_read_timeout 3600;
              }


}

注意: WSS 連接只能用域名

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容