Nginx容器配置宿主机和容器的工作目录挂载和多个端口监听等
Docker安装Nginx,配置宿主机和容器的工作目录挂载和多个端口监听等
https://www.cnblogs.com/haoxianrui/p/13591429.html
Docker安装nginx
下载nginx镜像
docker pull nginx
查看下载的nginx镜像
docker images
根据镜像 创建 一个容器
docker run -p 9091:80 --name nginx -d nginx
--name #给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器
-p #映射端口,将docker宿主机的9091端口和容器的80端口进行绑定
-v #挂载文件用的
-d #表示启动的是哪个镜像。

Nginx服务的配置和部署
为什么需要做文件的映射?
我们在使用容器的过程中需,有时候需要对容器中的文件进行修改管理,如果不做文件映射的化,我们使用docker exec -it 容器ID/容器名 /bin/bash 才能进入nginx中的文件里面如图
如果把关键文件映射到主机上,那么就可以在主机中进行修改而不必进入文件当中才进行修改了。
将nginx的配置文件、日志目录映射到宿主机
先在宿主机上 新建目录,用于存储映射文件。
mkdir -p /home/docker/nginx/{conf,conf/conf.d,log,www}
宿主机 docker /home/docker/nginx/www /usr/share/nginx/html #网页文件 /home/docker/nginx/conf/nginx.conf /etc/nginx/nginx.conf#配置文件 /home/docker/nginx/logs /var/log/nginx#日志文件
# 复制容器内文件到宿主机指定目录
docker cp nginx:/etc/nginx/nginx.conf /home/docker/nginx/conf/nginx.conf
docker cp nginx:/etc/nginx/conf.d/default.conf /home/docker/nginx/conf/conf.d/
docker cp nginx:/usr/share/nginx/html/index.html /home/docker/nginx/www/
# 把先前的nginx容器 停止并删除
docker stop nginx
docker rm nginx
# 运行nginx,同时进行文件挂载
docker run -p 9091:80 --name nginx \
-v /home/docker/nginx/www:/usr/share/nginx/html \
-v /home/docker/nginx/log:/var/log/nginx \
-v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/docker/nginx/conf/conf.d/:/etc/nginx/conf.d/ \
-d nginx
# 修改配置文件内容并重新加载 Nginx 的配置文件(以下命令二选一即可)
docker exec -it nginx nginx -s reload
docker kill -s HUP nginx
Nginx配置
通过nginx为多个域名配置服务,使得通过浏览器可以访问到相应的域名。
创建 不同的 域名文件夹
在映射到主机下的
/home/docker/nginx/www下【域名的文件夹】mkdir -p /home/docker/nginx/www/{www.51automate.cn,fv2.51automate.cn,myfav.51automate.cn,blog.51automate.cn}
新建我的配置文件
my.conftouch /home/docker/nginx/conf/conf.d/my.conf
配置内容如下:
server { listen 80; server_name myfav.51automate.cn; location / { root /usr/share/nginx/html/myfav.51automate.cn; index index.html index.htm; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://www.51automate.cn:9090/; # proxy_pass http://127.0.0.1:9090/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } server { listen 80; # 注意这里nginx 监听的是容器内的端口(我们启动的容器就将容器内的80端口 映射到 宿主机的其它端口) server_name fv2.51automate.cn; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html/fv2.51automate.cn; # 注意 nginx的工作目录 是容器内 前端文件的根目录,而非宿主机目录 index index.html index.htm; # 前端主页 try_files $uri $uri/ /index.html; } # 访问链接中出现 /api/ 就转发到本地的8888端口(该端口是 后端服务端口) location /api/ { proxy_pass http://www.51automate.cn:8888/api/; # ip+端口 或者 域名+端口,不可使用 localhost 或者 127.0.0.1。原因:容器是一个独立的运行环境,容器内部的 localhost 地址指向的是容器本身,而不是宿主机。而我们的后端代码是运行在宿主机上。 # proxy_pass http://127.0.0.1:8888/; # 不可使用 } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }配置内容这里重点强调2点
root的路径 : nginx的工作目录 是容器内 前端文件的根目录,而非宿主机目录
location / { root /usr/share/nginx/html/fv2.51automate.cn; # 注意 nginx的工作目录 是容器内 前端文件的根目录,而非宿主机目录 index index.html index.htm; # 前端主页 try_files $uri $uri/ /index.html; }proxy_pass 配置 。正确的写法是: ip+端口 或者 域名+端口,不可使用 localhost 或者 127.0.0.1。
原因:容器是一个独立的运行环境,容器内部的 localhost 地址指向的是容器本身,而不是宿主机, 而我们的后端代码是运行在宿主机上。
试试效果


vue前端项目打包文件 放在 对应的 域名文件下,即可完成部署。
默认情况下 我们需要宿主机的
80端口,免得用户每次都要输入一个端口,很不友好。# 把先前的nginx容器 停止并删除 docker stop nginx docker rm nginx # 运行nginx,同时进行文件挂载 docker run -p 80:80 --name nginx \ -v /home/docker/nginx/www:/usr/share/nginx/html \ -v /home/docker/nginx/log:/var/log/nginx \ -v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /home/docker/nginx/conf/conf.d/:/etc/nginx/conf.d/ \ -d nginx # 修改配置文件内容并重新加载 Nginx 的配置文件(以下命令二选一即可) docker exec -it nginx nginx -s reload docker kill -s HUP nginx
重新访问
fv2.51automate.cn搞定。
上面配置文件的内容 有这样一段
# 访问链接中出现 /api/ 就转发到本地的8888端口(该端口是 后端服务端口)
location /api/ {
proxy_pass http://127.0.0.1:8888/api/;
可以用来解决前端跨域问题;也可进行反向代理。
到此普通用户已经够用了,更多信息可参考:https://blog.51cto.com/u_14020077/5836696
