介绍
本来是用的nginx
的windows
版本,但是后面考虑要容器化部署项目,并且相关的软件,数据库、redis
等也是单独安装的。既然要使用docker
,那索性把能容器化的软件全部使用docker
来处理。由于安装过程中踩了一些坑,所以就有了这篇文章,记录以防以后再次踩坑。
具体步骤
首先你需要在你的win10
上安装docker
,具体怎么安装可参考此文。
拉取镜像
我使用的镜像版本是1.23,当然你也可以使用latest的。可以在powershell
中使用如下命令拉取镜像。
docker pull nginx:1.23
使用之前在网上搜了如何使用,都说需要提前在官网上现在一个配置文件,以便用数据卷映射到docker
内部进行配置。但是实际现在的nginx.conf文件都不是非常合适,所以该怎么办呢?
获取默认配置文件
实际上我们可以用以下命令先运行一个容器。
docker run --name nginx -p 9001:80 -d nginx:1.23
注意:9001的端口是win10上的, 可以随便定义。
也可以通过可视化界面查看容器启动的具体日志详细。
然后运行以下命令进入容器内部进行查看。nginx
默认安装在/etc/
文件夹下。
docker exec -it nginx bash
通过上图我们可以看到nginx
容器内部是有默认的配置文件的,不过它分为两个部分。一个是nginx
根目录下的nginx.conf文件,还有一个在conf.d
文件夹下,名字是default.conf。我们可以在容器内通过cat
命令进行查看,但我更建议将这两个文件拷贝到宿主机,即win10
的硬盘中,更方便查看。可以通过以下命令完成配置文件的拷贝动作。
docker cp nginx:/etc/nginx/nginx.conf E:/nginx/nginx.conf
docker cp nginx:/etc/nginx/conf.d E:/nginx/conf.d
docker cp nginx:/usr/share/nginx/html E:/nginx/
注意:此时我们还是在nginx容器内部,可通过exit命令或者ctrl+z进行退出。
从上面的命令中我们可以看到,我们将配置文件拷贝到我们的E盘的nginx
文件夹下, 这个是自定义的,可以根据自己的需要来定义。同时上面的命令将nginx
定义的默认网页(/html
文件夹下是index.html
和50x.html
)也拷贝出来了,这个看个人需求,如果需要定制默认页面和错误页面的可以拷贝出来。(个人没有使用这个命令,这里放着供大家参考使用)
默认的nginx.conf
和default.conf
文件的内容如下
# 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;
include /etc/nginx/conf.d/*.conf;
}
# default.conf文件的内容
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
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;
#}
}
运行正式容器实例
命令如下
docker run -d --privileged=true --restart=always -p 8000:80 -v E:/nginx/nginx.conf:/etc/nginx/nginx.conf -v E:/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v E:/nginx/log:/var/log/nginx --name mynginx nginx:1.23
简单解释一下。
- 这里挂在了三个数据卷,将上面获取的配置挂在,同时将日志挂在出来,方便后期出现问题可查找原因
- 端口
8000
是自定义的,容器中对应的是80
端口 - 通过
--restart=always
设置了容器重启机制
配置说明
当容器正常运行来后,我们就要考虑添加自己需要的配置了。这里我们只需要修改E:/nginx/conf.d/default.conf
文件即可。
例如我们在win10
宿主机的IIS
中不是了一个网站(可以通VS
自动生成要给mvc
的项目就行测试)。那么我们可以在default.conf
中添加如内容。
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://192.168.2.15:7032;
}
#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;
}
#以下省略
此处重点是在location
节点下添加proxy_pass
属性。而配置的内容是IIS
中设置好的。
配置好需要重启以下容器,可以通过命令或者可视化界面操作,这里就不细说了。
最后让我们看看最终的配置效果。
发现的问题
在使用一段时间后,有一次重启容器后,容器总是重启失败。查看日志发现其提示没有发现default.conf
配置文件。这就很奇怪了,后来通过几次测试发现,是因为改动了此配置文件后保存导致的。后面通过多次测试和分析,发现是此配置文件保存的格式不对,如果保存的格式是UTF8
就是会出现这个问题。而通过记事本,选择ANSI
格式保存就可以正常运行容器了。
总结
通过上面的介绍,我们就可以通过容器来使用nginx
了。而如果要搭配其他软件来实现开发环境的搭建,还需要在创建其他相应的容器,或者通过脚本自动化生成,这个以后有时间再说。