一、拉取Nginx镜像
如果对nginx镜像版本有要求,可以先搜索Docker Hub 中的镜像列表
docker search nginx
复制代码
可以看到列表里面的nginx镜像有很多,这里可以自定义选择拉取的镜像。
这里我直接拉取nginx官方的镜像了。使用命令
docker pull nginx
复制代码
拉取速度跟网速有关,稍等片刻,不报错即可,正常也不会报错。
1、列出已下载的镜像
拉取之后,查看当前机器上镜像文件:
docker images
复制代码
2、列出运行中的容器
使用 docker ps 命令即可列出运行中的容器
docker ps
复制代码
使用 docker ps -a 命令即可列出所有(包括已停止的)的容器
docker ps -a
复制代码
如果在我们启动容器时提示端口占用了或者启动的历史记录占用了我们的端口,运行镜像都是会报错的,这时,可以使用
docker stop CONTAINER ID
复制代码
停止运行,然后使用删除命令,删除启动痕迹,再次运行就好了。
docker rm CONTAINER ID
复制代码
重启该容器:
docker restart CONTAINER ID
复制代码
二、启动容器,部署nginx并修改配置文件
因为这里我想要自定义nginx的配置文件,所以就先提前手动新建了后面启动映射的文件夹/usr/soft/nginx, /usr/soft/nginx/conf.d和文件/usr/soft/nginx/nginx.conf,
- /usr/soft/nginx nginx镜像的总的文件夹
- /usr/soft/nginx/conf.d nginx的子配置文件
- /usr/soft/nginx/nginx.conf 该文件是nginx的总的配置文件,下面启动中指定该文件为只读。
nginx.conf 文件内容:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
复制代码
default.conf 文件内容:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api{
proxy_pass http://192.168.1.1:9999/api;
# access_log "logs/test.log";
}
}
复制代码
这里简单说明下default.conf 文件,这里监听的是80端口,包含了两个转发规则,一个是根路径”/”,一个是”/api”,也就是说,当访问服务器的80端口时,走的是这个路由配置,如果前缀是”/api”是走的是下面的代理 proxy_pass
由于上面我们映射了容器的目录到本地,所以我们还需要新建一个欢迎页,因为nginx默认的欢迎页,没有自动映射出来,就很郁闷。
在nginx的文件夹下,新建index.html,一个最简单的html文件,内容如下:
<!DOCTYPE html>
<html>
<head>
<title>网页标题</title>
</head>
<body>
<h1>Hello Nginx.......</h1>
</body>
</html>
复制代码
准备完成,下面就可以启动nginx了。
启动nginx镜像的命令:
docker run --privileged=true \
--restart=always \
--name nginx \
-d -p 80:80 \
-v /usr/soft/nginx/html:/usr/share/nginx/html \
-v /usr/soft/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /usr/soft/nginx/conf.d:/etc/nginx/conf.d \
nginx
复制代码
- 第一个“-v”,是项目位置,把项目放到挂载到的目录下即可
- 第二个“-v”,是挂载的主配置文件”nginx.conf”,注意”nginx.conf”文件内有一行 “include /etc/nginx/conf.d/*.conf;” ,这个include指向了子配置文件的路径,此处注意include后所跟的路径一定不能出错
- 第三个“-v”,把docker内子配置文件的路径也挂载了出来,注意要与 “2.” 中include指向路径一致
- nginx.conf是挂载了一个文件(docker是不推荐这样用的),conf.d挂载的是一个目录
这里映射目录之后,我们直接操作宿主机上的文件夹,即是修改了docker容器内的文件,如果修改之后未生效,我们可以重新启动容器就好了,这点还是很方便的。
启动成功,如果不报错,那么访问本机的80端口,应该可以看到我们自定义的欢迎页了。
三、异常问题
1. 启动nginx报错:Error response from daemon: driver failed programming external connectivity on endpoint nginx
重启docker
2. 容器名称被占用:Error response from daemon: Conflict. The container name “/nginx” is already in use by container
由于之前启动失败了一次,这个名字被上一个失败的容器给占用了,解决方法有两种:
一种是修改启动命令里面–name 后面的值,定义新的名字。
二、删除之前启动失败的镜像容器
查看之前容器ID,并删除:
docker ps -a
复制代码
删除之后,再次启动:
返回一个ID串,说明启动成功了,否则会有异常信息提示。
3. 启动nginx成功后,访问欢迎页,提示403 Forbidden
这个问题就很诡异了,搜了一下发现网上有人说是启动容器挂载的目录没有权限,可是启动命令里面命名添加了”–privileged=true”的。
最后查到是需要添加selinux规则,将要挂载的目录添加到白名单:
chcon -Rt svirt_sandbox_file_t + 挂载的目录
复制代码
这里我直接将整个宿主机上的nginx文件夹添加到白名单了:
这时重启容器,仍然是403的问题,需要我们将这次启动的容器给删掉,然后重新运行启动容器命令。
还有一种原因就是当前文件的权限问题,如果文件夹的权限有问题,nginx也是会出现403的问题的。
正常文件夹权限应该是”drwxr-xr-x. 6″
4.如何自定义修改根目录映射的欢迎页位置?
上面我们直接在nginx文件夹下新建了index.html文件,但是实际项目我们打包之后,可能上层还有一个项目的名称作为文件夹呢,或者vue项目,打包之后是dist文件下面才是index.html文件。
修改default.conf 文件中,根目录index映射的规则。
这里”safety-project”即为我这里的项目名,项目名下面的index为项目的首页。