学期末,学习了 docker 这个技术,发现很方便,通过一段时间的折腾,自己对于 linux 操作系统越发的“熟悉”起来了,打算重置自己的云服务器(因为之前太乱了),各种软件都往服务器里面塞,实际上服务器也没什么服务,仅仅有一个自己的博客网站,很多都是不必要的。所以计划进行一次“大扫除”。

准备工作

既然是真实部署上线的东西,就需要准备购买:域名ssl 证书云服务器。

这里我使用的是阿里云的 ecs,安装的操作系统是 ubuntu,因为博主对 ubuntu 比较熟悉。

域名备案、ssl 证书购买请自行查看阿里云官方文档。

docker 安装

1
2
# 下载并执行使用阿里云镜像源的安装脚本
curl -fsSL https://get.daocloud.io/docker | sh

安装完 docker 之后在终端输入 docker info看到如下信息,说明已经安装成功了。

nginx 镜像

通常来说,拉取镜像的速度大概率会很慢,除非你的服务器在国外。但也无妨,可以配置加速镜像。

先看看有没有 daemon.json 文件。

我这边已经有了,这个文件主要是 docker 的一些配置。更多的请查看 docker 的官网。

这个文件里面目前我只配置了镜像加速的地址,如下:

1
{"registry-mirrors": ["https://docker.1ms.run"]}

镜像拉取并启动容器

现在拉取一个 nginx 镜像就行了。在终端输入docker pull nginx:latest

然后启动一个 nginx 容器

1
2
3
docker run -d -p 80:80 --name nginx nginx:latest
# 输入命令之后查看一下容器有没有正常起来
docker ps -a

这里得确保容器的 STATUS 是 up 状态

这个时候如果不出意外的话,访问服务器 ip就能看到一个 nginx 的欢迎页面了。如果一直在转圈圈,去阿里云控制台的 ecs 的管理界面,把端口给打开。

btw,后续你要在服务器上面对外暴露服务也是要在这里打开的。

nginx 数据卷设置

数据当然需要备份,为了方便后续的日志监控、数据迁移。

先创建我们的 docker 容器数据卷

1
2
3
4
mkdir -p /root/data/nginx/conf # nginx配置文件
mkdir -p /root/data/nginx/html # 站点数据文件
mkdir -p /root/data/nginx/log # nginx日志文件
mkdir -p /root/ssl_license # ssl证书文件

为了方便后续数据卷的挂载,先从默认的 nginx 容器里面拷贝出一些东西。

1
2
3
4
docker cp nginx:/etc/nginx/nginx.conf /root/data/nginx/conf #nginx主配置文件
docker cp nginx:/var/log/nginx /root/data/nginx/log #nginx日志文件
docker cp nginx:/usr/share/nginx/html /root/data/nginx/html #数据文件
docker cp nginx:/etc/nginx/conf.d /root/data/nginx/conf #nginx配置文件

一些说明

  • **nginx.conf**** 文件**:是 Nginx 的主配置文件,它负责定义 Nginx 服务器的全局设置和核心配置。这些设置影响着整个 Nginx 服务的基本运行环境,包括用户、工作进程数、错误日志路径、事件处理模型等。它是 Nginx 启动时首先加载的配置文件,为整个服务器奠定了基础。
  • **conf.d**** 文件夹下的配置文件**:主要用于存放虚拟主机(Virtual Host)的配置或者特定功能模块的配置。这些配置文件可以根据不同的业务需求、域名或者功能进行拆分,使得配置更加模块化和易于管理。

**nginx.conf** 文件适合配置一些服务器通用的配置。

ssl 证书下载

购买证书之后,在阿里云控制台这个地方进行 ssl 证书公钥与私钥的下载,这里下载完了之后会得到一个压缩包。可以直接将压缩包扔到服务器上面的文件夹里面。这个文件夹前文是已经创建好了的。

博主这边使用 scp 进行上传。

1
scp 证书相关.zip user@host:/root/ssl_license #替换成自己的

上传之后使用 unzip进行解压就行了。

解压之后会得到类似这样的两个文件。

.pem 是公钥文件。.key 是私钥,注意私钥文件不要对外暴露。

nginx 配置文件编写

在启动容器之前,我们还需要配置我们的 nginx 配置文件。不编写我们的网站默认是没有装配有 ssl 证书的。

1
vim /roor/data/nginx/conf/conf.d/default.conf #编辑配置文件

博主的配置文件,仅供参考,具体配置还要按自己的来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
server_name clesbit.top www.clesbit.top;
return 301 https://$host$request_uri;
}
server {
charset utf-8;
listen 443 ssl;
server_name clesbit.top www.clesbit.top;
ssl_certificate "/etc/nginx/cert/www.clesbit.top.pem";
ssl_certificate_key "/etc/nginx/cert/www.clesbit.top.key";
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
}

docker-compose.yml 文件编写

因为涉及到很多数据卷,并且方便后期迁移与扩展维护,这里建议使用容器编排。这里最后配置是将容器的时间与宿主机同步,不然默认使用的是 0 时区的时间,否则后续查看、统计的时候日志记录出现时间错乱。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports: #端口映射
- "80:80"
- "443:443"
volumes:
- /root/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf #基础配置文件
- /root/data/nginx/conf/conf.d/:/etc/nginx/conf.d #用户配置文件
- /root/data/nginx/log/:/var/log/nginx #日志文件
- /root/data/nginx/html/:/usr/share/nginx/html #站点数据卷
- /root/ssl_license/:/etc/nginx/cert #证书映射
- /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro # 挂载时区文件

启动容器

相关工作都做完了,现在可以启动容器了。

1
2
3
4
5
6
# 切换到docker-compose.yml文件所在的目录
docker compose up -d
# 如果你的是旧版本的docker,使用下面这个指令
# docker-compose up -d
# 启动完毕之后别忘记查看一下容器有没有正常起来
# docker ps -a

验证

访问

现在网站就可以以 https 的方式进行访问了。

日志查看

总结

综合了 dockernginxlinux 的基础知识,很多流程都省略掉了,域名审核什么的。如果遇到什么问题,欢迎交流。