Linux(CentOS7.9)Docker部署nginx(配置反向代理、负载均衡)
docker 常用基本操作命令
[repository]:[tag] 在没有指定tag时,默认是latest,代表最新版本的镜像
mysql(Repository)存储库: 5.7(Tag)标签docker pull nginx 拉取nginx镜像
docker images 查看拉取到的镜像
docker xx --help 查看xx的命令语法
docker save 导出镜像到磁盘
docker load 加载镜像
docker rmi 删除镜像
docker push 上传镜像容器命令
docker run --name mn -p 80:80 -d nginx
docker run:创建并运行一个容器
--name:给容器起一个名字,比如叫做mn
-p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口。-p 宿主机端口:容器端口
-d:后台运行容器
nginx:镜像名称,例如nginxdocker exec 进入容器执行命令
docker logs 查看容器运行日志
docker ps 查看所有运行的容器及状态
docker pause 暂停容器
docker unpause 运行容器
docker stop 停止容器
docker start 开启容器
docker rm 删除指定容器docker rm -f <container_id> 强制停止并删除容器,将
<container_id>替换为容器的 ID 或名称。如果不确定容器的 ID,可以使用docker ps查看所有正在运行的容器。
1. 拉取Nginx镜像
docker pull nginx
docker容器可以做到秒级启动,开箱即用,用完即可删除。但是如果你希望容器内的文件持久化存储,就需要把容器内的目录和配置文件挂载出来。
nginx通常需要持久化的目录以及配置的容器路径(有时可能还得挂载个日志目录):
①nginx容器内部署前端的路径
/usr/share/nginx/html
② nginx容器内配置文件路径。nginx.conf 用于配置反向代理、负载均衡、动静分离....
/etc/nginx/nginx.conf
2. 开始正式挂载容器文件目录
2.1 在宿主机(CentOS7.9)上,创建两个目录用来存放上边说的前端文件和nginx配置文件
登录CentOS执行以下命令:
回到根目录
cd /
进入咱们的/usr/local下
cd /usr/local
创建nginx文件夹后再进入nginx文件夹里创建前端文件夹,nginx配置文件夹
mkdir nginx //创建nginx文件夹
cd nginx //进入nginx文件夹
mkdir html //创建前端文件夹
mkdir conf //创建nginx配置文件夹

上面是用命令的方式创建目录,另外也可以借助xftp以图形界面的方式创建目录,如下图:

2.2 使用docker 创建一个 nginx 容器
docker run --name mynginx --rm -d nginx
--rm 表示容器停止后就删除该容器
-d 表示后台运行容器, -d nginx 这里的nginx是表示nginx镜像
--name 给容器起名字,mynginx就是容器的名字
2.3 使用以下命令查看创建的 mynginx 容器是否正在运行中
docker ps

2.4 把nginx容器内的默认配置文件拷贝到刚才创建的nginx宿主机配置文件夹目录/usr/local/nginx/conf 下
docker cp mynginx:/etc/nginx/nginx.conf /usr/local/nginx/conf
2.5 拷贝完成后停止nginx容器
docker stop mynginx
nginx容器停止后,使用docker ps -a 查看容器,你就看不到了
-a 表示查看所有容器, 不加查看正在运行的容器
2.6 现在就开始正式的文件挂载,(注意:以下是一整行命令)
docker run --restart always --name mynginx -d -p 80:80 -v /usr/local/nginx/html:/usr/share/nginx/html -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx
这条 Docker 命令用于运行一个名为 `mynginx` 的 Nginx 容器,并且具备以下含义:
1. **`docker run`**:运行一个新的 Docker 容器。
2. **`--restart always`**:设置容器的自动重启策略为 `always`,即使容器意外退出也会自动重启,除非手动停止容器。
3. **`--name mynginx`**:将容器命名为 `mynginx`,便于后续管理。
4. **`-d`**:以“分离模式”运行容器,即容器会在后台运行,不会占用当前终端。
5. **`-p 80:80`**:将主机的 80 端口映射到容器的 80 端口,这样用户可以通过主机的 80 端口访问容器中的 Nginx 服务。
6. **`-v /usr/local/nginx/html:/usr/share/nginx/html`**:挂载主机的 `/usr/local/nginx/html` 目录到容器的 `/usr/share/nginx/html` 目录。Nginx 默认在这个目录下寻找 HTML 文件,因此这样可以方便地将主机上的 HTML 文件暴露给 Nginx。
7. **`-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf`**:挂载主机的 Nginx 配置文件 `/usr/local/nginx/conf/nginx.conf` 到容器的 `/etc/nginx/nginx.conf`,以使用主机上的自定义 Nginx 配置文件覆盖容器中的默认配置。
8. **`nginx`**:指定使用 Nginx 镜像来创建容器。
**注意**:这条命令中 `-v /usr/local/nginx/html: /usr/share/nginx/html` 中的挂载路径 `:/usr/share/nginx/html` 前不能有多余的空格,需去掉才能正常运行。
--restart always 保证特殊情况重启容器
-p 把容器内的端口映射到宿主机, -p [宿主机端口]:[容器内端口]
这样我们直接在浏览器输入你的服务器ip就可以看到nginx的欢迎页了,阿里云服务器还要在安全组内开放80端口。
-v 就是把容器内的目录映射到宿主机的目录,这样就算容器删除了我们的数据还在 。
以后部署的时候就可以把前端打包后的静态资源放在/usr/local/nginx/html路径下,然后执行docker restart mynginx就可以啦!
From ChatGPT:
注意:要为已经创建的容器挂载新的 Volume,直接修改已经存在的容器是不行的。常见的方案是重新创建一个容器并指定挂载配置。以下是两种实现方式:
### 方法一:删除并重新创建容器
1. **查看当前容器的配置**:可以使用以下命令获取容器的创建配置,以便重新创建容器时保持相同的设置。
docker inspect <container_id>2. **停止并删除旧容器**:
docker stop <container_id> docker rm <container_id>3. **重新创建容器并挂载 Volume**:
假设要将宿主机的 `/path/to/host/dir` 目录挂载到容器的 `/path/to/container/dir`,可以使用以下命令重新创建容器:
docker run -d --name <container_name> -v /path/to/host/dir:/path/to/container/dir <image_name>在这里,`-v` 参数用于指定新的 Volume 挂载路径。
### 方法二:使用 `docker commit` 保留当前容器状态并创建新容器
如果需要保留当前容器的所有更改,使用 `docker commit` 创建一个新的镜像,然后基于这个镜像启动新容器。
1. **提交当前容器为新镜像**:
docker commit <container_id> <new_image_name>这会基于当前容器的状态创建一个新的镜像。
2. **使用新镜像创建容器并挂载 Volume**:
docker run -d --name <new_container_name> -v /path/to/host/dir:/path/to/container/dir <new_image_name>这样,新的容器会保留旧容器的状态,同时挂载上指定的 Volume。
3. 配置nginx反向代理
3.1 进入nginx配置挂载目录/usr/local/nginx/conf,打开目录中配置文件vim nginx.conf,在http块中添加以下代码
http{
server{
#监听的端口
listen 80;
#字符格式
charset utf-8;
#当前的服务器ip
server_name 192.168.112.135;
location / {
#要代理去哪个服务器的ip以及端口
proxy_pass http://192.168.112.135:8080;
#被代理服务器返回默认的响应头中的location头域以及refresh头域数值
proxy_redirect default;
}
}
}
这样子就可以用本机的80端口代理其它服务器的8080端口。
location 指令说明
该指令用于匹配 URL。

语法如下:
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配
成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字
符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location
块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
4. 配置nginx负载均衡
4.1 进入nginx配置挂载目录/usr/local/nginx/conf,打开目录中配置文件 vim nginx.conf,在http块中添加以下代码:
http{
#upstream:up服务流
#myserver:自定义服务流名称
upstream myserver{
#负载均衡五种策略,这里写的是iphash与权重,默认不写则为轮询策略
ip_hash;
#===========
#需要代理的服务器ip地址以及端口,并且设置了权重
server 115.28.52.63:8080 weight=1;
server 115.28.52.63:8181 weight=1;
}
server{
#监听的端口
listen 80;
#字符格式
charset utf-8;
#当前的服务器ip
server_name 192.168.112.135;
location / {
#代理上边自定义的服务流名称
proxy_pass http://myserver;
#被代理服务器返回默认的响应头中的location头域以及refresh头域数值
proxy_redirect default;
#连接超时 默认为60秒
proxy_connect_timeout 65s;
#读取超时 默认为60秒
proxy_read_timeout 65s;
#发送超时 默认为60秒
proxy_send_timeout 65s;
}
}
}
在 linux 下有 Nginx、LVS、Haproxy 等可以提供负载均衡服务,而且 Nginx 提供了几种分配方式(策略):
1 、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2 、 weight
weight 代表权 , 重默认为 1, 权重越高被分配的客户端越多。
指定轮询几率, weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:
upstream server_pool {
server 192.168.5.21 weight = 10 ;
server 192.168.5.22 weight = 10 ;
}
3 、 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。例如:
upstream server_pool {
ip_hash ;
server 192.168.5.21:80 ;
server 192.168.5.22:80 ;
}
4 、 fair (第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool {
server 192.168.5.21:80 ;
server 192.168.5.22:80 ;
fair ;
}
更多推荐


所有评论(0)