在DockerHub搜 nginx,第一个就是官方镜像库,这里使用1.27.2版本演示
1.下载镜像
docker pull nginx:1.27.2
2.测试运行
docker run --name nginx -p 9090:80 -d nginx:1.27.2
这里绑定了宿主机的9090端口,只要访问宿主机的9090端口,就会转发到docker nginx的80端口上。
3.把 nginx.conf文件拷贝出来
docker cp 504b691dc5f9:/etc/nginx/nginx.conf ~/server/conf/
4.停掉并删除当前容器
docker stop 504b691dc5f9
docker rm 504b691dc5f9
5.重新运行docker,把conf文件和日志目录绑定到docker上
Note:自己在wsl2子系统/home下创建/server/conf /server/log 文件夹
docker run -p 9090:80 --name nginx -v ~/server/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/server/log:/var/log/nginx -d nginx:1.27.2
更新2:
docker中的nginx转发至另一个nginx的fastapi服务
2.1 为了避免nginx转发后,fastapi的api文档打不开,或者当有多个服务运行的时候,nginx配置api文档路径冲突,那么可以在fastapi中重新显示的配置文档地址,如下:
mROOT_URL= "/sql/user"
app = FastAPI(
title="MS User Database Service",
version="1.0.0",
docs_url=f"{mROOT_URL}/docs",
redoc_url=f"{mROOT_URL}/redoc",
openapi_url=f"{mROOT_URL}/openapi.json",
lifespan=lifespan)
2.2 打包dockerfile,生成fastapi的docker镜像
docker image build -t fastapi_test:v01 .
例如我编译了一个名为fastapi_test:v01的镜像
2.3 运行docker:
docker run --name v_fastapi_test -p 7000:7000 -d fastapi_test:v01
检查可以正常通过7000端口打开文档
2.4 修改拷贝出来的nginx.conf文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
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;
# comment this line , because it will load other sub-fule
#include /etc/nginx/conf.d/*.conf;
server {
listen 80; # prot
server_name localhost; # listening address
# nginx default address, using for nginx deployment test
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /sql/user {
proxy_pass http://host.docker.internal:7000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
expires -1;
}
}
}
首先注释掉#include /etc/nginx/conf.d/*.conf; 不然加载的默认子文件会覆盖端口造成WARNING
添加server部分,这个可以用来验证nginx部署启动完成
转发到fastapi的7000端口,这里使用host.docker.internal来表示宿主机,因为宿主机已经映射了7000端口到fastapi的docker了,使用1.1的版本。
2.5 运行nginx的docker
docker run -p 80:80 --name nginx_test -v ~/server/conf/nginx.conf:/etc/nginx/nginx.conf -v ~/
server/log:/var/log/nginx -d nginx:1.27.2
将宿主机的80端口映射到docker中的80端口,绑定wsl2中的nginx.conf文件到docker中,这样默认就会被宿主机的配置文件覆盖,绑定log文件夹。
2.6 测试,如下图,看到转发成功