侧边栏壁纸
博主头像
babajaja博主等级

种一棵树最好的时机是十年前,其次是现在。

  • 累计撰写 6 篇文章
  • 累计创建 7 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

[TOC]【Docker】docker-compose安装nginx

babajaja
2024-07-03 / 1 评论 / 0 点赞 / 178 阅读 / 9454 字

背景

1、Halo搭建网站后,访问需要url+port,比较麻烦

2、网站连接不安全

所以用nginx进行端口转发,配置SSL证书,提升网站安全性

不喜欢折腾的可以安装Nginx Proxy Manager 可以进行nginx便捷管理和SSL快速申请配置,参考文档为 与 Nginx Proxy Manager 配合使用:https://docs.halo.run/getting-started/install/other/nginxproxymanager

安装nginx

启动一个test_nginx容器

这一步主要为了查看下nginx容器的目录

docker run -p 7000:80 --name test_nginx -d nginx  # 7000端口是可以任意没有被占用的端口,80是nginx容器内部端口

查看test_nginx容器目录

docker ps |grep test_nginx	#查看容器进程是否存在
docker exec test_nginx ls -l /etc/nginx /etc/nginx/conf.d /var/log/nginx /usr/share/nginx/html	#查看nginx容器的目录

创建nginx目录

mkdir -p /usr/local/software/nginx
cd /usr/local/software/nginx
mkdir -p conf/conf.d html logs     # 创建本地nginx的文件,用于挂载

拷贝test_nginx容器内nginx.conf配置文件,不用自己额外编写

docker cp test_nginx:/etc/nginx/nginx.conf /usr/local/software/nginx/conf/

停止并删除test_nginx容器目录

 docker stop 183d40db113d && docker rm 183d40db113d    #可以通过容器id或容器名删除

编写docker-compose.yml文件

在nginx目录新建docker-compose.yml文件,并添加内容

cd /usr/local/software/nginx
vim docker-compose.yml
version: '3.9'	#指定compose引擎版本

services:					#服务根节点
  web:						#jenkins服务/其他服务(web服务/nginx服务等)
    image: nginx		#nginx镜像,如果镜像容器没有会去自动拉取,没写版本默认拉latest
    container_name: babajaja-nginx		#容器的名称
    restart: always						#跟随docker的启动而启动
    volumes:							#挂载卷命令
      - /usr/local/software/nginx/conf/nginx.conf:/etc/nginx/nginx.conf		#映射配置文件入口文件
      - /usr/local/software/nginx/conf/conf.d/:/etc/nginx/conf.d		#映射配置文件  
      - /usr/local/software/nginx/logs:/var/log/nginx					#日志文件挂载
      - /usr/local/software/nginx/html:/usr/share/nginx/html		#静态资源根目录挂载
    ports:
      - "80:80"			#端口映射
      - "443:443"

运行nginx容器

docker-compose up -d

可以通过docker psdocker logs查看容器进程和日志

docker ps
docker logs

配置端口转发

添加配置

到nginx配置文件目录下,创建配置文件halo.conf

cd /usr/local/software/nginx/conf/conf.d
vim halo.conf

添加内容

#80端口转发8090
server {
    listen       80;
    server_name  babajaja.cn;

    location / {
        proxy_pass http://babajaja.cn:8090;
    }
}

nginx重新加载配置

docker exec babajaja-nginx nginx -t
docker exec babajaja-nginx nginx -s reload

这样端口转发就配好了

配置SSL

SSL证书申请

我的域名是腾讯云上管理的,所以在腾讯云的SSL 证书控制台进行免费证书申请

下载SSL证书

正式申请成功后,就可以进行下载了,我们选择nginx类型进行下载

下载解压后你就会获得四个文件

上传SSl证书到nginx上

在下载的四个文件中,需要将*.crt证书文件和*.key私钥文件上传到nginx所在机器上

我这边放在/usr/local/software/nginx/conf/conf.d目录下,目录的要求是需要有挂载到nginx容器上,上传的证书文件才会同步到容器里

添加SSL配置

修改halo.conf 文件,添加SSL配置内容

cd /usr/local/software/nginx/conf/conf.d
vim halo.conf

添加内容:

#443端口转发7018
server {
    #listen       80;
    listen 443 ssl;
    #请填写绑定证书的域名
    server_name babajaja.cn;
    #请填写证书文件的相对路径或绝对路径
    ssl_certificate /etc/nginx/conf.d/babajaja.cn_bundle.crt;
    #请填写私钥文件的相对路径或绝对路径
    ssl_certificate_key /etc/nginx/conf.d/babajaja.cn.key;
    ssl_session_timeout 5m;
    #请按照以下协议配置
    ssl_protocols TLSv1.2 TLSv1.3;
    #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://babajaja.cn:8090;
    }
}

因为HTTPS 默认端口443所以需要将端口80监听改为端口443端口监听。需保证Nginx 服务器上开启443端口。

*.crt和*.key文件的路径是容器里的路径

nginx重新加载配置

docker exec babajaja-nginx nginx -t
docker exec babajaja-nginx nginx -s reload

到浏览器查看结果,连接已经是安全的了

问题记录

1、启动nginx容器并挂载容器中的nginx.conf文件报错

docker run -p 7000:80 --name test_nginx -v /tmp/test_nginx/nginx.conf:/etc/nginx/nginx.conf  -d nginx

报错信息:

# docker run -p 7000:80 --name test_nginx -v /tmp/test_nginx/nginx.conf:/etc/nginx/nginx.conf  -d nginx
9897d528bc6ce7e33b8aebaa15e023bbf1b3886bf62ef9ab9765401cc8a8580e
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/tmp/test_nginx/nginx.conf" to rootfs at "/etc/nginx/nginx.conf": mount /tmp/test_nginx/nginx.conf:/etc/nginx/nginx.conf (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

 原因

  • 不支持直接挂载文件,只能挂载文件夹

  • 想要挂载文件,必须宿主机也要有对应的同名文件

解决方法

  • 可以先不挂载 nginx.conf

  • 先从容器中复制 nginx.conf 出来

  • 然后可以自行修改 nginx.conf,自定义配置项

  • 创建正式使用的 nginx 容器

参考文档

docker-compose安装nginx:https://juejin.cn/post/7312035956189364233

Docker - 解决创建 nginx 容器尝试挂载 nginx.conf 文件时报错:https://www.cnblogs.com/poloyy/p/15488899.html

Nginx 服务器 SSL 证书安装部署(Linux):https://cloud.tencent.com/document/product/400/35244

0

评论区