Docker运行Nginx,挂载配置文件和网页
前言
用Docker跑Nginx,想改网站文件、改配置,每次进容器里改太麻烦。挂载出来就方便多了。本文讲怎么挂载网页和配置文件。
一、基本运行
最简单的跑法
docker run -d --name nginx -p 80:80 nginx
问题: 网站文件和配置都在容器里,改起来不方便。
二、挂载网页目录
完整命令
docker run -d \
--name nginx \
-p 80:80 \
-v /data/www:/usr/share/nginx/html \
nginx
解释
- 宿主机
/data/www目录 - 容器里
/usr/share/nginx/html目录
这样直接在宿主机改网页文件,刷新浏览器就生效了。
测试
在宿主机创建index.html:
echo "<h1>Hello Docker Nginx</h1>" > /data/www/index.html
浏览器访问:
http://服务器IP
就能看到了。
三、挂载配置文件
1. 先从容器里拷出默认配置
docker run -d --name nginx nginx
docker cp nginx:/etc/nginx/nginx.conf /data/nginx/nginx.conf
docker cp nginx:/etc/nginx/conf.d /data/nginx/conf.d
docker rm -f nginx
2. 挂载配置文件
docker run -d \
--name nginx \
-p 80:80 \
-v /data/www:/usr/share/nginx/html \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf.d:/etc/nginx/conf.d \
nginx
3. 改配置
直接在宿主机改 /data/nginx/conf.d/default.conf,改完重载:
docker exec nginx nginx -s reload
四、挂载日志
docker run -d \
--name nginx \
-p 80:80 \
-v /data/www:/usr/share/nginx/html \
-v /data/nginx/logs:/var/log/nginx \
nginx
日志直接在宿主机看:
tail -f /data/nginx/logs/access.log
五、Docker Compose完整配置
version: '3'
services:
nginx:
image: nginx:alpine
container_name: nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /data/www:/usr/share/nginx/html
- /data/nginx/nginx.conf:/etc/nginx/nginx.conf
- /data/nginx/conf.d:/etc/nginx/conf.d
- /data/nginx/logs:/var/log/nginx
启动:
docker-compose up -d
六、常用操作
重载配置
改了配置文件后:
docker exec nginx nginx -s reload
查看日志
docker logs nginx
# 实时看
docker logs -f nginx
进容器
docker exec -it nginx sh
七、常见坑
坑1:挂载后网站403
原因: 宿主机目录权限不对。
解决:
chmod -R 755 /data/www
chown -R nginx:nginx /data/www
坑2:改了配置不生效
原因: 没重载配置。
解决:
docker exec nginx nginx -s reload
坑3:挂载文件不存在,变成目录
-v /data/nginx.conf:/etc/nginx/nginx.conf
如果 /data/nginx.conf 不存在,Docker会自动建一个叫nginx.conf的目录。
解决: 先创建文件:
touch /data/nginx.conf
坑4:端口被占用
80端口被宿主机的Nginx占了。
解决: 停掉宿主机的Nginx,或者换端口。
坑5:改了代码不生效
如果用了CDN或者浏览器缓存,强刷一下(Ctrl+F5)。
八、多站点配置
在 /data/nginx/conf.d/ 下建多个配置文件:
/data/nginx/conf.d/
├── site1.conf
├── site2.conf
└── default.conf
site1.conf:
server {
listen 80;
server_name site1.com;
root /data/www/site1;
index index.html;
}
改完重载:
docker exec nginx nginx -s reload
九、HTTPS配置
挂载证书:
docker run -d \
--name nginx \
-p 80:80 \
-p 443:443 \
-v /data/www:/usr/share/nginx/html \
-v /data/nginx/conf.d:/etc/nginx/conf.d \
-v /data/ssl:/etc/nginx/ssl \
nginx
配置文件里引用证书:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
root /data/www;
}
总结
记住:
- 挂载网页目录:
-v /data/www:/usr/share/nginx/html - 挂载配置文件:
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf - 挂载日志:
-v /data/nginx/logs:/var/log/nginx - 改完配置重载:
docker exec nginx nginx -s reload
最常用:
docker run -d --name nginx -p 80:80 \
-v /data/www:/usr/share/nginx/html \
-v /data/nginx/conf.d:/etc/nginx/conf.d \
nginx
遇到问题加QQ23979811 协助处理