Docker Swarm 集群搭建

    修改文件 ,允许使用 TCP 连接 Docker

    1. ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2375

    搭建自己的Gitlab

    首先我们修改一下端口号,把 sshd 服务的 22 端口改为 2222,让 gitlab 可以使用 22 端口。

    1. $ vim /etc/ssh/sshd_config
    2. # 默认 Port 改为 2222
    3. Port 2222
    4. # 重启服务
    5. $ systemctl restart sshd.service

    重新登录机器

    1. ssh -p 2222 root@host

    安装 Gitlab

    1. sudo docker run -d --hostname gitlab.xxx.cn \
    2. --publish 443:443 --publish 80:80 --publish 22:22 \
    3. --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab \
    4. --volume /srv/gitlab/logs:/var/log/gitlab \
    5. --volume /srv/gitlab/data:/var/opt/gitlab \
    6. gitlab/gitlab-ce:latest

    首次登录 Gitlab 会重置密码,用户名是 root

    安装gitlab-runner

    官方地址

    CentOS 为例

    1. curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
    2. yum install gitlab-runner

    当然,可以用 curl https://setup.ius.io | sh 命令,更新为最新的 git 源,然后直接使用 yum 安装 git 和 gitlab-runner。

    1. $ curl https://setup.ius.io | sh
    2. $ yum -y install git2u
    3. $ git version
    4. $ yum install gitlab-runner

    注册 gitlab-runner

    1. $ gitlab-runner register --clone-url http://内网ip/
    2. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
    3. http://gitlab.xxx.cc/
    4. xxxxx
    5. Please enter the gitlab-ci description for this runner:
    6. xxx
    7. Please enter the gitlab-ci tags for this runner (comma separated):
    8. builder
    9. Please enter the executor: docker-ssh, shell, docker+machine, docker-ssh+machine, docker, parallels, ssh, virtualbox, kubernetes:
    10. shell

    初始化 Swarm 集群

    登录另外一台机器,初始化集群

    1. $ docker swarm init
    1. docker network create \
    2. --driver overlay \
    3. --subnet 10.0.0.0/24 \
    4. --opt encrypted \
    5. --attachable \
    6. default-network

    加入集群

    1. # 显示manager节点的TOKEN
    2. # 加入manager节点到集群
    3. $ docker swarm join --token <token> ip:2377
    4. # 显示worker节点的TOKEN
    5. $ docker swarm join-token worker
    6. # 加入worker节点到集群
    7. $ docker swarm join --token <token> ip:2377

    然后配置发布用的 gitlab-runner

    以下以 Mysql 为例,直接使用上述 network,支持容器内使用 name 互调。

    1. docker run --name mysql -v /srv/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xxxx -p 3306:3306 --rm --network default-network -d mysql:5.7

    安装 Portainer

    Portainer

    1. docker service create \
    2. --name portainer \
    3. --publish 9000:9000 \
    4. --replicas=1 \
    5. --constraint 'node.role == manager' \
    6. --mount type=volume,src=portainer_data,dst=/data \
    7. --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
    8. portainer/portainer

    创建一个Demo项目

    登录 Gitlab 创建一个 Demo 项目。并导入我们的项目 hyperf-skeleton

    首先创建一个命名空间 test_namespace,然后创建一个镜像仓库 demo,并使用本地仓库。

    然后到我们直接打包用的服务器中,登录阿里云 Docker Registry

    1. usermod -aG docker gitlab-runner
    2. su gitlab-runner
    3. docker login --username=your_name registry.cn-shanghai.aliyuncs.com
    1. variables:
    2. PROJECT_NAME: demo
    3. REGISTRY_URL: registry.cn-shanghai.aliyuncs.com/test_namespace

    还有 deploy.test.yml,需要仔细对比以下文件哦。

    然后在我们的 portainer 中,创建对应的 Config demo_v1.0。当然,以下参数需要根据实际情况调整,因为我们的Demo中,没有任何IO操作,所以填默认的即可。

    1. APP_NAME=demo
    2. DB_DRIVER=mysql
    3. DB_HOST=localhost
    4. DB_PORT=3306
    5. DB_DATABASE=hyperf
    6. DB_PASSWORD=
    7. DB_CHARSET=utf8mb4
    8. DB_COLLATION=utf8mb4_unicode_ci
    9. DB_PREFIX=
    10. REDIS_HOST=localhost
    11. REDIS_AUTH=
    12. REDIS_PORT=6379
    13. REDIS_DB=0

    因为我们配置的 gitlab-ci.yml 会检测 test 分支和 tags,所以我们把修改的内容合并到test分支,然后推到gitlab上。

    接下来我们就可以访问集群任意一台机器的 9501 端口。进行测试了

    1. curl http://127.0.0.1:9501/

    安装 KONG 网关

    通常情况下,Swarm集群是不会直接对外的,所以我们这里推荐使用 KONG 作为网关。还有另外一个原因,那就是 SwarmIngress网络 设计上有缺陷,所以在连接不复用的情况下,会有并发瓶颈,具体请查看对应 Issue #35082KONG 作为网关,默认情况下就会复用后端的连接,所以会极大减缓上述问题。

    安装数据库

    1. docker run -d --name kong-database \
    2. --network=default-network \
    3. -p 5432:5432 \
    4. -e "POSTGRES_USER=kong" \
    5. -e "POSTGRES_DB=kong" \
    6. postgres:9.6

    安装网关

    初始化数据库

    1. docker run --rm \
    2. -e "KONG_DATABASE=postgres" \
    3. -e "KONG_PG_HOST=kong-database" \
    4. -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
    5. kong:latest kong migrations bootstrap

    启动

    1. docker run -d --name kong \
    2. --network=default-network \
    3. -e "KONG_DATABASE=postgres" \
    4. -e "KONG_PG_HOST=kong-database" \
    5. -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
    6. -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
    7. -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
    8. -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
    9. -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
    10. -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
    11. -p 8000:8000 \
    12. -p 8443:8443 \
    13. -p 8001:8001 \
    14. -p 8444:8444 \
    15. kong:latest
    1. docker run --rm --network=default-network -p 8080:8080 -d --name kong-dashboard pgbi/kong-dashboard start \
    2. --kong-url http://kong:8001 \
    3. --basic-auth user1=password1 user2=password2

    配置

    接下来只需要把部署 KONG 的机器 IP 对外,然后配置 Service 即可。如果机器直接对外,最好只开放 80 443 端口,然后把 Kong 容器的 80008443 映射到 80443 上。当然,如果使用了 SLB 等负载均衡,就直接通过负载均衡,把 80443 映射到 KONG 所在几台机器的 8000 8443 上。

    如何使用 Linux Crontab

    1. #!/usr/bin/env bash
    2. basepath=$(cd `dirname $0`; pwd)
    3. docker pull registry-vpc.cn-shanghai.aliyuncs.com/namespace/project:latest
    4. docker run --rm -i -v $basepath/.env:/opt/www/.env \
    5. /opt/www/bin/hyperf.php your_command

    fatal: git fetch-pack: expected shallow list

    这种情况是 gitlab-runner 使用的 版本过低,更新 git 版本即可。