Docker方式部署CloudIaC平台

  1. 第一步,安装Docker和Docker Compose
  2. 第二步,创建部署目录
  3. 第三步,编写docker-compose.yml文件
  4. 第四步,编写.env文件
  5. 第五步,启动docker-compose

CloudIaC是一个开源的基于IaC理念的云管平台,关于它的详细介绍参考CloudIaC文档中心,本文不再赘述。

其实关于CloudIaC的容器化部署实现,官方文档也由详尽描述,但是我在部署时遇到一些小小的问题,故整理成随笔便于以后查阅参考。

第一步,安装Docker和Docker Compose

详细步骤参考:Docker实践之01-入门介绍Docker进阶之01-Docker Compose编排工具

如果在执行docker-compose up时报错:Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout,则需要为Docker配置镜像加速器,参考:配置镜像加速器

第二步,创建部署目录

$ mkdir -p /usr/yunji/cloudiac/var/{consul,mysql} && cd /usr/yunji/cloudiac/
language-bash复制代码
  • 1

部署目录固定为/usr/yunji/cloudiac,不可更改,更改部署目录会导致执行部署任务失败。

第三步,编写docker-compose.yml文件

文件路径/usr/yunji/cloudiac/docker-compose.yml,内容如下:

# auto-replace-from: docker/docker-compose.yml
version: "3.2"
services:
  iac-portal:
    container_name: iac-portal
    image: "${DOCKER_REGISTRY}cloudiac/iac-portal:v0.9.4"
    volumes:
      - type: bind
        source: /usr/yunji/cloudiac/var
        target: /usr/yunji/cloudiac/var
      - type: bind
        source: /usr/yunji/cloudiac/.env
        target: /usr/yunji/cloudiac/.env
    ports:
      - "9030:9030"
    depends_on:
      - mysql
      - consul
    restart: always

  ct-runner:
    container_name: ct-runner
    image: "${DOCKER_REGISTRY}cloudiac/ct-runner:v0.9.4"
    volumes:
      - type: bind
        source: /usr/yunji/cloudiac/var
        target: /usr/yunji/cloudiac/var
      - type: bind
        source: /usr/yunji/cloudiac/.env
        target: /usr/yunji/cloudiac/.env
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
    ports:
      - "19030:19030"
    depends_on:
      - consul
    restart: always

  iac-web:
    container_name: iac-web
    image: "${DOCKER_REGISTRY}cloudiac/iac-web:v0.9.4"
    ports:
      - 80:80
    restart: always
    depends_on:
      - iac-portal

  mysql:
    container_name: mysql
    image: "mysql:8.0"
    command: [
        "--character-set-server=utf8mb4",
        "--collation-server=utf8mb4_unicode_ci",
        "--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
    ]
    volumes:
      - type: bind
        source: /usr/yunji/cloudiac/var/mysql
        target: /var/lib/mysql
    environment:
      - MYSQL_RANDOM_ROOT_PASSWORD=yes
      - MYSQL_USER
      - MYSQL_PASSWORD
      - MYSQL_DATABASE
    restart: always

  consul:
    container_name: consul
    image: "consul:latest"
    volumes:
      - type: bind
        source: /usr/yunji/cloudiac/var/consul
        target: /consul/data
    ports:
      - "8500:8500"
    command: >
      consul agent -server -bootstrap-expect=1 -ui -bind=0.0.0.0
      -client=0.0.0.0 -enable-script-checks=true -data-dir=/consul/data
    restart: always
language-yaml复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

注意: 需要将consul镜像的版本从consul:latest修改为具体的版本,比如:consul:1.15.4,如果不修改在拉取consul进行时会报错:

Error response from daemon: manifest for consul:latest not found: manifest unknown: manifest unknown
language-bash复制代码
  • 1

这是因为在DockerHub上确实没有标签为latest的consul镜像。

第四步,编写.env文件

文件路径/usr/yunji/cloudiac/.env,内容如下(请根据注释修改配置):

# auto-replace-from: configs/dotenv.sample
# 平台管理员账号密码(均为必填)
# 该账号密码只在系统初始化时使用,后续修改不影响己创建的账号
IAC_ADMIN_EMAIL="admin@example.com"
# 密码要求长度大于 8 且包含字母、数字、特殊字符
IAC_ADMIN_PASSWORD=""

# 加密密钥配置(必填)
# 敏感数据使用该密钥进行加密
SECRET_KEY=""

# IaC 对外提供服务的地址(必填), 示例: http://cloudiac.example.com
# 该地址需要带协议(http/https),结尾不可以加 "/"
PORTAL_ADDRESS=""

# consul 地址(必填),示例: private.host.ip:8500
# 需要配置为机器的内网 ip:port,不可使用 127.0.0.1
CONSUL_ADDRESS=""

# cloudiac registry 服务地址(选填),示例:http://registry.cloudiac.org
REGISTRY_ADDRESS=""

# 使用 https 向外(比如runner)发送请求的时候是否允许使用不安全证书
HTTP_CLIENT_INSECURE=false

# mysql 配置(必填)
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_DATABASE=cloudiac
MYSQL_USER=cloudiac
MYSQL_PASSWORD="mysqlpass"

# portal 服务注册信息配置 (均为必填)
## portal 服务的 IP 地址, 容器化部署时无需修改, 手动部署时配置为内网 IP
SERVICE_IP=iac-portal
## portal 服务注册的 id(需要保证唯一)
SERVICE_ID=iac-portal-01
## portal 服务注册的 tags
SERVICE_TAGS="iac-portal;portal-01"

# docker reigstry 地址,默认为空(使用 docker hub)
DOCKER_REGISTRY=""

# logger 配置
LOG_DEVEL="info"

# SMTP 配置(该配置只影响邮件通知的发送,不配置不影响其他功能)
SMTP_ADDRESS=smtp.example.com:25
SMTP_USERNAME=user@example.com
SMTP_PASSWORD=""
SMTP_FROM_NAME=IaC
SMTP_FROM=support@example.com

# KAFKA配置,配置后每次执行部署任务都会将环境的最新全量资源详情通过 kafka 消息发送
KAFKA_DISABLED=false
KAFKA_TOPIC="IAC_TASK_REPLY"
KAFKA_GROUP_ID=""
KAFKA_PARTITION=0
## example: KAFKA_BROKERS: ["kafka.example.com:9092", "..."]
KAFKA_BROKERS=[]
KAFKA_SASL_USERNAME=""
KAFKA_SASL_PASSWORD=""

######### 以下为 runner 配置 #############
# runner 服务注册配置(均为必填)
## runner 服务的 IP 地址, 容器化部署时无需修改, 手动部署时配置为内网 IP
RUNNER_SERVICE_IP=ct-runner
## runner 服务注册的 id(需要保证唯一)
RUNNER_SERVICE_ID=ct-runner-01
RUNNER_SERVICE_TAGS="ct-runner;runner-01"

## 是否开启 offline mode,默认为 false
RUNNER_OFFLINE_MODE="false"
language-bash复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

必须修改的参数由如下4个,其他的参数可以保持默认:

  • IAC_ADMIN_PASSWORD,如:IAC_ADMIN_PASSWORD="!@34rewq"
  • SECRET_KEY,如:SECRET_KEY="5416d7cd6ef195a0f7622a9c56b55e84"
  • PORTAL_ADDRESS,如:PORTAL_ADDRESS="http://192.168.3.134"192.168.3.134为部署CloudIaC的虚拟机IP地址
  • CONSUL_ADDRESS,如:CONSUL_ADDRESS="192.168.3.134:8500"192.168.3.134为部署CloudIaC的虚拟机IP地址

通过.env可以配置大部分参数,需要更详细的配置可以拷贝镜像里的config-portal.ymlconfig-runner.yml文件,修改后再挂载到容器中进行替换。

第五步,启动docker-compose

可以先执行前台启动,观察是否成功:dokcker-compose up
执行后台启动:docker-compose up -d

最后执行docker-compose ps查看所有服务的状态,当所有服务的状态均为Up时表示整个CloudIaC系统部署完成。

$ docker-compose ps
NAME         IMAGE                        COMMAND                                                                                                                                                                                     SERVICE      CREATED          STATUS          PORTS
consul       consul:1.15.4                "docker-entrypoint.sh consul agent -server -bootstrap-expect=1 -ui -bind=0.0.0.0 -client=0.0.0.0 -enable-script-checks=true -data-dir=/consul/data"                                         consul       31 minutes ago   Up 31 minutes   8300-8302/tcp, 8301-8302/udp, 8600/tcp, 8600/udp, 0.0.0.0:8500->8500/tcp, :::8500->8500/tcp
ct-runner    cloudiac/ct-runner:v0.9.4    "/bin/sh -c ./ct-runner"                                                                                                                                                                    ct-runner    31 minutes ago   Up 30 minutes   0.0.0.0:19030->19030/tcp, :::19030->19030/tcp
iac-portal   cloudiac/iac-portal:v0.9.4   "/bin/sh -c ./iac-portal"                                                                                                                                                                   iac-portal   31 minutes ago   Up 30 minutes   0.0.0.0:9030->9030/tcp, :::9030->9030/tcp
iac-web      cloudiac/iac-web:v0.9.4      "/docker-entrypoint.sh nginx -g 'daemon off;'"                                                                                                                                              iac-web      31 minutes ago   Up 30 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp
mysql        mysql:8.0                    "docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"   mysql        31 minutes ago   Up 31 minutes   3306/tcp, 33060/tcp
language-bash复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

【参考】
CloudIaC文档中心


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,在下面评论区告诉我^_^^_^

未找到相关的 Issues 进行评论

请联系 @nuccch 初始化创建