Docker配置nginx

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=&quot;/html&quot;][/text]
Saving to: ‘index.html’
index.html                                 100%[======================================================================================&gt;]     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=&quot;/html&quot;][/text]
Saving to: ‘index.html’
index.html                                 100%[======================================================================================&gt;]      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;
             }
        }

Leave a Reply

Your email address will not be published. Required fields are marked *