使用 Docker-nginx 管理本地多个站点

为了方便测试,本地维护了多个 web 站点,这些站点不会同时使用,所以都使用了默认 80 端口,每次直接 localhost 访问。
每次为了切换网站目录,修改 nginx 配置,切换次数多了逐渐感觉不太方便。
最近接触到 Docker,可以通过镜像创建多个相互隔离的容器。
于是考虑:是不是可以使用多个 nginx 的容器,分配加载不同站点,每次只需要运行相应容器就可以了

主要步骤

  1. 创建一个 default 站点,用做模板
  2. 增加新站点时,本地复制 default 目录并修改名称
  3. 创建新的 nginx 容器,并指向新站点相关目录

创建站点模板

docker 下载 nginx 镜像

1
$ docker pull nginx

下载完成后,可以通过 docker images 查看本地已下载的全部镜像

1
2
3
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 8f05d7383593 3 weeks ago 134MB

创建 nginx 模板容器

1
2
# 使用 nginx 镜像创建 nginx-default 容器
$ docker run --name nginx-default -p 80:80 -d nginx:latest

创建站点所需目录

1
2
3
4
5
6
7
8
9
10
11
# 主目录
$ mkdir ~/Sites/default && cd ~/Sites/default

# html 目录,存放页面
$ mkdir html/

# log 目录
$ mkdir log/

# nginx 目录,存放配置文件
$ mkdir nginx

拷贝模板容器中 nginx 配置文件

1
2
3
4
# 拷贝 nginx.conf
$ docker cp nginx-default:/etc/nginx/nginx.conf nginx/
# 拷贝 conf.d 目录
$ docker cp nginx-default:/etc/nginx/conf.d nginx/conf.d

删除 nginx 模板容器

模板容器的目的是为了导出 nginx 配置文件,完成上述导出操作后,可以删除 nginx-default 容器

1
2
$ docker stop nginx-default
$ docker rm nginx-default

创建新站点目录

1
2
3
# 创建新的站点目录 nav
$ cd ~/Sites/
$ cp -r default ./nav

将网站文件复制到 ~/Sites/nav/html/ 目录

为新站点建立容器

停止其他 nginx 容器

因为所有的站点都映射到本地 80 端口,所以新建 nginx 容器前,需要先停止其他运行中的 nginx 容器,要不然创建新容器时会报错。

1
$ docker stop $(docker ps -f ancestor=nginx | awk '{ print $1}' | tail -n +2)

新建 nginx 容器并映射到新站点

1
2
3
4
5
6
7
$ docker run --name nginx-nav -p 80:80  \
-v ~/Sites/nav/html:/usr/share/nginx/html \
-v ~/Sites/nav/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v ~/Sites/nav/nginx/conf.d:/etc/nginx/conf.d \
-v ~/Sites/nav/log:/var/log/nginx \
-e TZ=Asia/Shanghai \
-d nginx:latest

docker 中切换站点

所有站点配置完毕后,每次切换站点时,需要注意先停止其他 nginx 容器,再启动新的容器。

1
2
$ docker stop $(docker ps -f ancestor=nginx | awk '{ print $1}' | tail -n +2)
$ docker start nginx-blog

可以通过 alias 的方式,将上述命令做成快捷方式

1
alias nginx-start="alive=$(docker ps -f ancestor=nginx | awk '{ print $1}' | tail -n +2) ; [ -n "$alive" ] && docker stop $alive ; docker start "

每次通过 nginx-start [站点容器名] 即可启动站点

附注

nginx 相关目录定位

上述操作中,我们直接创建了 html、log、nginx 配置目录,这些目录信息,我们都可以在默认的 nginx.conf 文件中查阅到相关配置。

1
2
$ docker exec -it nginx-default /bin/bash
$ cat /etc/nginx/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
# /etc/nginx/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;
}

nginx.conf 中又加载了 /etc/nginx/conf.d/*.conf, 通过 nginx.conf 和 default.conf ,我们了解到以下信息:

  1. 网站 error.log 和 access.log 存放在 /var/log/nginx 目录
  2. 网站根目录为 /usr/share/nginx/html
  3. 修改 /etc/nginx/conf.d/*.conf 文件,即可起到配置 nginx 的目的
Author: HenryMe
Link: https://henryme.com/2022/06/manage-multiple-sites-with-docker-nginx-0ed61bf3100f.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.