前言

距离上一篇文章已经很长时间,近期实在事情太多了,也没来得及继续更新一些新的内容。现在开发使用的工作实在太多了,小编实在忍受不了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 如果出现下面结果及说明安装成功

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的镜像吧,这里我采用网易云的镜像,官方的镜像国内打开是在太慢了

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

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

docker images

  

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

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

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

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

让我们来检查下nginx进程

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的端口上

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的访问,当然我们也可以通过随机端口的映射方式

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. 第一个“-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挂载的是一个目录

  

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启动情况和挂载情况

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端口已经映射成功了,继续执行命令查看挂载情况

docker inspect myNginx | grep Mounts -A 200

  

        "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 # 进入容器的命令行
进入容器内部

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

which nginx

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

nginx -s reload

就可以重启成功了

查看容器日志

docker logs -f 容器名称

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

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

  

采坑实例

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

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

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

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

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

#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配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

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

例子,有如下匹配规则:

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

  

mac环境下使用docker安装nginx的更多相关文章

  1. mac环境下mongodb的安装和使用

    mac环境下mongodb的安装和使用 简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据 ...

  2. Docker02 基本命令、开发环境搭建、docker安装nginx、Dockerfile、路径挂载

    1 基本命令 1.1 docker相关 centos6.5 安装docker环境 >sudo yum install -y http://mirrors.yun-idc.com/epel/6/i ...

  3. centos7下使用docker安装nginx

    需要环境docker,此处不做介绍. 1. docker拉取官方nginx镜像 docker pull nginx 2. 等待下载完成后,我们就可以在本地镜像列表里查到 REPOSITORY 为 ng ...

  4. 2018.10.30 mac环境下卸载和安装mysql及安装过程遇到的一些问题解决方案

    Mac下mysql的安装与卸载 配置初始化密码修改 第一:首先去官网网站下载Mysql软件 https://downloads.mysql.com/archives/community/ 记住选择对应 ...

  5. Mac环境下pyCharm的安装,激活及使用

    1.pyCharm的安装 安装地址: https://www.jetbrains.com/pycharm/download/#section=mac 2.激活 获取注册码地址: http://idea ...

  6. Mac环境下Redis的安装

    1.下载 官网下载地址:https://redis.io/download,选择对应的下载版本,我下载的是4.0.12 2.安装 1)下载文件解压后复制到/usr/local/目录下(快速找到路径小技 ...

  7. Mac系统下,docker安装nextcloud,打造个人本地网盘

    1.安装docker 推荐下载地址:http://get.daocloud.io/#install-docker-for-mac-windows   2.拉取镜像 $ docker pull next ...

  8. Mac环境下Vagrant的安装

    1.安装Vagrant 下载地址:https://www.vagrantup.com/downloads.html 下载好pkg包后,点击安装即可. 2.安装 VirtualBox 下载地址:http ...

  9. Mac环境下Scrapy的安装

    直接命令安装: $ easy_install scrapy 从 GitHub 安装: $ git clonehttps://github.com/scrapy/scrapy.git $ cd scra ...

随机推荐

  1. 查看OpenGL版本信息

    查看OpenGL版本信息 执行如下代码 #include "stdafx.h" #include <iostream> #include <gl/glut.h&g ...

  2. 数据恢复软Extundelete

    1>概述  作为一名运维人员,保证数据的安全是根本职责,所以在维护系统的时候,要慎重和细心,但是有时也难免发生出现数据被误删除的情况,这个时候该如何              快速.有效地恢复数 ...

  3. VUE 学习笔记 二 生命周期

    1.除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来 var data = { a: 1 } var vm = new Vue({ el: ' ...

  4. Asp.NetCore安全验证之JWT

    本文只是介绍了下基于AspNetCore自带的System.IdentityModel.Tokens.Jwt.dll工具在项目中Token的应用. 我这里谈到的很浅显就两点: 一,超时时间 二,数据的 ...

  5. Javascript中的名词

    BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". DOM (Document Object Model ...

  6. 关于Mybatis 反向生成后 查询结果全部为null 解决办法

    今天遇到了一个问题,就是mybatis通过反向生成工具 生成的pojo类(实体类) xml文件 以及Mapper之后查询时结果为null 我写的代码怎么看都没有错 就是没有结果 后来在排除错误的时候发 ...

  7. 关于Collections的操作方法

    Collections是一个包装类,其中包含有各种有关集合操作的静态多态方,比如可以作用在List和Set上,此类不能实例化. 排序 Integer[] array = new Integer[]{3 ...

  8. CASE语句用法学习

    A. 使用带有 CASE 简单表达式的 SELECT 语句 SELECT ProductNumber, Category = CASE ProductLine WHEN 'R' THEN 'Road' ...

  9. Django-DRF-视图的演变

    版本一(基于类视图APIView类) views.py: APIView是继承的Django View视图的. from .serializers import UserSerializers #导入 ...

  10. [转] 打开 CMD 时自动执行命令

    [转] 打开 CMD 时自动执行命令 问题描述 在Windows中打开一个command-prompt时,我正在寻找一种方法来执行一些控制台命令,特别是设置一些命令别名. 例如,当打开command- ...