Linux docker运行nginx容器为后台项目做域名反向代理(含HTTPS) 学习教程

这段时间在研究docker,在部署nginx时遇到了坑,最主要的问题是在挂载文件和文件夹的时候不知道怎么挂载,经过反复实验以及查看网上的教程,先总结如下:

项目打包部署

记住项目端口号,下面挂在配置需要使用

首先安装docker
  1. 下载docker
yum install docker

sudo wget -qO- https://get.docker.com | sh

出现如下场景代表docker安装成功:
Linux docker运行nginx容器为后台项目做域名反向代理(含HTTPS) 学习教程_第1张图片

  1. 安装完成后,查看docker版本
docker version

docker -v

在这里插入图片描述

  1. 启动docker
service docker start

#centos7开始的版本可以执行systemctl命令,注意自己服务器的版本
systemctl start docker
  1. 设置开机自启
systemctl enable docker

设置自启成功:
在这里插入图片描述
至此docker安装完毕

挂载配置准备
  1. 创建一个nginx基础容器以从容器中复制原生配置文件到主机上
docker run --name=nginx -p 80:80 -d nginx

在这里插入图片描述

  1. /usr/local目录下新建nginx文件夹
  2. /usr/local/nginx目录下新建conf.d文件夹,拉取default.conf子配置文件
    注:文件名可以自定义,遵循*.conf命名规则,*可以使用域名代替,方便区分配置文件
docker cp nginx:/etc/nginx/conf.d/default.conf /usr/local/nginx/conf.d/

文件内容(修改):

server {
    listen       80;#配置监听端口
    listen  [::]:80;
    server_name  xxx.xxx.xxx;#配置域名

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
    	proxy_pass  http://公网ip:项目端口号;#切记不要使用localhost当ip
    	#当没一个server里面没有其他的路径可以访问时会默认访问该配置目录下的文件
        root   /usr/share/nginx/html;
        #首页定义默认访问的是哪个文件 如果index.html没有找到就会去找index.htm
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    #修改404 状态码的对应的指向的访问目录,修改后需重启服务器。
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}


  1. /usr/local/nginx目录下拉取nginx.conf主配置文件
docker cp nginx:/etc/nginx/nginx.conf /usr/local/nginx/

文件内容:


user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

  1. 删除该容器
docker kill nginx
docker rm nginx

在这里插入图片描述

pull下载nginx镜像包并启动
  1. pull下载最新nginx镜像包
docker pull nginx

nginx镜像拉取完成:
Linux docker运行nginx容器为后台项目做域名反向代理(含HTTPS) 学习教程_第2张图片

  1. 启动nginx容器
docker run --name=nginx -p 80:80 
-v /usr/local/nginx/conf.d:/etc/nginx/conf.d 
-v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf 
-d nginx
  • –name=nginx | 容器命名为nginx
  • -p 80:80 | 主机端口:宿主机端口
  • -v /usr/local/nginx/conf.d:/etc/nginx/conf.d | 主机地址:宿主机挂载地址
  • -d nginx | 启动版本为nginx的容器

启动成功:
在这里插入图片描述
若在启动过程中遇到如下问题:
在这里插入图片描述
说明Linux和docker版本兼容问题,多半是docker版本过低,解决方法如下:

a. 更新yum包

yum update

b. 卸载已安装的docker(如果安装过的话)

yum remove docker  docker-common docker-selinux docker-engine

c. 安装依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

d. 设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

(官方下载过慢) 替换文件中的地址为清华大学的地址:

sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

e. 安装Docker

sudo yum makecache fast
sudo yum install docker-ce

f. 配置Docker的镜像加速器
这里采用阿里云的镜像加速服务,具体位置见图。

vim /etc/docker/daemon.json

写入以下内容,注意替换你的加速地址\

{
  "registry-mirrors": ["https://你的加速器地址.mirror.aliyuncs.com"]
}

Linux docker运行nginx容器为后台项目做域名反向代理(含HTTPS) 学习教程_第3张图片
g. 启动Docker服务并设置自启

systemctl start docker
systemctl enable docker

如此问题应该可以解决,重复挂载配置准备开始的流程.
请求项目里的GET请求测试,出现如下页面代表nginx部署成功(域名不带端口号):
Linux docker运行nginx容器为后台项目做域名反向代理(含HTTPS) 学习教程_第4张图片
如果出现域名DNS解析失败或者服务器找不到ip等问题,确保域名已备案/DNS解析配置正确,对应的服务器到对应的DNS配置里查看,一般都应该有对应的域名诊断工具(如:腾讯云域名诊断工具).

部署完成

到此可以使用域名+URL的方式调用接口

HTTPS

以腾讯云为例:

  1. 前往证书管理申请免费证书并下载证书到本地
    Linux docker运行nginx容器为后台项目做域名反向代理(含HTTPS) 学习教程_第5张图片
  2. 前往证书监控 SSLPod,添加站点,填写域名/监控类型(https)/端口(443),配置成功前状态为连接异常红色字段
    Linux docker运行nginx容器为后台项目做域名反向代理(含HTTPS) 学习教程_第6张图片
  3. 将第一步下载的SSL证书文件放到服务器上准备进行挂载
    Linux docker运行nginx容器为后台项目做域名反向代理(含HTTPS) 学习教程_第7张图片
  4. 修改default.conf配置文件加入SSL监听
server {
    listen       80;#配置监听端口
    listen  [::]:80;
    listen 443 ssl;
    #填写绑定证书的域名
    server_name 域名;    
    #证书文件名称
    ssl_certificate  /ssl/XXX.crt; 
    #私钥文件名称
    ssl_certificate_key /ssl/XXX.key; 
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
	proxy_pass  http://公网ip:端口号;
	root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

  1. docker保证nginx同名容器不在运行状态并启动nginx容器
docker run --name=nginx -p 443:443 -p 80:80 -v /usr/local/nginx/conf.d:/etc/nginx/conf.d -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/ssl/:/ssl/  -d nginx
HTTPS部署完成

Linux docker运行nginx容器为后台项目做域名反向代理(含HTTPS) 学习教程_第8张图片

你可能感兴趣的:(Linux,docker,nginx,linux,centos,java)