比尔云BierYun--阿里云最新优惠活动
阿里云优惠码丨阿里云代金券

mac环境下使用docker安装nginx

mac环境下使用docker安装nginx

前言

距离上一篇文章已经很长时间,近期实在事情太多了,也没来得及继续更新一些新的内容。现在开发使用的工作实在太多了,小编实在忍受不了windows那样卡机的状态,于是最近换了一个mac电脑,虽然做开发已经很长时间了,之前一直没有用过mac,不过使用过后才发现mac实在是windows无法媲美的,当然了mac的价格也是相当的昂贵啊….

好了废话不多说了,现在让我们开始正题,首先让我们现在mac下如何安装docker

docker安装

Docker 官网:http://www.docker.com

Github Docker 源码:https://github.com/docker/docker

docker相关介绍,这里就不多说了啊,没学习过的同学可以看下上面的2个网址学习下。

安装命令

brew cask install docker

怎么样是不是很方便,在mac环境下只需要执行上面一句话就可以搞定docker的安装了,当然了这里的前提是你已经安装了Homebrew(macOS 缺失的软件包的管理器),不要问我Homebrew 是什么了,这里我把教程附上,有兴趣的同学自己看下把,mac下使用brew命令还是相当的方便的

https://brew.sh/index_zh-cn   中文官方网站

按上述步骤安装完成后,执行biew -v 如果出现下面结果及说明安装成功

1
2
3
Homebrew 1.8.6
Homebrew/homebrew-core (git revision b22b69a; last commit 2019-01-05)
Homebrew/homebrew-cask (git revision 382e0; last commit 2019-04-03)

这里顺便附下菜鸟教程里面的其他系统的docker安装把

Ubuntu Docker 安装
CentOS Docker 安装
Windows Docker 安装  (个人建议进来不要使用windows,装个虚拟机都可以)
MacOS Docker 安装

nginx安装

让我们先来拉取下nginx的镜像吧,这里我采用网易云的镜像,官方的镜像国内打开是在太慢了

1
docker pull hub.c.163.com/library/nginx:latest

拉取成功后让我们先看下本地的镜像

1
docker images

通过上门的命令就可以看到nginx的镜像已经被我们拉取过来了

然后我们就可以先启动一下这个nginx了,在这里我们使用docker run命令来运行,不熟悉的同学可以通过docker run –help 来查看帮助文档

-d :分离模式: 在后台运行

1
docker run -d hub.c.163.com/library/nginx

让我们来检查下nginx进程

1
2
3
4
5
6
jack-4:~ jack$ docker run -d hub.c.163.com/library/nginx
2d839f976fa88513854f4540d9c8f49ff1110640570bd2bd8c51471491f8a85d
jack-4:~ jack$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS               NAMES
2d839f976fa8        hub.c.163.com/library/nginx   "nginx -g 'daemon of…"   3 seconds ago       Up 2 seconds        80/tcp              affectionate_elion
jack-4:~ jack$

这里我们就能看到我们的nginx已经起来了,但是由于docker是虚拟了一个容器出来,所以我们现在还不能访问nginx,接下来我们通过把本地端口映射到虚拟容器的nginx端口上就可以访问nginx了

映射本地端口8080到容器的80的端口上
1
docker run -d -p 8080:80 hub.c.163.com/library/nginx

运行改命令后,命令行会输出当前容器的id

34453d528a8c9adbb4d67959053d5fb2ae38221b81c7519744f184f7fd0d5330

下面我们会用到他,这里稍微标记下

接下来我们通过访问:http://127.0.0.1:8080/   就可以看到我们熟悉的nginx欢迎界面了。

好了到此为止,一个nginx就通过docker的方式在我们本机器启动起来了,而且也可以正常访问了,使用过nginx的同学都知道这肯定不满足我们的要求啊,我还要修改nginx.conf呢,怎么办呢, 怎么进入docker容器重启nginx呢… 等等一系列的问题还没解决呢,下面让我们继续来好好地搞一搞吧。

Nginx实战

上面我们通过将本地8080端口映射到docker容器的80端口上实现了nginx的访问,当然我们也可以通过随机端口的映射方式

1
docker run -d -P hub.c.163.com/library/nginx
-P 方式会在容器内开放所有端口映射到随机端口上

此时注意下返回值:

.0.0.0:32768->80/tcp     32768就是随机分配的端口了,访问http://127.0.0.1:32768/就可以了

部署nginx 项目并修改配置文件

 一般情况下docker启动时进行配置,只要把配置文件的目录挂载出来就可以,但是nginx却是先加载一个主配置文件nginx.conf,在nginx.conf里再加载conf.d目录下的子配置文件(一般最少一个default.conf文件)。

docker拉取下来的nginx配置文件路径

日志文件位置:/var/log/nginx
配置文件位置: /etc/nginx
资源存放的位置: /usr/share/nginx/html

接下来我们现在本地创建对应的目录,并将目录挂在到docker容器的nginx上(可以看后面的采坑实力如何拷贝nginx.conf和conf.d中的文件)

 

  /Users/jack/Documents/docker/nginx/log

  /Users/jack/Documents/docker/nginx/html

  /Users/jack/Documents/docker/nginx/conf/nginx.conf  注意:这是文件

  /Users/jack/Documents/docker/nginx/conf/conf.d      注意:这是文件夹

本地挂载目录创建完毕后让我们来重新看下我们的nginx启动命令,这次增加了很多东西

1
2
3
4
5
6
7
# 1. 第一个“-v”,是nginx日志位置,把ngixn日志放到挂载到的目录下
# 2. 第二个“-v”,是项目位置,把项目放到挂载到的目录下即可
# 3. 第三个“-v”,是挂载的主配置文件"nginx.conf",注意"nginx.conf"文件内有一行
#    "include /etc/nginx/conf.d/*.conf;" ,
#    这个include指向了子配置文件的路径,此处注意include后所跟的路径一定不能出错
# 4. 第四个“-v”,把docker内子配置文件的路径也挂载了出来,注意要与 “2.” 中include指向路径一致
# 5. nginx.conf是挂载了一个文件(docker是不推荐这样用的),conf.d挂载的是一个目录

 

1
2
3
4
5
6
7
8
docker run \
  --name myNginx \
  -d -p 8080:80 \
  -v /Users/jack/Documents/docker/nginx/log/:/var/log/nginx \
  -v /Users/jack/Documents/docker/nginx/html:/usr/share/nginx/html \
  -v /Users/jack/Documents/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /Users/jack/Documents/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
  hub.c.163.com/library/nginx

这次命令我增加了一个–name属性,给我们的docker容器新增加了一个名字,后面可以通过myNginx来重启或者关闭容器

启动成功后我们再通过命令来看下docker启动情况和挂载情况

1
2
3
jack-4:~ jack$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS              PORTS                  NAMES
48b10d0f0fdb        hub.c.163.com/library/nginx   "nginx -g 'daemon of…"   30 seconds ago      Up 29 seconds       0.0.0.0:8080->80/tcp   myNginx

这里可以看到8080端口已经映射成功了,继续执行命令查看挂载情况

1
docker inspect myNginx | grep Mounts -A 200

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
        "Mounts": [
            {
                "Type""bind",
                "Source""/Users/jack/Documents/docker/nginx/conf/conf.d",
                "Destination""/etc/nginx/conf.d",
                "Mode""",
                "RW"true,
                "Propagation""rprivate"
            },
            {
                "Type""bind",
                "Source""/Users/jack/Documents/docker/nginx/log",
                "Destination""/var/log/nginx",
                "Mode""",
                "RW"true,
                "Propagation""rprivate"
            },
            {
                "Type""bind",
                "Source""/Users/jack/Documents/docker/nginx/html",
                "Destination""/usr/share/nginx/html",
                "Mode""",
                "RW"true,
                "Propagation""rprivate"
            },
            {
                "Type""bind",
                "Source""/Users/jack/Documents/docker/nginx/conf/nginx.conf",
                "Destination""/etc/nginx/nginx.conf",
                "Mode""ro",
                "RW"false,
                "Propagation""rprivate"
            }
        ],
        "Config": {
            "Hostname""48b10d0f0fdb",
            "Domainname""",
            "User""",
            "AttachStdin"false,
            "AttachStdout"false,
            "AttachStderr"false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty"false,
            "OpenStdin"false,
            "StdinOnce"false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.13.0-1~stretch",
                "NJS_VERSION=1.13.0.0.1.10-1~stretch"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "ArgsEscaped"true,
            "Image""hub.c.163.com/library/nginx",
            "Volumes"null,
            "WorkingDir""",
            "Entrypoint"null,
            "OnBuild"null,
            "Labels": {},
            "StopSignal""SIGQUIT"
        },
        "NetworkSettings": {
            "Bridge""",
            "SandboxID""d0f15aa6836d41199d6c6ab2a13a77df69c9fe336e7721127b24ea626edc2ea5",
            "HairpinMode"false,
            "LinkLocalIPv6Address""",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": [
                    {
                        "HostIp""0.0.0.0",
                        "HostPort""8080"
                    }
                ]
            },
            "SandboxKey""/var/run/docker/netns/d0f15aa6836d",
            "SecondaryIPAddresses"null,
            "SecondaryIPv6Addresses"null,
            "EndpointID""6d937b1e1b72da739281adf9c6727ee618beb203660e168fbffd0fc6e1b6b8f6",
            "Gateway""172.17.0.1",
            "GlobalIPv6Address""",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress""172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway""",
            "MacAddress""02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig"null,
                    "Links"null,
                    "Aliases"null,
                    "NetworkID""b9eff4ad3b8cdd9dc1e6d16eaecedabfbeb4ae9f89be23c79a23569089e5a99b",
                    "EndpointID""6d937b1e1b72da739281adf9c6727ee618beb203660e168fbffd0fc6e1b6b8f6",
                    "Gateway""172.17.0.1",
                    "IPAddress""172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway""",
                    "GlobalIPv6Address""",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress""02:42:ac:11:00:02",
                    "DriverOpts"null
                }
            }
        }
    }
]

这里可以看到nginx的挂载情况和端口映射情况,到这里为止我们就可以随意的修改我们的nginx了,在本地的html文件夹和conf.d中任意增加代码和配置,在docker容器中重新启动nginx就可以了,好了,下面让我们继续docker的一下常用操作:

docker attach 容器名或者容器ID bash     # 进入容器的命令行(退出容器后容器会停止)
docker exec -it 容器名或者容器ID bash   # 进入容器的命令行
进入容器内部
1
docker exec -it 34453 bash
1
docker exec -it myNginx bash
-i 保证我们的输入命令有效
-t 分配一个伪终端
34453指的是运行nginx镜像后的pid 前几位(34453d528a8c9adbb4d67959053d5fb2ae38221b81c7519744f184f7fd0d5330)或者容器名称 myNginx
执行完毕后发现我们直接进入了容器内部,后面就可以直接使用linux的命令了,让我们执行下
1
which nginx

直接返回了nginx在容器中的路径,那我们修改完配置后如何重启nginx呢,其实命令还是一样的,直接执行

1
nginx -s reload

就可以重启成功了

到现在为止,nginx的安装,启动,进入容器内部重启就都说完了,接下来我们进入最后的一部分,如何退出、重启docker容器呢

1
2
3
docker stop    容器id/名称   # 停止容器
docker rm       容器id/名称  # 删除容器
docker restart 容器id/名称   #重启容器<br>exit                       #退出docker容器
netstat -na|grep 8080      # 本地查看8080端口映射情况

 

采坑实例

博主在一开始配置nginx的时候,并没有拷贝nginx.conf和conf.d里面的default.conf文件到本地的挂载目录,而是新创建了二个文件,直接拷贝nginx文件里面的代码过来的,结果每次重启nginx后总会包一个错误

1
. unexpected "{" in /etc/nginx/nginx.conf:1

经过反复查看核验文件内容均没有发现有什么异常,这个问题困扰了1天的时间,突然想到会不会是文件编码的问题,于是通过拷贝的方式拷贝这两个文件到本地目录,重启Nginx后解决,下面附上拷贝的代码

1
2
docker cp myNginx:/etc/nginx/nginx.conf /Users/jack/Documents/docker/nginx/conf/nginx.conf
docker cp myNginx:/etc/nginx/conf.d/default.conf /Users/jack/Documents/docker/nginx/conf/conf.d/default.conf

好了,到这里本片文章就彻底结束了,有问题的小伙伴可以给我留言评论。下面我附上我本地的两个文件代码

nginx.conf和default.conf

nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
user  nginx;
worker_processes  1;
worker_rlimit_nofile  65535;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    use epoll;
    worker_connections  65535;
}
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;
    charset UTF-8;
    client_max_body_size 300m;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  60;
    gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#upstream sisafezuul {
#        server 192.168.11.4:8080 max_fails=2 fail_timeout=30s;
#}
#server {
#        listen 80;
#        server_name sietsafe.ecej.com;
#        client_max_body_size 10M;
#        rewrite ^(.*)$  https://$host$1 permanent;
#}
 #server {
 #       listen       443 ssl;
 #       server_name etsafeadm.guizhou001.cn;
 #
 #       ssl_certificate cert/etsafeadm.guizhou001.cn.pem;
 #       ssl_certificate_key cert/etsafeadm.guizhou001.cn.key;
 #       ssl_session_cache    shared:SSL:1m;
 #       ssl_session_timeout  5m;
 #
 #       ssl_ciphers  HIGH:!aNULL:!MD5;
 #       ssl_prefer_server_ciphers  on;
 #       location ~* /openapi {
 #            proxy_pass   http://127.0.0.1:9999;
 #       }
 #       location ~* /safety {
 #            proxy_pass   http://127.0.0.1:9999;
 #       }
 #       location / {
 #           root  website/console;
 #           index index.html;
 #       }
 #   }
server {
    listen       80;
    server_name  localhost;
    location /rewrite {
       rewrite "/" http://127.0.0.1:8888/ break;
    }
    location /mickey.html {
       root   /usr/share/nginx/html/mickey;
    }
    #location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css|eot|svg|ttf|woff)$ {
    #   index index.htm index.html;
    #   root /data/nfsdata/website/official;
    #}
    #location / {
    #    index index.htm index.html index.jsp;
    #    proxy_pass http://sisafezuul;
    #}
    location / {
       root   /usr/share/nginx/html;
       index  index.html index.htm;
    }
}

(附加)nginx location配置详细

 

语法规则: location [=|~|~*|^~] /uri/ { … }

 

  • = 开头表示精确匹配
  • ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
  • ~ 开头表示区分大小写的正则匹配
  • ~* 开头表示不区分大小写的正则匹配
  • !~!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
  • / 通用匹配,任何请求都会匹配到。

 

多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

 

首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

 

例子,有如下匹配规则:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
location = / {
   #规则A
}
location = /login {
   #规则B
}
location ^~ /static/ {
   #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D
}
location ~* \.png$ {
   #规则E
}
location !~ \.xhtml$ {
   #规则F
}
location !~* \.xhtml$ {
   #规则G
}
location / {
   #规则H
}

 

 

那么产生的效果如下:

 

访问根目录/, 比如http://localhost/ 将匹配规则A

 

访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H

 

访问 http://localhost/static/a.html 将匹配规则C

 

访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C

 

访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。

 

访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。

 

访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

 

所以实际使用中,个人觉得至少有三个匹配规则定义,如下:

 


 

nginx的其他配置信息介绍

 

三、ReWrite语法

 

last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

 

1、下面是可以用来判断的表达式:

 

-f!-f用来判断是否存在文件
-d!-d用来判断是否存在目录
-e!-e用来判断是否存在文件或目录
-x!-x用来判断文件是否可执行

 

2、下面是可以用作判断的全局变量

 

例:http://localhost:88/test1/test2/test.php

 

$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php

 

四、Redirect语法

 

server {
    listen 80;
    server_name start.igrow.cn;
    index index.html index.php;
    root html;
    if ($http_host !~ "^star\.igrow\.cn$" {
        rewrite ^(.*) http://star.igrow.cn$1 redirect;
    }
}

 

五、防盗链

 

location ~* \.(gif|jpg|swf)$ {
    valid_referers none blocked start.igrow.cn sta.igrow.cn;
    if ($invalid_referer) {
        rewrite ^/ http://$host/logo.png;
    }
}

 

六、根据文件类型设置过期时间

 

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
        expires 1h;
        break;
    }
}

 

七、禁止访问某个目录

 

location ~* \.(txt|doc)${
root /data/www/wwwroot/linuxtone/test;
deny all;
}

 

附:一些可用的全局变量

 

$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query

原文地址https://www.cnblogs.com/blueskyli/p/10700501.html

未经允许不得转载:阿里云代理商 » mac环境下使用docker安装nginx
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

强烈推荐

高性能SSD云服务器ECS抗攻击,高可用云数据库RDS