前言
最近好好的学习了 docker
,想把个人网站的 nginx
替换为 docker
部署,在学习的过程中,摸爬打滚了一番,这里简单做一个记录。
docker 安装 nginx
docker run -p 80:80 -m 200m --restart always --name nginx \
-v /Users/alistar/docker-data/nginx/www:/www \
-v /Users/alistar/docker-data/nginx/conf/:/etc/nginx/ \
-v /Users/alistar/docker-data/nginx/logs:/var/log/nginx/logs \
-v /Users/alistar/docker-data/nginx/run:/var/run \
-v /Users/alistar/docker-data/nginx/wwwlogs:/wwwlogs \
--add-host=dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge` \
nginx
- 我是
Mac
系统,在个人目录alistar
目录创建了一个目录docker-data
作为外部映射。所以-v
就是目录的映射。 --add-host=xxx
是为了放docker
容器能够访问宿主机
网络而设置的。默认情况下 docker 的是无法访问宿主机的-m 200m
是限制了 docker 中 nginx 最大能使用 200m 的内存。--restart always
表示每次 docker 启动后,nginx 就自动重启。
问题 1:缺少配置文件
执行该命令后,通过
docker ps
docker logs nginx
会发现 nginx 没有正常启动,通过 logs 指令可以看出,是因为配置文件不全的缘故,默认是没有将配置文件打包的。
可以在配置的 -v /Users/alistar/docker-data/nginx/conf/:/etc/nginx/
的第一个目录 /Users/alistar/docker-data/nginx/conf
下添加配置文件,大概需要添加 2 类
nginx.conf
核心的配置,这里我把练手的配置放在这里,仅供参考。
user nginx;
worker_processes 1;
error_log /var/log/nginx/logs/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
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/logs/access.log main;
sendfile on;
keepalive_timeout 65;
#51mybaby
server {
listen 80;
#此处一定要加www,否则会匹配到下面去
server_name www.51mybaby.com;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_set_header Host $host;
proxy_set_header X-http_x_forwarded_for $remote_addr;
location / {
root /www/51mybaby;
index index.html;
}
}
# uewell
server {
listen 80;
server_name www.uewell.com;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_set_header Host $host;
proxy_set_header X-http_x_forwarded_for $remote_addr;
location / {
root /www/uewell;
index index.html;
}
}
#www.aaa.com,动态负载均衡
upstream backend {
#此处必须是局域网ip
server 192.168.0.5:8899 weight=2;
server 192.168.0.5:8898 weight=1;
}
server {
listen 80;
server_name www.aaa.com;
location / {
proxy_pass http://backend;
}
}
}
mime.types
这个不是关键,所以就不罗列出来了,可以参考 Nginx 官方的文档:点我有惊喜噢
问题 2:如何执行 nginx 的指令
nginx
常用指令地址:言简意赅的链接
现在通过 docker
如何执行了?
关键就是通过 exec
命令进行执行。
docker exec nginx-container-name nginx -t
docker exec nginx-container-name nginx -s reload
docker exec nginx-container-name nginx -v
问题 3:nginx 报错 502
查看 error.log
日志可以发现更为详细的错误
2019/04/15 09:18:38 [error] 7#7: *1 no live upstreams while connecting to upstream, client: 172.17.0.1, server: www.aaa.com, request: "GET / HTTP/1.1", upstream: "http://backend/", host: "www.aaa.com"
就是说配置的主机都 ping
不通,在我电脑上的原因是,我的 nginx
在 docker
中,应用在宿主机直接部署,所以保此错误。
经过百度,可以通过如下方式进行处理,在 run
的时候添加 hosts
,代码如下所示:
--add-host=dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge`
这样可以多加一个 hosts
,此时通过宿主机的 ip 地址就可以访问了。
问题 4:如何本地模拟
通过 hosts
进行本地映射
- Windows 系统中
hosts
的位置是:C:\Windows\System32\drivers\etc
- Linux 系统中
hosts
的位置是:/etc/hosts
不管是哪个系统,修改都需要管理员权限,此处请注意了,我这里为了结合这次的测试,是这样配置的
...省略...
# 主要看这里
127.0.0.1 www.uewell.com
127.0.0.1 www.51mybaby.com
127.0.0.1 www.aaa.com
为什么修改 hosts
就能通过域名来访问了,这是一道很经典的面试...
6 点,收拾东西,准备下班, 回去继续好好学习 docker
。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于