最近好好的学习了docker
,想把个人网站的nginx
替换为docker
部署,在学习的过程中,摸爬打滚了一番,这里简单做一个记录。
docker run -p 80:80 -p 443:443 -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就自动重启。执行该命令后,通过
docker ps
docker logs nginx
会发现nginx没有正常启动,通过logs指令可以看出,是因为配置文件不全的缘故,默认是没有将配置文件打包的。
可以在配置的-v /Users/alistar/docker-data/nginx/conf/:/etc/nginx/
的第一个目录/Users/alistar/docker-data/nginx/conf
下添加配置文件,大概需要添加2类
核心的配置,这里我把练手的配置放在这里,仅供参考。
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;
}
}
}
这个不是关键,所以就不罗列出来了,可以参考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
查看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地址就可以访问了。
通过hosts
进行本地映射
hosts
的位置是:C:\Windows\System32\drivers\etc
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
。