CentOS+Docker+Mysql+Gerrit+Nginx 配置

软件环境:

  • CentOS 7.0
  • Docker 18.06.0-ce

以下为采用docker镜像

  • Mysql 5.7
  • Gerrit 2.15.3
  • Nginx 1.15.2-alpine

假定当前服务器ip地址为(以上3个软件都在同一个服务器)

192.168.0.1

注:在使用docker镜像时,强烈建议固定容器的镜像版本号,不要用 lastest。

这样可以保证在任何环境下都能正确运行,因为不同版本的镜像可能配置不一样。此处本人也入坑良久。

本地目录结构(包含 mysql gerrit nginx 3个软件的配置目录):

├── docker-compose.yml
├── gerrit
│   └── review_site
├── mysql
│   └── db
└── nginx
    ├── logs
    └── nginx.conf


1. 配置 docker-compose.yml 文件:

首先配置 Gerrit 与 Mysql,Nginx稍后再配置:

version: "3"
services:

  db:
    image: "mysql:5.7"
    ports:
      - "3306:3306"
    restart: always
    volumes:
      - /data/mysql/db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=XXXX

  gerrit:
    depends_on:
      - db
    image: "openfrontier/gerrit:2.15.3"
    ports:
      - "29418:29418"
      - "8080:8080"
    volumes:
      - /data/gerrit/review_site:/var/gerrit/review_site
    environment:
      - AUTH_TYPE=HTTP
      - WEBURL=http://192.168.0.1:8080
      - DATABASE_TYPE=mysql
      - DATABASE_HOSTNAME=db
      - DATABASE_PORT=3306
      - DATABASE_DATABASE=gerrit
      - DATABASE_USERNAME=gerrit
      - DATABASE_PASSWORD=gerrit

2. 优先启动 db 数据库容器:

此处必须要优先启动 Mysql 数据库,因为需要创建 gerrit 数据库以及操作 gerrit 数据库的账号

$ docker-compose up db

3. 配置数据库:

数据库容器启动后先以root账号进入容器:

$ docker-compose up db

容器名称可以通过 docker-compose ps 查看

以root账号进入mysql控制台

root@d73a4491dba4:/# mysql -u root -p

创建 gerrit 数据库并设置字符集 utf-8

mysql> CREATE database 数据库名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

创建 gerrit 账号及密码(名称自己定义,主要为gerrit数据库访问用)并设置访问gerrit数据库权限
此处,为方便测试,我设置数据库,账号,密码都为 gerrit

mysql> grant all privileges on gerrit.* to gerrit@'%' identified by 'gerrit';

立即刷新权限

mysql> flush privileges;

新版本的 mysql , timestamp默认值的问题需要手动配置一下,本地测试如果不设置,gerrit创建表的时候总是报错

Exception in thread "main" com.google.gwtorm.server.OrmException: Cannot apply SQL
CREATE TABLE account_group_members_audit (
added_by INT DEFAULT 0 NOT NULL,
removed_by INT,
removed_on TIMESTAMP NULL DEFAULT NULL,
account_id INT DEFAULT 0 NOT NULL,
group_id INT DEFAULT 0 NOT NULL,
added_on TIMESTAMP NOT NULL
,PRIMARY KEY(account_id,group_id,added_on)
)
    at com.google.gwtorm.jdbc.JdbcExecutor.execute(JdbcExecutor.java:44)
    at com.google.gwtorm.jdbc.JdbcSchema.createRelations(JdbcSchema.java:134)
    at com.google.gwtorm.jdbc.JdbcSchema.updateSchema(JdbcSchema.java:104)
    at com.google.gerrit.server.schema.SchemaCreator.create(SchemaCreator.java:81)
    at com.google.gerrit.server.schema.SchemaUpdater.update(SchemaUpdater.java:108)
    at com.google.gerrit.pgm.init.BaseInit$SiteRun.upgradeSchema(BaseInit.java:386)
    at com.google.gerrit.pgm.init.BaseInit.run(BaseInit.java:143)
    at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:61)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:204)
    at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:108)
    at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:63)
    at Main.main(Main.java:24)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Invalid default value for 'added_on'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2497)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2455)
    at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:839)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:739)
    at com.google.gwtorm.jdbc.JdbcExecutor.execute(JdbcExecutor.java:42)
    ... 15 more

此时可通过如下方式解决:使用 MySQL root 用户登录,设置 set global explicit_defaults_for_timestamp=1;,像下面这样: 

mysql> set global explicit_defaults_for_timestamp=1;

数据库配置完成,退出

mysql> exit

4. 可以启动gerrit了

$ docker-compose up gerrit

若出现以下字样,则表示gerrit启动成功

 [main] INFO  org.eclipse.jetty.server.Server : Started @22467ms
 [main] INFO  com.google.gerrit.pgm.Daemon : Gerrit Code Review 2.15.3 ready

5. 由于我们采用 HTTP 认证方式,因此需要配置反向代理:

a. 首先配置 docker-compose.yml 文件,在gerrit service下修改内容:

增加环境变量:HTTPD_LISTENURL=proxy-http://*:8080/

修改环境变量:WEBURL=http://192.168.0.1:8080 为 WEBURL=http://192.168.0.1

即去掉端口号

如下:

version: "3"
services:
  db:
    ...

  gerrit:
    ...
    environment:
      - AUTH_TYPE=HTTP
      - HTTPD_LISTENURL=proxy-http://*:8080/
      - WEBURL=http://192.168.0.1
    ...

 b. 然后准备 nginx.conf 文件

该文件是 Nginx 服务器的配置文件,可以从 nginx 容器中获取默认的配置文件,然后修改:

以下是从 Nginx 官方docker镜像网站上的方法

$ docker run --name tmp-nginx-container -d nginx:1.15.2-alpine
$ docker cp tmp-nginx-container:/etc/nginx/nginx.conf /host/path/nginx.conf
$ docker rm -f tmp-nginx-container

/host/path/nginx.conf 这个文件就是一个默认的配置文件,我们可以直接拿来修改:

在 http 段中添加 server (add start ----- add end 之间的内容):

...
http {
    #add start
    server {
        listen *:80;
        server_name gerrit;
        location / {
            auth_basic "Restricted";
            auth_basic_user_file /etc/nginx/passwd;
            proxy_pass http://gerrit:8080/;
            proxy_set_header  X-Forwarded-For $remote_addr;
            proxy_set_header  Host $host;
        }
    }
    #add end
    ...
}
...

解释几个重要的地方:

- server_name gerrit;
- proxy_pass http://gerrit:8080/;

server_name 一般来说都是指定ip地址或者域名,但此处由于我们采用的是docker容器,并且是多个容器共同运行,容器之间互联则直接采用 docker-compose.yml 中的services 名即可,所以此处用了 gerrit

这点尤其重要,本人之前一直用ip地址,gerrit一直无法正常访问,掉坑2天。

- auth_basic_user_file /etc/nginx/passwd;

配置 HTTP 登陆时的认证文件,该文件保存用户账号密码,由 htpasswd 命令创建。
nginx.conf 文件配置好后,就放入本地 /data/nginx/nginx.conf,参考本文最开始的目录结构说明

d. 创建认证文件 passwd

$ htpasswd -c /data/gerrit/review_site/etc/passwd 姓名

回车后输入密码(htpasswd命令的具体用法可以自行百度)。

e. 启动 Nginx 容器

在 docker-compose.yml 中增加 Nginx 容器配置代码:

nginx:
    depends_on:
      - gerrit
    image: "nginx:1.15.2-alpine"
    ports:
      - "80:80"
    volumes:
      - /data/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /data/gerrit/review_site/etc/passwd:/etc/nginx/passwd

此处的 passwd 文件由htpasswd创建并保存在本地,并且用 volumes 挂载到 Nginx 容器内
然后可以启动 Nginx 容器了:

$ docker-compose up nginx

或者停止之前的 Gerrit/Mysql 容器,然后再整个启动:

$ docker-compose down
$ docker-compose up

启动过程没有错误则搭建成功。
客户端(另外的机器)访问 http://192.168.0.1 
首先由 Nginx 服务器获取并弹出输入用户名密码窗口,输入账号密码(上面由 htpasswd 命令创建)后,就会被Nginx转发到 http://192.168.0.1:8080 

最后,在附上 docker-compose.yml nginx.conf 的完整配置(gerrit.config 其实不需要再单独修改,因为在该容器运行的时候,会被 docker-compose.yml 文件中的环境变量覆盖):

docker-compose.yml:

version: "3"
services:

  db:
    image: "mysql:5.7"
    ports:
      - "3306:3306"
    restart: always
    volumes:
      - /data/mysql/db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=XXX

  gerrit:
    depends_on:
      - db
    image: "openfrontier/gerrit:2.15.3"
    ports:
      - "29418:29418"
      - "8080:8080"
    volumes:
      - /data/gerrit/review_site:/var/gerrit/review_site
    environment:
      - AUTH_TYPE=HTTP
      - HTTPD_LISTENURL=proxy-http://*:8080/
      - WEBURL=http://192.168.0.1
      - DATABASE_TYPE=mysql
      - DATABASE_HOSTNAME=db
      - DATABASE_PORT=3306
      - DATABASE_DATABASE=gerrit
      - DATABASE_USERNAME=gerrit
      - DATABASE_PASSWORD=gerrit

  nginx:
    depends_on:
      - gerrit
    image: "nginx:1.15.2-alpine"
    ports:
      - "80:80"
    volumes:
      - /data/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /data/gerrit/review_site/etc/passwd:/etc/nginx/passwd

nginx.conf:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    #add start
    server {
        listen *:80;
        server_name gerrit;
        location / {
            auth_basic "Restricted";
            auth_basic_user_file /etc/nginx/passwd;
            proxy_pass http://gerrit:8080/;
            proxy_set_header  X-Forwarded-For $remote_addr;
            proxy_set_header  Host $host;
        }
    }
    #add end

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

上面涉及到账号,密码,IP地址,文件路径的,请根据自己实际情况修改。

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值