K8S APISERVER源码: API注册主体流程

基于版本 1.6.7

未分类

k8s使用了go-restful github, 在前面, 已经介绍了container如何初始化的.

这里, 需要关注, api是如何注册进来的. 即, route -> webservice -> container

begin

  • pkg/master/master.go
func (c completedConfig) New() (*Master, error) {

   //  register /api
   m.InstallLegacyAPI(c.Config, c.Config.GenericConfig.RESTOptionsGetter, legacyRESTStorageProvider)
   //  register /apis
   m.InstallAPIs(c.Config.APIResourceConfigSource, c.Config.GenericConfig.RESTOptionsGetter, restStorageProviders...)
}

1. /api

  • pkg/master/master.go
func (m *Master) InstallLegacyAPI(c *Config, restOptionsGetter generic.RESTOptionsGetter, legacyRESTStorageProvider corerest.LegacyRESTStorageProvider) {
    legacyRESTStorage, apiGroupInfo, err := legacyRESTStorageProvider.NewLegacyRESTStorage(restOptionsGetter)
    m.GenericAPIServer.InstallLegacyAPIGroup(genericapiserver.DefaultLegacyAPIPrefix, &apiGroupInfo)
  • vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
func (s *GenericAPIServer) InstallLegacyAPIGroup(apiPrefix string, apiGroupInfo *APIGroupInfo) error {
    s.installAPIResources(apiPrefix, apiGroupInfo)
}

2. /apis

  • pkg/master/master.go
func (m *Master) InstallAPIs(apiResourceConfigSource serverstorage.APIResourceConfigSource, restOptionsGetter generic.RESTOptionsGetter, restStorageProviders ...RESTStorageProvider) {
    for i := range apiGroupsInfo {
        m.GenericAPIServer.InstallAPIGroup(&apiGroupsInfo[i])   }
}
  • vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
func (s *GenericAPIServer) InstallAPIGroup(apiGroupInfo *APIGroupInfo) error {
    s.installAPIResources(APIGroupPrefix, apiGroupInfo)
}

3. all to installAPIResources

vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo) error {
    for _, groupVersion := range apiGroupInfo.GroupMeta.GroupVersions {
        apiGroupVersion.InstallREST(s.HandlerContainer.Container)
    }
}
  • vendor/k8s.io/apiserver/pkg/endpoints/groupversion.go
func (g *APIGroupVersion) InstallREST(container *restful.Container) error {
    installer := g.newInstaller()
    // 新建一个WebService
    ws := installer.NewWebService()

    // 关键, URL注册, add router into ws
    apiResources, registrationErrors := installer.Install(ws)
    lister := g.ResourceLister
    if lister == nil {
        lister = staticLister{apiResources}
    }
    AddSupportedResourcesWebService(g.Serializer, ws, g.GroupVersion, lister)

    // container.add(webservice)
    container.Add(ws)
    return utilerrors.NewAggregate(registrationErrors)
}

在这里

  1. 新建一个WebService
  2. 由installer.Install(ws)将API 对应的route新建初始化后, 加入到 WebService
  3. 将WebService加入到Container
    完成了router -> webservice -> container的流程

后面, 分析 installer.Install(ws) 具体做了哪些事情(vendor/k8s.io/apiserver/pkg/endpoints/installer.go)

CentOS 6 通过iptables进行流量转发

受限于国内网络环境以及国际出口的成天炸炸炸,当然这一切都可以通过加钱来解决,加钱世界可及 — 中国奠信

有些服务器的网络面向大陆比较友好,例如阿里云香港B/C区、腾讯云香港,这时可以通过使用iptables进行流量转发来让那些面向大陆网络情况不是很友好的服务器,也能跑满100Mbps甚至更高。

流量转发的方案很多,iptables算是其中一种,还有HaProxy和SoCat,不过都有比较大的局限,例如HaProxy无法转发UDP,SoCat无法批量转发多个端口,但是单端口转发SoCat是个不错的选择。

既然要进行流量转发,那么首先要开启服务器的转发功能,打开控制台输入 vi /etc/sysctl.conf 然后找到 net.ipv4.ip_forward = 0 修改为 net.ipv4.ip_forward = 1 随后保存。

执行 sysctl -p 来使更改生效。

然后执行以下命令来添加iptables转发规则

单端口转发

iptables -t nat -A PREROUTING -p tcp --dport [要转发的端口号] -j DNAT --to-destination [要转发的服务器IP]
iptables -t nat -A PREROUTING -p udp --dport [要转发的端口号] -j DNAT --to-destination [要转发的服务器IP]
iptables -t nat -A POSTROUTING -p tcp -d [要转发的服务器IP] --dport [要转发的端口号] -j SNAT --to-source [本机IP]
iptables -t nat -A POSTROUTING -p udp -d [要转发的服务器IP] --dport [要转发的端口号] -j SNAT --to-source [本机IP]

端口段转发,栗子:转发10000到20000这个端口段,则填10000:20000

iptables -t nat -A PREROUTING -p tcp --dport [要转发的端口段] -j DNAT --to-destination [要转发的服务器IP]
iptables -t nat -A PREROUTING -p udp --dport [要转发的端口段] -j DNAT --to-destination [要转发的服务器IP]
iptables -t nat -A POSTROUTING -p tcp -d [要转发的服务器IP] --dport [要转发的端口段] -j SNAT --to-source [本机IP]
iptables -t nat -A POSTROUTING -p udp -d [要转发的服务器IP] --dport [要转发的端口段] -j SNAT --to-source [本机IP]

最后保存规则和重启iptables服务

service iptables save

service iptables restart

现在可以去试试看流量转发后速度效果如何了。

解决 iptables: Firewall modules are not loaded.

今天配置主机的时候 启动 重启防火墙都没有反应 查看防火墙状态

报错

[root@host ~]# service iptables status
iptables: Firewall modules are not loaded.

防火墙报: iptables: Firewall modules are not loaded. 百度搜到了解决方法

一. 有博客说模块没有加载,我试了这种方法没成功

加载模块

modprobe  ip_tables  #加载ip_tables模块
modprobe  iptable_filter  #加载iptable_filter模块
lsmod | grep iptable  #查看模块,有模块即解决了
iptable_filter          2173  0 
ip_tables               9567  1 iptable_filter

二. 清理iptables规则.测试成功

清理iptables规则

iptables -F #清理iptables规则
service iptables save #保存
service iptables restart #重启防火墙
service iptables status #查看状态

linux 开启独立iptables日志

iptables的日志(log)由syslogd纪录和管理。初始存放在 /var/log/messages里面。自动采取循环纪录(rotation)的方式记录。但是由于混在 messages中,对于管理和监视产生了不便。

由于iptables是linux的内核本身的功能,由dmesg或syslogd的facility结合内核管理。iptables的日志的初始值是[warn(=4)], 需要修改 rsyslog.conf。

注:系统日志配置在CentOS5上叫syslog,而在CentOS6上叫rsyslog,叫增强版的syslog,CentOS5上的配置文件在/etc/syslog.conf下,而CentOS6在/etc/rsyslog.conf下。

1、修改/etc/rsyslog.conf

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

修改为

*.info;*.!notice;mail.none;authpriv.none;cron.none                /var/log/messages

同时添加

kern.=notice                                            /var/log/iptables.log

建议改为notice,将iptables产生的日志放在 /var/log/iptables.log

2、iptablse添加日志选项

iptables -t nat -I POSTROUTING -o eth0 -j LOG --log-level notice --log-prefix "iptables "

–log-level 为日志级别
–log-prefix 添加日志前缀便于分析处理

3、让日志滚动

在/etc/logrotate.d/syslog中 添加
/var/log/iptables.log,默认使用的是系统的轮替规则,当然也可以根据自己的需要去修改

4、用自己的轮替规则

(1)在目录/etc/logrotate.d/下创建一个日志转储的配置文件(名字可以自己定义,只要在该目录下就会被执行),比如iptables

(2)配置文件iptables的内容如下

/var/log/iptables.log {
daily
dateext
copytruncate
nocompress
rotate 15
}

第一行的左大括号之前的/var/log/iptables.log 指出了要转储的日志文件的具体位置和文件名;
daily:按天去转储;
dateext:表示转储后的日志文件会附加上日期信息
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;
nocompress 不要对转储的日志压缩
rotate 15 保留多少个转储之后的日志文件;

(3)确保iptables的权限为:-rw-r–r–

A 七种信息等级

1)info
2)notice
3)warning或warn
4)err或error
5)crit
6)alert
7)emerg或panic:导致系统几乎要死机

B 信息等级的指定方式

1). xxx: 表示大于xxx级别的信息
2).=xxx:表示等于xxx级别的信息
3).!xxx:表示在xxx之外的等级的信息

附加:

更改linux rsyslog 日期格式
默认时间格式:Dec 16 09:52:01,看起来不习惯,修改成 2014-12-16 09:52:01

vim /etc/rsyslog.conf
# 定义自己的本土化的时间格式
$template myformat,"%$NOW% %TIMESTAMP:8:15% %hostname% %syslogtag% %msg%n"
# Use default timestamp format
#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# 使用自定义的格式
$ActionFileDefaultTemplate myformat

利用iptables防止syn flood攻击

未分类

命令:

iptables -N syn-flood
iptables -A syn-flood -m limit --limit 50/s --limit-burst 10 -j RETURN
iptables -A syn-flood -j DROP
iptables -I INPUT -j syn-flood

解释:

-N 创建一个条新的链
--limit 50/s 表示每秒50次;1/m 则为每分钟一次
--limit-burst 表示允许触发 limit 限制的最大包个数 (预设5),它就像是一个容器,最多装10个,超过10个就装不下了,这些包就给后面的规则了
-I INPUT -j syn-flood  把INPUT的包交给syn-flood链处理
这里的--limit-burst=10相当于说最开始有10个可以匹配的包去转发,然后匹配的包的个数是根据--limit=50/s进行限制的,也就是每秒限制转发50个数据包,多余的会被下面符合要求的DROP规则去处理,进行丢弃,这样就实现了对数据包的限速问题。

MariaDB数据库主从复制

摘要:/etc/my.cnf然后按i编辑,输入下图红框中两行数据3、退出之后重启数据库systemctl restart mariadb4、进入数据库mysql -u root -p查看…

未分类

大家好,我是Adam,前面两周讲了MariaDB的安装以及简单的安全配置,这周就深入一些,讲一点相对来说复杂的东西,两个数据库之间的主从复制,没有看前面教程的朋友可以点击下面的链接去看一下

好了,走起走起

1、需要两个数据库服务端,数据库版本一致,并且互通

2、先来配置主数据库

vi /etc/my.cnf

然后按i编辑,输入下图红框中两行数据

3、退出之后重启数据库

systemctl restart mariadb

4、进入数据库

mysql -u root -p

查看主数据库状态

show master statusG;

根据返回的信息可以得出结论,配置的主数据库文件没有问题

5、锁定所有的表,使其他人不能对表做出修改的操作

flush tables with read lock;

6、退出数据库,接下来对数据库做一个导出

mysqldump -hlocalhost -uroot -p3306 -p test > /home/test.sql

然后输入数据库密码即可

7、进入home目录,看test.sql是否已创建

8、利用scp命令把test.sql文件传到从数据库服务器上

scp test.sql [email protected]:/home/

输入从服务器密码

9、在从数据库服务器上查看文件是否上传成功

10、回到主数据库服务器,解除表的锁定

unlock tables;

11、在主数据库中把从数据库需要用的用户创建出来

grAnt replication slave on *.* to 'slave'@'192.168.2.197' identified by '123456';

‘slave’为用户名 ’192.168.2.197’为从数据库IP地址 ’123456’为密码

12、主数据库服务器配置完成,接下来配置从数据库服务器,在主数据库服务器中进入数据库界面,执行第4步操作,把界面放到旁边,待会用得到

13、操作从数据库服务器,一样的,也需要修改数据库配置文件参数

vi /etc/my.cnf

14、同样的,配置完成后重启数据库

15、进入数据库,设置主从复制

CHANGE MASTER TO MASTER_HOST='192.168.2.196',MASTER_USER='slave', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS= 555;

后面两项要填写的参数为第12步中显示的参数

16、开启主从复制

START SLAVE;

17、查看从数据库状态

show slave statusG;

可以看到,已经连接成功,配置完成!

使用docker一键部署MariaDB数据库只需要3分钟

摘要:MariaDB是MySQL关系数据库管理系统的一个分支. MySQL的原始开发人员在Oracle收购MySQL后提出的关注之后创建了MariaDB. …

未分类

MariaDB是MySQL关系数据库管理系统的一个分支。 MySQL的原始开发人员在Oracle收购MySQL后提出的关注之后创建了MariaDB。 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

大多数方面,MariaDB与MySQL几乎一样。所有的命令、接口、库和APIs,存在于MySQL,也存在于MariaDB。切换到MariaDB不需要转换数据库。MariaDB是真正替代MySQL的!

目录结构如下

请看我用dockerfile构建

FROM docker.io/centos:latest
MAINTAINER zailing <[email protected]>

RUN yum clean all
RUN yum install -y yum-plugin-fastestmirror yum-utils epel-release
RUN yum update -y

# utils
RUN yum install -y git hostname sudo less iproute psmisc net-tools 
bash unzip which tar passwd ed m4 patch rsync wget curl tcpdump telnet 
tar bzip2 unzip strace supervisor openssl openssh openssh-server 
openssh-clients util-linux inotify-tools

# dev
RUN yum install -y gcc-c++ libtool make gdb mariadb-devel snappy-devel 
boost-devel lz4-devel zlib-devel libcurl-devel libevent-devel 
libesmtp-devel libuuid-devel libcsv-devel cyrus-sasl-devel 
bzip2-devel libpqxx-devel libxml2-devel libxslt-devel libxslt-python 
libpng-devel jemalloc-devel fontconfig-devel pcre-devel

# deps
RUN yum install -y redis sqlite mariadb mariadb-server postgresql

# python
RUN yum install -y python-pip python-devel python-lxml python-setuptools

RUN mkdir /var/run/sshd
RUN ssh-keygen -t rsa -q -f /etc/ssh/ssh_host_rsa_key -P ""
RUN ssh-keygen -t dsa -q -f /etc/ssh/ssh_host_dsa_key -P ""
RUN ssh-keygen -t rsa -q -f /root/.ssh/id_rsa -P ""
RUN cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys

RUN echo 'root:123456' | chpasswd
RUN sed -i 's/.*session.*required.*pam_loginuid.so.*/session optional pam_loginuid.so/g' /etc/pam.d/sshd
RUN echo -e "LANG="en_US.UTF-8"" > /etc/default/local
RUN localedef -i en_US -f UTF-8 en_US.UTF-8
RUN cp /usr/lib64/mysql/libmysqlclient* /usr/lib64/
RUN rm -rf etc/localtime && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN echo "bind '"e[A":history-search-backward'" >> /root/.bashrc
RUN echo "bind '"e[B":history-search-forward'" >> /root/.bashrc
RUN echo "export HISTTIMEFORMAT='%F %T '" >> /root/.bashrc

EXPOSE 22
RUN chmod u+s /usr/bin/ping

EXPOSE 3306

WORKDIR /usr/local/mysql
VOLUME ["/var/lib/mysql"]
VOLUME ["/etc/my.cnf.d"]

RUN mkdir -p /init
VOLUME ["/init"]

RUN yum clean all

ADD container-files /

RUN chmod +x /config/bootstrap.sh
RUN chmod +x -f /config/init/*.sh; exit 0

ENTRYPOINT ["/config/bootstrap.sh"]

docker-compose的书写格式如下 docker-compose.yml

version: '2'
services:
    mariadb:
        build: .
        image: zailing/mariadb
        container_name: mariadb
        hostname: mariadb
        privileged: true
        read_only: false
        tty: false
        network_mode: "bridge"

        ulimits:
            nofile:
                soft: 102400
                hard: 102400

        ports:
            - "127.0.0.1:2238:22"
            - "3306:3306"

        volumes:
            - /opt/docker/mariadb/data:/var/lib/mysql
            - /opt/docker/mariadb/init:/init
            - /opt/docker/mariadb/conf:/etc/my.cnf.d

        environment:
            - MYSQL_ROOT_PASSWORD=123456

MySQL物理文件组成详解

1、逻辑结构

第一层:服务层(为客户端服务,做请求连接处理,授权认证,安全)
第二层:核心层(查询解析,分析,优化,缓存,提供内建函数,存储过程,视图) 第三层:存储引擎层(做存取数据)

2、日志文件

  • 错误日志:Error Log

记录了MyQLServer运行过程中所有较为严重的警告和错误信息,以及MySQLServer 每次启动和关闭的详细信息。在默认情况下,系统记录错误日志

  • 二进制日志Binary Log & Binary Log Index

name]”打开了记录的功能之后,MySQL会将所有修改数据
库数据的query以二进制形式记录到日志文件中。当然,日志中并不仅限于query

语句这么简单,还包括每一条query所执行的时间,所消耗的资源,以及相关的事务信息

所以binlog是事务安全的

  • 更新日志:update log

其功能和 binlog 基本类似,从版本5.0 开始,MySQL 已经不再支持更新日志

  • 查询日志:query log

记录了所有的 query,包括所有的 select,体积比较大,开启后对性能也有较大的影响, 所以请大家慎用该功能。 一般只用于跟踪某些特殊的sql 性能问题才会短暂打开该功能。

  • 慢查询日志:slow query log

记录了语句执行的时刻,执行所消耗的时间,执行用户,连接主机等相关信息。分析满查询日志的工具程序mysqlslowdump, 用来帮助数据库管理人员解决可 能存在的性能问题

  • Innodb 的在线redo 日志:innodb redo log

Innodb是一个事务安全的存储引擎,其事务安全性主要就是通过在线redo
日志和记录在表空间中的undo信息来保证的。redo日志中记录了Innodb 所做的所有物理变更和事务信息,通过redo日志和undo信息,Innodb 保证了在任何情况下的事务安全性。

3、数据文件

简述:在MySQL中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以
数据库名字命名的文件夹,用来存放该数据库中各种表数据文件。

  • “.frm”文件

与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定
义信息等。不论是什么存储引擎,每一个表都会有一个以表名命名的“.frm”文
件。

  • “.MYD”文件

“.MYD”文件是MyISAM存储引擎专用,存放MyISAM表的数据。每一个MyISAM
表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,
和“.frm”文件在一起。

  • “.MYI”文件

“.MYI”文件也是专属于MyISAM 存储引擎的,主要存放MyISAM 表的索引相
关信息。

  • “.ibd”文件和ibdata 文件

这两种文件都是存放Innodb 数据的文件,之所以有两种文件来存放Innodb
的数据(包括索引),是因为Innodb 的数据存储方式能够通过配置来决定是使用
共享表空间存放存储数据,还是独享表空间存放存储数据。

使用Docker多阶段构建生成更小的镜像

在使用将源码直接打为Docker镜像的时候,经常纠结的问题就是如何获得更小的镜像。

以一个java项目为例,因为java编译的时候需要jdk,而运行的时候只需要jre。同时由于各种构建工具的存在(比如gradle),下载的构建用的文件也很多,不光是maven的依赖,还有wrapper和一些临时文件。

之前的做法一直是使用两个Dockerfile,其中一个使用jdk构建出需要的jar文件,然后第二个使用jre直接将jar文件复制进去。虽然效果不错,但是还是觉得麻烦。

今天使用Daocloud的时候看到了安全构建这个选项(本质就是两段构建),就突然想到Docker会不会已经有了。结果一搜索还真有,亏我还用多Dockerfile构建了很长时间。

大概使用如下:

FROM openjdk:8 AS build-env
ADD . /java/src/app
WORKDIR /java/src/app
RUN gradlew build

FROM openjdk:jre
RUN apk add -U tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
COPY --from=build-env /java/src/app/build/libs/target.jar /usr/local/bin/app-server
EXPOSE 8080
CMD ["app-server"]

Docker支持的是多阶段构建,所以如果有需要的话,可以从多个不同的构建中获得生成物。

docker-php添加redis扩展

环境及版本

  • php: php:5-fpm-alpine
  • docker: version 17.06.1-ce
  • docker-compose: version 1.16.0-rc2

源码安装方式

ENV PHPREDIS_VERSION 3.1.3
RUN curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz 
    && tar xfz /tmp/redis.tar.gz 
    && rm -r /tmp/redis.tar.gz 
    && mkdir -p /usr/src/php/ext 
    && mv phpredis-$PHPREDIS_VERSION /usr/src/php/ext/redis 
    && docker-php-ext-install redis 
    && rm -rf /usr/src/php #如果这段不加构建的镜像将大100M 

PECL安装方式

#添加扩展 redis pecl方式
RUN apk add --no-cache --update libmemcached-libs zlib
RUN set -xe 
    && apk add --no-cache --update --virtual .phpize-deps $PHPIZE_DEPS 
    && pecl install -o -f redis  
    && echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini
    && rm -rf /usr/share/php 
    && rm -rf /tmp/* 
    && apk del  .phpize-deps

Nginx配合docker安装nextcloud(超简易)|抛弃owncloud

Nextcloud是owncloud母公司破产前核心人员离职出来创建的,免费版里包含了很多owncloud付费版本的功能,因为核心都是一样的,所以我们当然可以选择功能更多的nextcloud版本了。

我安装的nextcloud网盘:https://nextpan.net

安装docker

在使用本教程前,建议您对docker进行一些基本的了解,知道一些简单的命令,比如:

docker images
docker ps –a
docker start
docker stop
docker rm
docker rmi

不了解docker的可以谷歌一下这些命令快速了解,也可以看官方的docker教程。

docker官方安装教程:https://store.docker.com/search?type=edition&offering=community

我贴一下Ubuntu系统的安装方式,依次输入下列命令:

sudo apt–get –y install
  apt–transport–https
  ca–certificates
  curl
curl –fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
sudo add–apt–repository
       “deb [arch=amd64] https://download.docker.com/linux/ubuntu
       $(lsb_release -cs)
       stable”
sudo apt–get update
sudo apt–get –y install docker–ce

安装docker-compose

docker-compose是定义和运用docker的一种工具,使用下列命令安装:

apt install docker–compose

安装完成后,新建docker-compose.yml文件:

vim docker–compose.yml

然后把下列内容复制粘贴,注意这里我选用的是wonderfall的版本,他的版本star数最多,比官方的新,另外注意,修改pwd为自己的密码:

nextcloud:
  image: wonderfall/nextcloud
  links:
    – nextcloud–db:nextcloud–db  
  environment:
    – UID=1000
    – GID=1000
    – UPLOAD_MAX_SIZE=10G
    – APC_SHM_SIZE=128M
    – OPCACHE_MEM_SIZE=128
    – CRON_PERIOD=15m
    – TZ=Aisa/Shanghai
    – ADMIN_USER=admin            
    – ADMIN_PASSWORD=pwd  
    – DOMAIN=localhost
    – DB_TYPE=mysql
    – DB_NAME=nextcloud
    – DB_USER=nextcloud
    – DB_PASSWORD=pwd
    – DB_HOST=nextcloud–db
  volumes:
    – /docker/nextcloud/data:/data
    – /docker/nextcloud/config:/config
    – /docker/nextcloud/apps:/apps2
    – /docker/nextcloud/themes:/nextcloud/themes
  ports:
    – 127.0.0.1:8888:8888/tcp
nextcloud–db:
  image: mariadb:10
  volumes:
    – /docker/nextcloud/db:/var/lib/mysql
  environment:
    – MYSQL_ROOT_PASSWORD=pwd
    – MYSQL_DATABASE=nextcloud
    – MYSQL_USER=nextcloud
    – MYSQL_PASSWORD=pwd

然后在docker—compose.yml所在文件夹里,输入以下命令:

docker–compose up –d

这时候docker版本的nextcloud就已经安装好了,端口是127.0.0.1:8888,我们接下来利用nginx反代这个端口,并且加上https,从而能让外网安全的访问。

安装nginx

apt install nginx

安装letsencrypt

apt install letsencrypt

生成证书

注意替换域名

letsencrypt certonly —webroot –w /var/www/html —domain “abc.example.com”

配置nginx

可以修改默认的,也可以新建一个配置文件,我这里直接修改默认的

vim /etc/nginx/sites–available/default

删掉里面的内容,复制粘贴进这个,注意你的letsencrypt生成的证书路径对不对,一般只需要改一下domain就行了:

server {
  listen 80;
  server_name abc.example.com;
  return 301 https://$host$request_uri;
}
server {

    server_name nextpan.net www.nextpan.net;
    listen 443 ssl http2;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/abc.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/abc.example.com/privkey.pem;
    include /etc/nginx/conf/ssl_params.conf;
    client_max_body_size 10G;
    location / {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8888;
        proxy_set_header Host $http_host;
    }
    location = /.htaccess {
        return 404;
    }
}

重启nginx:

service nginx restart

然后输入自己的域名就可以直接登陆了。

如果想更新,只需要删掉nextcloud和mariadb的container,重新docker-compose up -d就可以了。