Docker安装nextcloud

28 min read

环境:

  • CentOS 7.3
  • Docker version 1.13.1, build 4ef4b30/1.13.1

目的:

安装nextcloud,并将数据库连接至mysql容器中。

准备

使用之前肯定需要安装Docker,所以先升级一下并安装docker:

$ sudo yum update
$ sudo yum install docker

安装完成后可以配置一下镜像,因为docker服务器在国外,直接获取是可能比较慢,甚至失败:

$ sudo vim /etc/docker/daemon.json
{
        "registry-mirrors":[
                "https://xxxx.mirror.aliyuncs.com",
                "https://registry.docker-cn.com",
                "http://docker.mirrors.ustc.edu.cn",
                "http://hub-mirror.c.163.com"
                ]
}
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

从上至下依次为阿里云、docker中国、中科大、网易的镜像源,其中阿里镜像加速需要到阿里官方获取。 还可以指定某用户来使用docker,这样就不需要使用sudo了:

$ sudo suermod -aG docker username
$ sudo systemctl restart docker

只有重启docker后该权限才会生效。 接着就是获取docker镜像了。

$ docker pull mysql:8.0
$ docker pull nextcloud

这里我获取的mysql标签是8.0,也因此出现了一些问题;自己在获取过程中可以使用其他标签,如5、5.6、5.7、5.7.29等。 nextcloud直接使用默认的最新版本,需要说明的是nextcloud的镜像有两种,一种是apache版本的,另一种是需要fpm的,两者使用有所不同,默认安装的是apache的最新版本。

安装mysql和nextcloud

获取镜像后就可以使用了。先说使用命令直接运行的。

使用命令安装

首先运行mysql:

$ docker run -d --name mysql \
    -v d_mysql:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=password \
    -e MYSQL_DATABASE=nextclud \
    -e MYSQL_USER=nextcloud \
    -e MYSQL_PASSWORD=password \
    -p 3306:3306 \
    mysql:8.0

说一下这几个选项,-d选项是让容器以守护态,这样容器就不会自己停止了;--name为容器指定一个名称;-v为数据库映射一个数据卷,d_mysql为本地的一个目录,这样做方便对数据进行本分和迁移;之后四个环境变量分别设置了root用户的密码、新建一个数据库、新建一个用户以及该用户的密码。这里新建的用户对新建的数据库拥有所有权限。然后-p指定端口映射。 MySQL就这样配置完了,当然也可以进入其中简单测试一下是不是安装成功了:

$ docker exec -it mysql bash
root@89f6714e1db1:/# mysql -unextcloud -p
Enter password: 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| nextcloud          |
+--------------------+
2 rows in set (0.00 sec)

看到nextcloud说明配置成功了。接下来安装nextcloud:

$ docker run -d --name nextcloud \
    -v nextcloud:/var/www/html \
    --link mysql:mysql \
    -p 8080:80 nextcloud

--link将两个容器连接,这样nextcloud就会直接使用mysql容器作为数据库了。同样-p指定端口,8080是服务器对外开放的端口,网盘都是自己使用登陆的,建议不要选热门端口就行。除此之外,还要确保该端口是打开的,否则访问时会被拒绝;可以用命令行的方式或者云服务器可以更简单一些,直接在安全组中将对应端口开放。 现在,就可以在浏览器上访问了。首次打开会是一个管理员注册页面,数据库选择mysql/MariaDB即可,注意host栏不用填写地址,填写mysql就行。 一般来说到这里就结束了,但是我这里出现了一个错误:

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

验证不正确,但是在终端是可以正确访问。查了一下,得知是由于MySQL 8默认使用了新的密码验证插件:caching_sha2_password,而之前的PHP版本中所带的mysqlnd无法支持这种验证。 解决这个问题,有两种办法:一种办法是升级PHP支持MySQL 8的新验证插件,但是操作会麻烦一些;另一种是修改MySQL用户的验证,这就简单多了:

mysql> ALTER USER nextcloud@% IDENTIFIED WITH mysql_native_password BY new_password;

如果没有加BY重置密码的话,原有密码会被清空,那样还是无法登录。 这次再创建账户就没什么问题了。

使用docker-compose运行

这里直接给出compose:

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    restart: always

然后使用docker-compose up -d就行了。 对于fpm版本的,写法有所不同:

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=
      - MYSQL_PASSWORD=
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud:fpm
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    restart: always

  web:
    image: nginx
    ports:
      - 8080:80
    links:
      - app
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    volumes_from:
      - app
    restart: always

总结

MySQL把使用了新的密码验证方式caching_sha2_password,可以通过phpinfo()函数了解当前安装的PHP是否支持caching_sha2_password。PHP 7.2.8和PHP 7.1.20已经可以支持caching_sha2_password,直接连接MySQL 8,但是PHP 7.0.31和PHP 5.6.37还无法支持caching_sha2_password,不知道后续版本是否会做出支持。