从零开始用Docker搭建Halo个人博客

文章目录

  • 从零开始用Docker搭建Halo个人博客
    • 食用指南
    • 一、准备工作:需要云主机 入门级[1核2G+40G云盘]、公网IP 带宽[1MB] 、域名(需备案)
    • 二、使用SSH工具连接远程主机
    • 三、添加普通用户并授权【可选】
    • 四、安装docker
    • 五、安装MySQL 5.7+
    • 六、安装Halo
    • 七、开放云服务器安全组端口
    • 八、登录博客初始化配置
    • 九、安装Nginx并配置SSL证书
    • 十、个性化博客设置

从零开始用Docker搭建Halo个人博客

本文会逐步详细介绍使用docker搭建MySQL+Halo+Nginx的流程。

食用指南

1、对于有基础的小伙伴文中还会附带一些技术要点解析方便您知其所以然,另外对于文中【可选】您可以根据个人喜好酌情参考。

2、对于零基础的小伙伴或者是单纯为了快速安装建议跳过技术要点解析和【可选】直接操作对应命令即可

如果您已有云服务器并能连接至远程服务器,则可以跳过准备工作和远程连接主机工作直接从第三步开始

一、准备工作:需要云主机 入门级[1核2G+40G云盘]、公网IP 带宽[1MB] 、域名(需备案)

详细准备工作流程见:用Halo搭建个人博客-Step1:准备工作

二、使用SSH工具连接远程主机

详细连接流程见:用Halo搭建个人博客-Step2:连接远程服务器

三、添加普通用户并授权【可选】

如果想快速搭建可直接使用root权限,跳过第三步直接从第四步的root命令部分直接开始操作

PS:(如果直接使用root账号,请注意操作规范,避免使用 rm -rf 等删库跑路命令)。

首次登录使用root用户,但是在实际开发或运维操作中通常不会直接使用root账号进行操作,所以创建普通用户账号,然后赋予root权限进行操作【推荐】

  • 创建个人账号 [下文中所有普通用户均以zhangsan用户名代替]

    useradd 用户名   #创建一个名称为[用户名]的账号 默认生成/home/[用户名]目录 并默认创建[用户名]组
    例如: useradd zhangsan
    
  • 设置账号密码

    passwd 用户名   
    (回车后输入密码,然后回车后再确认密码)
    
    例如: passwd zhangsan 
    Changing password for user zhangsan.
    New UNIX password: //在这里输入新密码
    Retype new UNIX password: //再次输入新密码
    passwd: all authentication tokens updated successfully
    
  • 修改用户sudo权限

    介绍如下两种方法,每种方法中都包含 sudo 命令后 需要输入密码 或 不需要输入密码两种操作。

    visudo [-f] /etc/sudoers  #root账号下使用visudo命令修改sudoers文件 (可能会提示需要加-f参数)
    
    【方法一】:
    找到以下内容
    ## Allow root to run any commands anywhere
    root    ALL=(ALL)     ALL
    
    #追加以下内容直接赋予用户zhangsan使用sudo后root所有授权 [需要]sudo执行命令时输入密码
    zhangsan   ALL=(ALL)     ALL    
    [或者]
    #追加以下内容直接赋予用户zhangsan使用sudo后root所有授权 [不需要]sudo执行命令时输入密码
    zhangsan   ALL=(ALL)     NOPASSWD: ALL
    
    【方法二】:
    找到以下内容   ([需要]sudo执行命令时输入密码)
    ## Allows people in group wheel to run all commands 
    %wheel  ALL=(ALL)       ALL          (默认应该就是开启的状态 建议与下面的保持互斥)  
    查看%wheel 前面是否有# 如果有需要去掉#后保存退出 如默认没有# 则直接退出
    [或者]
    找到以下内容   ([不需要]sudo执行命令时输入密码)
    ## Same thing without a password
    # %wheel        ALL=(ALL)       NOPASSWD: ALL    (默认是注释的状态 建议与上面的保持互斥)
    查看%wheel 前面是否有# 如果有需要去掉#后保存退出 如默认没有# 则直接退出
    
    # 执行如下命令将用户zhangsan加入wheel用户组中 (不管用上面哪种都需要执行下面加入wheel用户组的操作)
    usermod -aG wheel zhangsan 
    

四、安装docker

PS: 如使用普通用户例如:zhangsan权限,需要加sudo命令提升权限(需要上面第三步添加普通用户并授权)

如使用root账号权限则下述命令前加不加sudo命令前缀都可以(一般不用加直接执行对应命令即可)

具体操作区别在下面第1小步中给出示例,根据您选择的用户权限自行区分,后续不再赘述。

  1. 安装Docker的依赖库。

    # 普通用户zhangsan权限执行如下命令
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # 超级管理员root权限执行如下命令(去掉sudo即可,下面执行操作类似)
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
  2. 添加Docker CE的软件源信息。

    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  3. 安装Docker CE。

    sudo yum makecache [fast]        #Centos8/aliyunLinuxOS需要去掉fast  Centos7需要加fast
    
    sudo yum -y install docker-ce
    
  4. 配置Docker的阿里云镜像仓库地址

    登录阿里云平台 找到容器镜像服务控制台

    输入以下命令 其中xxxx具体地址替换成个人阿里云镜像专属地址

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
    }
    EOF
    # 启动docker服务
    sudo systemctl start docker
    
  5. 修改默认docker镜像存储地址【可选

    默认docker pull后镜像存储地址为 /var/lib/docker 目录下,如果不需要更改则跳过该步骤

    如需要自定义镜像存储位置按照下面方法操作即可

    # 修改第4步创建好的daemon.json文件 
    sudo vim /etc/docker/daemon.json
    {
      "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
    }
    
    # 在"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]后面加入(英文逗号) ,   
    # 换行加入"data-root": "指定目录"  例如:"data-root": "/home/zhangsan/docker"
    {
      "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"],
      "data-root": "/home/zhangsan/docker"
    }
    #保存后退出
    
    #重启docker服务
    sudo systemctl restart docker
    
  6. 检查docker版本和镜像是否配置成功

    查看版本

    sudo docker -v  (回车)
    Docker version 20.10.17, build 100c701
    

    查看docker信息

    找到 Registry Mirrors 配置信息确认是第4步配置的个人镜像加速地址 【1】

    找到 Docker Root Dir 配置信息确认是第8步配置的个人docker镜像存储目录【可选】【2】

    sudo docker info  (回车)
     ....
     Docker Root Dir: /home/zhangsan/docker       <-- 这里已经设置成个人docker镜像存储目录 【2】
     Debug Mode: false
     Registry: https://index.docker.io/v1/
     Labels:
     Experimental: false
     Insecure Registries:
      127.0.0.0/8
     Registry Mirrors:
      https://xxxx.mirror.aliyuncs.com/            <-- 这里已经设置个人镜像加速地址 【1】
     Live Restore Enabled: false
    
    
  7. 普通用户如何直接使用docker命令【可选】 (root用户权限跳过该步骤,普通用户权限不建议跳过)

    使用普通用户执行docker命令前必须加sudo,长时间操作很麻烦,使用如下方法可以不用每次都输入sudo

    所以对于普通用户权限来说这是个[必选项]

    #首先查看是否存在docker用户组  一般安装完docker后会有
    sudo cat /etc/group |grep docker      
    docker:x:991:
    
    #如果没有就创建一个docker用户组
    sudo groupadd docker
    
    #将普通用户追加入docker用户组   -aG 表示以追加的形式附加组信息  -G 表示直接覆盖附加组信息
    sudo usermod -aG docker zhangsan
    
    #重启docker服务
    sudo systemctl restart docker
    

    此时重新登录普通账号之后就可以直接使用docker命令了,是不是方便了许多。

    (别问我有这种好东西为啥放到最后讲,毕竟体验过痛苦才知道真香啊!)

五、安装MySQL 5.7+

  1. 创建 Docker 自定义桥接网络

    # 由于普通用户设置了免sudo运行docker命令所以下文中涉及docker相关的命令可以不带sudo了
    docker network create halo-net
    
  2. 拉取 MySQL 镜像使用版本5.7.38 halo官方文档使用8.0+,基本操作都差不多。

    docker pull mysql:5.7.38
    
  3. 创建挂载目录文件夹添加自定义配置文件并开放目录权限

    # 如果使用普通用户zhangsan 在/home/zhangsan/mysql 目录下分别创建 logs data conf 三个目录
    # 因为在/home/zhangsan目录下zhangsan用户有创建目录的权限所以此处不需要加sudo
    [zhangsan@localhost /]$  mkdir -p /home/zhangsan/mysql/{logs,data,conf}
    
    # 如果是root账号则随便放,只要记住你设置的目录就行(官大任性啊~) 
    [root@localhost /]#  mkdir -p /home/mysql/{logs,data,conf}
    
    # 下述操作对root用户一样只需要替换成root用户上面对应创建好的目录即可
    # 在/home/zhangsan/mysql/conf 目录创建并编辑 my.cnf 文件名字随便起只要是以 .cnf结尾即可
    [zhangsan@localhost /]$ vim /home/zhangsan/mysql/conf/my.cnf
    
    # 因为docker容器中默认加载顺序是先加载/etc/my.cnf 该文件中会引入!includedir /etc/mysql/conf.d/  # 下的 *.cnf 并进行覆盖替换 后加载的会覆盖先加载的同样内容部分。
    
    # 加入以下基础配置内容,其中慢查询相关部分【可选填】 ,如需增加额外配置参数可查找官方配置文件
    [mysqld]
     # 指定数据目录
     datadir=/var/lib/mysql
     # 服务端字符集
     character-set-server=utf8mb4
     # 字符集排序规则
     collation-server=utf8mb4_unicode_ci
     # error日志路径
     log-error=/var/log/mysql/error.log
     # 开启慢查询 1:开启	  【可选】
     slow_query_log=1
     # 定义3秒以上为慢查询	【可选】 
     long_query_time=3
     # 慢查询日志路径		  【可选】	
     slow-query-log-file=/var/log/mysql/slow.log	
    [client]
     default-character-set=utf8mb4
    [mysql]
     default-character-set=utf8mb4
    # 保存后退出
    
    # 【关键步骤】开放home/zhangsan/mysql 目录权限  (防止docker启动映射挂载目录提示权限不足)
    sudo chmod -R 777 home/zhangsan/mysql
    

    PS : 其实也不用全开放,反复测试 最小要求只需要开放挂载出来的日志目录权限即可
    sudo chmod -R 777 home/zhangsan/mysql/logs

    当然如果不想挂载日志出来那甚至可以不用开放权限,但本文中是将日志从容器目录挂载出来的。
    如果好(无)学(聊)想继续了解为什么只开放这个目录的小伙伴,我会专门写一篇放在下面

    docker启动Mysql映射挂载目录提示权限不足原因见分析docker启动MySQL挂载目录提示权限不足Permission denied原因

  4. 用docker命令启动 MySQL

    # 使用普通用户zhagnsan执行如下命令   如使用root账户则挂载目录对应改成root创建好的目录地址
    docker run --name mysql \
    -v /home/zhangsan/mysql/data:/var/lib/mysql \
    -v /home/zhangsan/mysql/conf:/etc/mysql/conf.d \
    -v /home/zhangsan/mysql/logs:/var/log/mysql \
    -p 3306:3306 \
    -e TZ=Asia/Shanghai \
    -e MYSQL_ROOT_PASSWORD=[密码] \
    --net halo-net \
    --restart=unless-stopped \
    -d mysql:5.7.38
    
    # 返回CONTAINER ID (容器id)
    fa9b014901db
    

    命令详解:

    - -name mysql 指定docker容器启动后的NAMES 为mysql

    (-v 目录1:目录2 ) (表示将容器里的目录2 挂载 至宿主机目录1中)

    -v /home/zhangsan/mysql/data:/var/lib/mysql 将容器内mysql数据目录/var/lib/mysql 挂载到宿主机/home/zhangsan/mysql/data目录下

    -v /home/zhangsan/mysql/conf:/etc/mysql/conf.d 指定容器内mysql配置文件目录/etc/mysql/conf.d 映射到宿主机/home/zhangsan/mysql/conf 目录下, 会默认加载该目录下的以 .cnf为后缀的文件并追加覆盖/etc/my.cnf 文件中相同的内容

    -v /home/zhangsan/mysql/logs:/var/log/mysql 将容器容器内日志目录/var/log/mysql挂载到宿主机/home/zhangsan/mysql/logs目录下

    -p 3306:3306 将容器内mysql 3306端口映射至宿主机3306端口

    -e TZ=Asia/Shanghai 设置容器内时区,默认是utc +0时区 设置成国内+8区

    -e MYSQL_ROOT_PASSWORD=[密码] 设置root账号密码

    –net halo-net 将当前容器加入到 halo-net 的docker桥接网络

    –restart=unless-stopped 设置容器随docker服务自动重启 但手动stop后不重启

    -d 在后台运行该容器

  5. 查看 MySQL 启动是否成功

    docker ps 
    # 查看 STATUS 字段信息是否为  UP + [已启动时间] 
    例如: 
    Up 3 minutes
    #如果不是 Up 状态则需要使用docker logs + 当前启动容器ID 查看错误日志
    docker logs [Containers ID] 
    例如:
    docker logs fa9b014901db
    
    # 查看日志目录是否挂载  
    ls -la /home/zhangsan/mysql/logs    (回车)
    # 出现这两个日志文件则日志挂载成功
    -rw-r-----. 1 polkitd input 14795 Jul 25 04:06 error.log
    -rw-r-----. 1 polkitd input   516 Jul 25 04:02 slow.log
    
    # 查看数据目录是否挂载
    ls -la /home/zhangsan/mysql/data    (回车)
    # 有文件说明数据目录挂载成功
    
  6. 进入 MySQL 容器中登录 MySQL 并创建 Halo 需要的数据库

    # docker进入容器内执行命令 可选容器CONTAINER ID  或 容器NAMES
    docker exec -it mysql(或容器id fa9b014901db) /bin/bash
    # 进入容器内部 mysql登录输入设置好的root密码
    mysql -u root -p (回车输入密码)
    # 执行创建库操作
    create database halodb character set utf8mb4 collate utf8mb4_bin;
    # 执行exit退出mysql
    exit
    # 再执行一次exit退出容器
    exit
    

六、安装Halo

  1. 创建 Halo 工作目录

    # 如果是普通用户zhangsan 创建并切换至 /home/zhangsan/halo 目录
    mkdir /home/zhangsan/halo && cd /home/zhangsan/halo
    # 如果是root用户还是随便创建记住位置即可,后续使用docker启动halo指定挂载路径时替换一下
    
  2. 下载示例配置文件到工作目录

    wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
    
  3. 编辑配置文件,配置数据库,其他配置请参考参考配置

    #修改application.yaml文件
    vim application.yaml
    
    # 贴一份完整yaml配置  需要修改mysql对应的root账号密码   
    server:
      port: 8090    
      # Response data gzip.
      compression:
        enabled: true
    spring:
      datasource:
    
        # H2 database configuration.
        #driver-class-name: org.h2.Driver
        #url: jdbc:h2:file:~/.halo/db/halo
        #username: admin
        #password: 123456
    
        # MySQL database configuration.
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://mysql:3306/halodb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
        username: root
        password: xxxx
    
      # H2 database console configuration.
      #h2:
        #console:
          #settings:
            #web-allow-others: false
          #path: /h2-console
          #enabled: false
    
    halo:
    
      # Your admin client path is https://your-domain/{admin-path}
      admin-path: admin
    
      # memory or level
      cache: memory
    
    
  4. 使用docker创建Halo容器实例

    docker run -it -d --name halo -p 8090:8090 -v /home/zhangsan/halo:/root/.halo --net halo-net --restart=unless-stopped halohub/halo:1.5.4
    
    # 查看halo是否正常启动 找到STATUS 字段查看信息是否为  UP + [已启动时间] 
    docker ps 
    

    至此halo初步搭建已经算完成了。

    PS:解释下为什么配置文件中mysql的url连接jdbc后面配置文件上写的是mysql:3306而不是 127.0.0.1:3306

    # 查看当前docker网络列表  发现有第五步中的第1小步创建的 halo-net 的自定义桥接网络
    docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    83861d45eda1        bridge              bridge              local
    d8d0195a94f5        halo-net            bridge              local
    b11f3231e85d        host                host                local
    be93d6251c32        none                null                local
    
    # 进入查看当前halo-net网络配置
    docker inspect halo-net
    # 找到下述内容
    "Containers": {
                "d66200198e7ab704d947048a761fc475abc07c6e82dd26a36aad41956eb3be8d": {
                    "Name": "halo",
                    "EndpointID": "af3d47b5b6ac41e74b423xxxx",
                    "MacAddress": "02:42:ac:12:00:02",
                    "IPv4Address": "172.18.0.2/16",          <-- 这里【1】
                    "IPv6Address": ""
                },
                "fa9b014901db4a44344505e21622ec0168be766d1a8fe461b561839d6aa85dc2": {
                    "Name": "mysql",                         <-- 可以通过容器名直接访问【2】
                    "EndpointID": "6c5fe3488e77bdac2105xxxx",
                    "MacAddress": "02:42:ac:12:00:03",
                    "IPv4Address": "172.18.0.3/16",          <-- 这里【1】
                    "IPv6Address": ""
                }
            }
    
    # 可以看到halo 和 mysql两个容器ip地址现在属于同一网段中可以互相访问 【1】
    # docker官网给出说明 默认网络bridge不会进行dns解析,网络内部的容器之间只能通过ip进行访问
      除非使用--link参数进行指定 但官网已不再推荐这样使用。
    # 自定义桥接网络可以进行自动dns解析,也就是说在同一网络内部的容器可以通过容器名称进行互相访问。【2】
    

七、开放云服务器安全组端口

  1. 登录阿里云平台–> 云服务器 ECS --> **实例 ** --> 找到当前实例点击右侧管理–> 安全组 --> 配置规则

  2. 配置halo 8090端口对全网开放 (docker启动时映射出来的是8090端口 -p 8090:8090 前面的这个端口号)

    从零开始用Docker搭建Halo个人博客_第1张图片

    配置完成此时你已经可以通过公网IP加端口号访问你的个人博客了

  3. 配置mysql 3306端口对你当前ip开放 【可选

如果想远程连接你的mysql可以单独加一个你当前IP的安全组,这样你就能通过数据库图形化工具例如:Navicat,Mysql Workbench等通过公网IP+[端口] 直接访问你的数据库了。

操作方法与上面第2步类似,只是在第5步的时候填写 3306/3306 具体看你docker启动mysql的时候前面映射出来的端口是多少。第6步设置成你当前的机器IP 第7步描述改成mysql 然后保存即可

PS: 其实设置成全网开放也可以毕竟还是要密码才能连接,但是现在网络安全也很重要,所以建议就在你需要的时候上去临时改一下mysql配置规则中的授权对象 改成你当前IP就可以了。

放一张使用navicat连接远程mysql的截图,方便小伙伴们直接看表数据。

从零开始用Docker搭建Halo个人博客_第2张图片

八、登录博客初始化配置

通过公网IP+端口号可以访问你的个人博客了,在下图中进行初始化设置之后跳转到后台登录页面

从零开始用Docker搭建Halo个人博客_第3张图片

登录后台页面可以进行一些基础配置等操作具体大家就自行摸索了。

从零开始用Docker搭建Halo个人博客_第4张图片

选择用户在个人信息栏中找到博客前端访问地址 进行访问就可以看到博客界面了

从零开始用Docker搭建Halo个人博客_第5张图片

九、安装Nginx并配置SSL证书

通过IP+端口访问别人很难记住你的博客,所以就需要使用到域名访问,下面介绍如何使用Nginx反向代理以及如何配置SSL开启Https安全连接访问。

  1. 使用docker下载最新版nginx

    docker pull nginx
    
  2. 创建挂载目录

    # 普通用户zhangsan 分别创建三个目录conf.d:存配置文件   logs:存日志   cert:存ssl证书
    mkdir -p /home/zhangsan/nginx/{conf.d,logs,cert}
    # root账号还是随便创建 但要记住目录地址后续替换对应地址即可
    
  3. 创建并修改nginx相关配置文件

    1)创建nginx基础配置文件nginx.conf

    vim /home/zhangsan/nginx/nginx.conf
    # 打开文件后 可以直接复制下面内容进行覆盖(已优化配置)  也可以根据需要自行配置 
    
    user  nginx;
    # 配置成cpu核心数量即可 高版本支持auto可以自动配置
    worker_processes  auto;                         
    # 默认使用error级别
    error_log  /var/log/nginx/error.log; 
    pid        /var/run/nginx.pid;
    
    events {
    	# 每个核心最大连接数 默认1024
        worker_connections  1024;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    	# 默认日志文件输出格式
        log_format  main  '[$time_local] - $remote_addr - $remote_user "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    	# 设置访问日志路径 压缩处理并开启写入缓冲区
        access_log  /var/log/nginx/access.log  main buffer=32k flush=1m;
    	# 设置日志文件缓存配置
    	open_log_file_cache max=1000 inactive=20s valid=1m min_uses=1;
    	# 优化配置发送数据的方式
        sendfile        on;
        tcp_nopush      on;
        tcp_nodelay     on;
        keepalive_timeout  65;
        
        # 设置文件最大上传大小100MB
    	client_max_body_size 100m;
    	# 关闭nginx的版本显示(安全)
    	server_tokens off;
    
    	# 开启请求压缩 并设置压缩配置
        gzip  on;                   #开启
        gzip_min_length 1k;         #超过1K进行压缩
        gzip_buffers 4 16k;         #设置压缩缓冲流数量以及大小
    	gzip_comp_level 5;          #设置压缩级别 1低~9高 越高cpu占用越高
    	gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;
    	gzip_http_version 1.0;      #设置http的协议版本最低版本 默认1.1 反向代理最低要1.0   
    	gzip_vary on;               #选择支持vary header
    	
        include /etc/nginx/conf.d/*.conf;
    }
    

    2)创建nginx额外引入的自定义配置文件default.conf

    vim /home/zhangsan/nginx/conf.d/default.conf
    # 打开文件后 按照下面配置需要修改 主要是改成你的域名和ssl文件名 
    
    # 配置上游服务器
    upstream halo_nginx {
      # 这里特别注意!要填写docker容器内启动的halo的容器内ip地址或公网ip 具体原因见下文说明
      server halo:8090;
    }
    
    server {
        listen       80;
        listen  [::]:80;
        # 这里要改成你的域名 例如域名叫zhangsan.com www.zhangsan.com
        server_name  zhangsan.com www.zhangsan.com;     
        # 把http的域名请求转成https
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl;
        # 改成你的域名 可以匹配多个
        server_name zhangsan.com www.zhangsan.com;  
        # 配置 ssl  替换成自己的已经获得的域名签名文件名 
        ssl_certificate     /etc/nginx/cert/8653960_www.zhangsan.com.pem;  # pem文件的路径
        ssl_certificate_key  /etc/nginx/cert/8653960_www.zhangsan.com.key; # key文件的路径
        ssl_session_cache   shared:SSL:10m;
    	ssl_session_timeout 10m; 
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
      		proxy_pass http://halo_nginx;
      		expires 30d;
      		access_log off;
        }
       
        location ~ .*\.(js|css)?$ {
      		proxy_pass http://halo_nginx;
      		expires 7d;
      		access_log off;
    	}
    
        location / {
            proxy_pass http://halo_nginx; 
            proxy_set_header HOST $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    
  4. 上传证书文件到宿主机对应的cert目录

    将已经获取到的ssl签名证书文件通过ftp等工具上传至/home/zhangsan/nginx/cert 目录下。

    # 查看已经上传好的文件
    cd /home/zhangsan/nginx/cert && ls -la
    -rw-r--r--. 1 zhangsan zhangsan 1675 Jul 28 20:58 8653960_www.zhangsan.com.key
    -rw-r--r--. 1 zhangsan zhangsan 3818 Jul 28 20:58 8653960_www.zhangsan.com.pem
    
    
  5. 创建启动nginx镜像

    docker run \
    --name nginx \
    -p 443:443 -p 80:80 \
    -v /home/zhangsan/nginx/logs:/var/log/nginx \
    -v /home/zhangsan/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /home/zhangsan/nginx/conf.d:/etc/nginx/conf.d \
    -v /home/zhangsan/nginx/cert:/etc/nginx/cert/  \
    -e TZ=Asia/Shanghai \
    --net halo-net \
    --restart=unless-stopped \
    -d  nginx
    

    PS: 说明下此处server halo:8090; 为什么使用halo:8090 或者公网ip:8090 而不是127.0.0.1:8090

    upstream halo_nginx {
    server halo:8090;
    }

    首先要说明下因为此时的nginx 安装在docker中 所以和nginx直接安装在linux云主机上是不同的。

    1. 如果使用 公网ip:8090 表示匹配后直接跳转到公网地址+端口,只要你安全组开了对应端口肯定可以就不多说了
    1. 如果使用 halo:8090 也没问题具体原因和上面搭建mysql时配置jdbc的url地址中 mysql:3306 一样因为这三个容器都在一个自定义桥接网络 halo-net 中可以支持自动DNS解析直接通过容器名称访问对应容器的ip地址。

    2. 而此处如果填写 127.0.0.1:8090 则不可以,原因是此处的nginx在docker容器内,而此刻的halo的容器内的ip地址通过docker inspect halo 命令查看后对应的ip是 172.18.0.2 所以如果设置 127.0.0.1是无法访问的

    3. 但是如果nginx没有安装在docker中,而是直接安装在linux云主机上,则通过127.0.0.1访问的是云主机linux环境下的ip 此时访问 127.0.0.1:8090 相当于从云主机层面访问云主机内部的halo容器一样,因为halo映射出来的对外端口是8090:8090 (前面的这个8090) 所以可以访问通。

  6. 配置云服务器安全组80 443端口

    参照上面第七步中的开放安全组操作,需要创建80(HTTP)和 443(HTTPS) 入站规则对全网开放。

    从零开始用Docker搭建Halo个人博客_第6张图片

    如果你的域名已经完成备案,那就可以直接通过域名访问博客地址了。

    PS: 当然此时也可以删除8090端口安全规则,可以禁止用户直接通过ip+端口的方式访问博客。

    但是要注意!!!删除该规则需要在配置nginx反向代理时指定的上游服务地址就不能使用公网ip+端口了(因为8090端口的入网规则已经被禁止了)

    可以使用下面两种:(区别:nginx直接安在linux云主机还是云主机内的docker容器内)

    [nginx安装在docker容器内且和halo在一个网络内时]===>halo:8090 【本文nginx安装在docker中推荐】

    [nginx直接安装在linux云主机上时]===>127.0.0.1:8090

十、个性化博客设置

默认的主题如果不能满足个性化需求,可以在Halo主题仓库中选择一款喜欢的主题安装即可

安装方法:下载对应主题后–>登录管理后台选择主题–> 安装–>选择下载好的zip主题包–>上传–>启用即可

从零开始用Docker搭建Halo个人博客_第7张图片

在主题设置中还可以进行一些通用的页面个性化设置,具体根据主题不同可编辑的页面也不同。
还可以在主题编辑中修改通用的页面模板,需要一定的前端知识,即可打造出属于自己的个性化博客了。
欢迎关注我的个人博客:云飞IT技术阁

你可能感兴趣的:(博客搭建,服务器,linux,容器,docker)