乐趣区

关于docker:前端docker部署问题记录

前端周刊发表每周前端技术相干的大事件、文章教程、一些框架的版本更新、以及代码和工具。每周定期发表,欢送大家关注、转载。
<span style=”color:red;”> 欢送关注公众号 前端每周看</span>

前言

Docker 是一个开源的利用容器引擎,让开发者能够打包他们的利用以及依赖包到一个可移植的镜像中,而后公布到任何风行的 Linux 或 Windows 操作系统的机器上,也能够实现虚拟化。容器是齐全应用沙箱机制,相互之间不会有任何接口。
目前开发前后端拆散模式十分风行,后端只须要提供 resetful api 接口,前端也是一个独自的工程利用,那么 NGINX 配置就必不可少。
上面列出了,前端我的项目 docker 部署所遇到的问题及解决办法,1 和 2 是内网部署问题,3 和 4 外网部署问题。

次要问题

1、宿主机不能上网

公司我的项目是打包到服务器一起发给客户,机器在公司上网都是失常的,邮件到客户那上不了网。次要是因为机器在公司注册了路由表,先接入的网络路由表没有更新,执行上面的命令革除路由表

sudo ip route flush table main

而后接入网络,从新获取

2、docker 与宿主机网络不通

docker 网络模式

bridge:桥接模式

桥接模式是 docker 的默认网络设置,当 Docker 服务启动时,会在主机上创立一个名为 docker0 的虚构网桥,并抉择一个和宿主机不同的 IP 地址和子网调配给 docker0 网桥

host:主机模式

该模式下容器是不会领有本人的 ip 地址,而是应用宿主机的 ip 地址和端口。这种模式的益处就是网络性能比桥接模式的好。毛病就是会占用宿主机的端口,网络的隔离性不太好

none:无网络模式

网络模式抉择桥接模式的容器,就会连贯上 docker0 这个网桥,在通过 nat 的转换,通过宿主机的网卡,连贯外网,就能达到上外网的目标。

查看网络模式:docker network ls

问题解决

查看网桥 ip 为 172.17.0.1,容器 ip 为 172.0.0.2,发现宿主机能 ping 通网桥,然而无奈连贯容器,而容器无奈连贯网桥,无奈连贯宿主机,更别谈外网了,所以这里能够必定是网桥出了问题

  • 网桥工具

    yum install bridge-utils
    brctl show
  • 这里 docker network 生成新的网桥不行,阐明 dockernetwork存在问题,咱们利用方才下载的 bridge-utils 来创立网桥。首先暂停 docker 服务,利用指令

    systemctl stop docker
  • 增加网桥

    brctl addbr br0
  • 设置网关

    ip addr add 172.16.0.1/24 dev br0
  • 启动网桥 br0

    ip link set dev br0 up
  • 查看网络 br0

    ifconfig br0
  • 批改 docker 默认的网桥

    vi /etc/docker/daemon.json
    
    减少: "bridge":"br0"
  • 重启 docker

    systemctl start docker
  • 验证

    1. 宿主机 ping br0 网关
    ping 172.16.0.1
    
    2. 创立运行容器,进入容器,假如曾经创立了容器 a
    docker exec -it a /bin/sh
    执行:
    ip a
    能够看到 eth0 虚构网卡的 ip 地址为: 172.16.0.x
    ping www.baidu.com
    3. 宿主机 ping 容器 ip
    ping 172.16.0.x
    实现
    
  • 验证网桥重启后会不会生效,如果生效须要加到服务器的配置中

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

脚本设置

服务器重启之后,下面的配置都生效,所以要设置永恒桥接网络。能够将生成网桥的命令写在 rc.local 中,让服务启动时执行

vi /etc/rc.d/rc.loal

减少上面的内容:
/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 网桥则被删除

3、端口裸露

一个残缺的我的项目有多个利用,前端、后端、后处理等等,这些利用部署在同一台机器,每个利用都有本人的服务端口。这些服务通信是在机器外部,按理说只有凋谢一个前端端口就能够拜访,然而,敞开其余利用端口就拜访失败。
这是因为 nginx 配置 proxy_pass 应用公网 ip,须要将公网 ip 改成网关 ip,其余服务也是对应的批改

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 连贯只能用域名

退出移动版