基于docker容器 NGINX配置HTTP转发HTTPS以及 docker 容器之间的相互通信

Scroll Down

docker安装nginx

docker pull nginx

docker 启动nginx

docker run --name nginx \
    -p 80:80 \
    -p 443:443 \
    // nginx日志
    -v ~/docker/nginx/logs:/var/log/nginx \
    // nginx配置文件
    -v ~/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf --privileged=true \
    // 证书
    -v ~/docker/nginx/cert:/root/cert \
    // 利用meta刷新 http 跳转 https
    -v ~/docker/nginx/html:/root/html \ 
    -d nginx:latest

配置nginx.conf

server {
    listen  443 ssl;
    server_name     www.test.com;

    charset                UTF-8;

    #ssl
    ssl     on; #如果强制HTTPs访问,这行要打开

    ssl_certificate   证书文件地址;
    ssl_certificate_key  密钥文件地址;

    ssl_session_cache               shared:SSL:1m;  #储存SSL会话的缓存类型大小
    ssl_session_timeout             5m;     #会话过期时间
    ssl_protocols  SSLv2 SSLv3 TLSv1.2; # 指定密码为openssl支持的格式

    ssl_ciphers  HIGH:!aNULL:!MD5;  # 密码加密方式
    ssl_prefer_server_ciphers  on;   # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码

    location / {
        // 转发放过静态资源(否则页面样式JS会丢失) 
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        // 转发地址
        proxy_pass http://www.test.com:8000;
    }
}

利用meta的刷新作用将http跳转到https

20200522154531.png

server {
    listen 80;
    server_name www.test.com;
    location / {
        root  /root/html/index.html;
    }
    error_page 404 https://www.test.com;
}

docker容器之间的相互通信 (brige模式:不支持多宿主机)

上面的配置需要服务器对外开放服务端的端口,

别人可以不通过nginx也能访问你的服务(例:http://www.test.com:8000),
想要避免这种现象的出现就要关闭服务端的端口,然后你就发现访问不到服务了。想要解决这种问题就涉及到了docker容器之间的相互通信
实际上的解决办法就是建立网卡让两个容器处在同一环境下就能相互访问了.我用的是docker-compose.yml(docker compose详解)来处理这个问题

docker-compose详细配置

version: "3"

services:
test:
image: test
container_name: test
expose:
- "8000"
restart: always

nginx:
image: nginx
container_name: nginx
volumes:
- "~/docker/nginx/logs:/var/log/nginx"
- "~/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "~/docker/nginx/cert:/root/cert"
- "~/docker/nginx/html:/root/html"
ports:
- "80:80"
- "443:443"
depends_on:
- test
restart: always
docker-compose up -d 启动服务
20200522164933.png
使用 docker-compose去管理这两个服务 docker 会默认给这两个服务建立一个brige模式的网卡,大致信息如下
20200522165446.png

然后 我们再更改下 nginx.conf配置

之前的
location / {
.....
proxy_pass http://www.test.com:8000
}
更改之后
location / {
.....
proxy_pass http://test(容器名):8000
}

这样就完美的解决了不对外暴露服务端的端口 别人只能通过访问nginx来访问你的服务