Docker配置nginx
本文详细介绍了如何在Docker中安装和配置Nginx,包括安装命令、查看容器、运行测试、文件映射以及Nginx服务的配置和部署。重点讨论了文件映射的重要性,以便于在主机上直接编辑Nginx配置和管理文件。此外,还讲解了正向代理和反向代理的概念,并给出了反向代理的配置示例,展示了如何通过Nginx代理访问不同域名的服务。
Docker安装nginx
docker search nginx docker pull nginx
查看是否安装
docker images
root@debian:~# docker pull nginx Using default tag: latest latest: Pulling from library/nginx a480a496ba95: Pull complete f3ace1b8ce45: Pull complete 11d6fdd0e8a7: Pull complete f1091da6fd5c: Pull complete 40eea07b53d8: Pull complete 6476794e50f4: Pull complete 70850b3ec6b2: Pull complete Digest: sha256:28402db69fec7c17e179ea87882667f1e054391138f77ffaf0c3eb388efc3ffb Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest root@debian:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 3b25b682ea82 3 weeks ago 192MB
运行测试nginx
docker run --name nginx-test -p 9091:80 -d nginx
--name #给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器
-p #映射端口,将docker宿主机的9091端口和容器的80端口进行绑定
-v #挂载文件用的
-d #表示启动的是哪个镜像。
测试是否启动成功
root@debian:~# wget <a href="http://localhost:9091">http://localhost:9091</a> --2024-10-29 20:43:28-- <a href="http://localhost:9091/">http://localhost:9091/</a> Resolving localhost (localhost)... ::1, 127.0.0.1 Connecting to localhost (localhost)|::1|:9091... connected. HTTP request sent, awaiting response... 200 OK Length: 615 [text language="/html"][/text] Saving to: ‘index.html’ index.html 100%[======================================================================================>] 615 --.-KB/s in 0s 2024-10-29 20:43:28 (135 MB/s) - ‘index.html’ saved [615/615]
Nginx服务的配置和部署
为什么需要做文件的映射?
我们在使用容器的过程中需,有时候需要对容器中的文件进行修改管理,如果不做文件映射的化,我们使用docker exec -it 容器ID/容器名 /bin/bash 才能进入nginx中的文件里面。
docker exec -it nginx-test /bin/bash
root@debian:~# docker exec -it nginxtest /bin/bash Error: No such container: nginxtest root@debian:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee033e7b4b95 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:9091->80/tcp, :::9091->80/tcp nginx-test root@debian:~# docker exec -it nginx-test /bin/bash root@ee033e7b4b95:/# ls bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@ee033e7b4b95:/# cd /etc/nginx root@ee033e7b4b95:/etc/nginx# ls conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params root@ee033e7b4b95:/etc/nginx# cd conf.d root@ee033e7b4b95:/etc/nginx/conf.d# ls default.conf
如果把关键文件映射到主机上,那么就可以在主机中进行修改而不必进入文件当中才进行修改了。
需要在主机上建立相应的关键文件目录
- 在home下创建一个docker文件夹,用来专门存docker容器的映射文件。
- 在docker下创建一个nginx的文件夹,用于存nginx的映射文件。
- 在nginx下创建三个关键的映射文件。
- www文件映射www目录,也就是网页目录。
- logs文件映射日志目录。
- conf文件映射配置目录
root@debian:~# mkdir docker && cd docker && mkdir nginx && cd nginx root@debian:~/docker/nginx# mkdir www logs conf root@debian:~/docker/nginx# ls conf logs www root@debian:~/docker/nginx#
先在容器中拷贝配置文件
docker cp 容器ID:/etc/nginx/nginx.conf /home/docker/nginx/conf
注意此时的容器必须是运行的
root@debian:~/docker/nginx# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee033e7b4b95 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:9091->80/tcp, :::9091->80/tcp nginx-test root@debian:~/docker/nginx# docker cp ee033e7b4b95:/etc/nginx/nginx.conf /root/docker/nginx/conf
docker中nginx与主机文件映射规则如下
主机
docker
/root/docker/nginx/www
/usr/share/nginx/html #网页文件
/root/docker/nginx/conf/nginx.conf
/etc/nginx/nginx.conf#配置文件
/root/docker/nginx/logs
/var/log/nginx#日志文件
root@debian:~/docker/nginx# docker cp ee033e7b4b95:/usr/share/nginx/html /root/docker/nginx/www root@debian:~/docker/nginx# docker cp ee033e7b4b95:/var/log/nginx /root/docker/nginx/logs
关闭之前运行的容器并删除容器
docker stop 容器ID
docker rm 容器ID
root@debian:~/docker/nginx# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee033e7b4b95 nginx "/docker-entrypoint.…" 16 minutes ago Up 16 minutes 0.0.0.0:9091->80/tcp, :::9091->80/tcp nginx-test root@debian:~/docker/nginx# docker stop ee033e7b4b95 && docker rm ee033e7b4b95 ee033e7b4b95 ee033e7b4b95
运行nginx,同时进行文件挂载
docker run -d -p 9091:80 --name nginx-test -v /root/docker/nginx/www:/usr/share/nginx/html -v /root/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/docker/nginx/logs:/var/log/nginx nginx
root@debian:~/docker/nginx# docker run -d -p 9091:80 --name nginx-test -v /root/docker/nginx/www:/usr/share/nginx/html -v /root/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/docker/nginx/logs:/var/log/nginx nginx 6d381d523815ff37c4a59fed1696fbc74af35cdf767ba532f3c3d42881403188
测试以下
root@debian:~/docker/nginx# wget <a href="http://localhost:9091">http://localhost:9091</a> --2024-10-29 21:00:15-- <a href="http://localhost:9091/">http://localhost:9091/</a> Resolving localhost (localhost)... ::1, 127.0.0.1 Connecting to localhost (localhost)|::1|:9091... connected. HTTP request sent, awaiting response... 403 Forbidden 2024-10-29 21:00:15 ERROR 403: Forbidden.
返回403错误,nginx的http服务已开通,但是服务器上没有开目录浏览或者没有index.html文件。
在www目录下建立一个html文件
echo "it works,nginx is runing" > /root/docker/nginx/www/index.html
测试一下
root@debian:~# wget <a href="http://localhost:9091">http://localhost:9091</a> --2024-10-29 21:09:48-- <a href="http://localhost:9091/">http://localhost:9091/</a> Resolving localhost (localhost)... ::1, 127.0.0.1 Connecting to localhost (localhost)|::1|:9091... connected. HTTP request sent, awaiting response... 200 OK Length: 25 [text language="/html"][/text] Saving to: ‘index.html’ index.html 100%[======================================================================================>] 25 --.-KB/s in 0s 2024-10-29 21:09:48 (6.35 MB/s) - ‘index.html’ saved [25/25] root@debian:~# cat index.html it works,nginx is runing
nginx返回了一个index.html文件保存在当前文件夹,使用cat查看文件内容,即显示it works,nginx is runing
可以在浏览器中输入网址http://ip:9091, ip换成DOCKER主机的IP地址, 显示一样的内容。
Nginx的普通配置
通过nginx为多为个域名配置服务,使得通过浏览器可以访问到相应的域名。
创建html文件
在映射到主机下的/root/docker/nginx/www下创建html文件或者域名的文件夹
root@debian:~/docker/nginx/www# mkdir www.abc.com www.dba.com root@debian:~/docker/nginx/www# ls www.abc.com root@debian:~/docker/nginx/www#
其中www.abc.com和www.dba.com是存放不同域名访问的文件路径。里面都有对应的index.html
修改host文件
在DNS中做了域名解析的话不需要修改host文件,这里纯粹是测试。
127.0.0.1 localhost 127.0.1.1 debian 127.0.0.1 www.abc.com 127.0.0.1 www.dba.com
NANO可以使用键盘的删除、退格、下一行等功能键。修改完按CTRL_O再按回车键保存,按CTRL+X推出NANO。
测试一下
root@debian:~/docker/nginx/www# ping www.abc.com PING www.abc.com (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.042 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.039 ms ...
修改nginx.conf文件
提醒「路径问题」
这里需要提醒一下,在前面我们已经把nginx中的配置文件映射到主机目录下,我们在主机目录下修改了/root/docker/nginx/www的文件,同时nginx容器中的/usr/share/nginx/html下的文件有会有相同的变化。但是在配置文件中使用的路径得是nginx的,而不应该是主机的路径。
打开主机映射的nginx配置文件
root@debian:~# nano /root/docker/nginx/conf/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
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;
# 配置服务www.abc.com
server{
#监听端口
listen 80;
#配置域名
server_name www.abc.com;
#配置网站跟目录
root /usr/share/nginx/html/www.abc.com;
location / {
#跟目录
root /usr/share/nginx/html/www.abc.com;
#默认首页
index index.html index.htm;
}
}
}
重启docker容器
docker ps#获取容器的ID
docker restart 容器ID
root@debian:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
201da9573fce nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:9091->80/tcp, :::9091->80/tcp nginx-test
root@debian:~# docker restart 201da9573fce
201da9573fce
测试一下
root@debian:~# wget http://www.abc.com:9091
--2024-10-29 22:23:44-- http://www.abc.com:9091/
Resolving www.abc.com (www.abc.com)... 127.0.0.1
Connecting to www.abc.com (www.abc.com)|127.0.0.1|:9091... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12
Saving to: ‘index.html’
index.html 100%[======================================================================================>] 12 --.-KB/s in 0s
2024-10-29 22:23:44 (3.05 MB/s) - ‘index.html’ saved [12/12]
注意:
我们启动nginx容器时,用的一直是把容器的80端口映射到主机的9091端口,在配置WWW.ABC.COM时用的80端口,在docker宿主机上访问时也要加上9091端口。
以同样的方式配置其他域名
「修改nginx.conf」–「添加一个server」–「重启docker」–「浏览器域名访问测试」
错误心得
当有时启动容器,通过docker ps 发现容器并没有启动,那么通过docker ps -a可查看容器的状态:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
然后通过查看日志:docker logs 容器ID
可以从中发现未能启动的原因。
代理模式
正向代理
客户端<---->代理服务器<---->服务器
架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将原本要直接发送到web服务器上的http请求发送到代理服务器中。
反向代理
客户端—>代理服务器<—>服务器
反向代理服务器架设在服务端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。正式反向代理对真正的服务器起到了保护作用,所以反向代理比较流行。
配置反向代理
通过访问www.dba.com,来访问www.yini.org
在nginx的配置当中,新增一段server,
在location中添加proxy_pass http://www.yini.org/
server{
#监听端口
listen 80;
#配置域名
server_name www.abc.com;
#配置网站跟目录
root /usr/share/nginx/html/www.abc.com;
location / {
#跟目录
root /usr/share/nginx/html/www.abc.com;
#默认首页
index index.html index.htm;
}
}
server {
listen 80;
server_name www.dba.com;
location / {
proxy_pass http://www.yini.org;
#proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto $scheme;
}
}