创建 Docker 类型的 Blocklet
阅读须知:
在 Blocklet Studio 中我们支持了把 docker 镜像创建成 Blocklet 的功能。这个功能目的是希望开发者专心于开发自己独特的创意,市面上已有的开源的功能,可以借助 docker 生态的一些知名库去实现。
下面这篇文章我来描述如何创建一个 WordPress 的 Blocklet。
创建 MySQL Blocklet#
首先,WordPress 的 docker 镜像依赖于 MySQL,所以我们先创建一个 MySQL 的 Blocklet,接下来的 WordPress 会将 MySQL 作为一个 Blocklet 依赖。
我们假定你已经了解如何使用 Blocklet Studio 创建一个普通的 Blocklet,下图我们填写 MySQL 的基本信息:
我们注意到这个 Blocklet 的 DID 是 z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR,后续会用到。
然后在 Content 的栏目中,我们选择 Build Blocklet from Docker:
然后我们点击 Docker Command,粘贴 MySQL 的 docker run 命令:
图中完整的命令是:
docker run \
--name mysql
--publish 1333:3306 \
--volume $BLOCKLET_DATA_DIR/mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD="$BLOCKLET_AUTOMATIC_ENV_VALUE" \
-e MYSQL_DATABASE="blocklet" \
-e MYSQL_USER="blocklet" \
-e MYSQL_PASSWORD="$BLOCKLET_AUTOMATIC_ENV_VALUE" \
mysql:8.4.3
我们再回到 Docker Params,我们能看到自动解析了 docker run 的命令:
我们可以看到 --name 有红色错误,这是因为 blocklet server 会自动管理 docker 运行过程的 name,用于划分网络隔离和内网请求,所以不允许设置。同样的还有许多 docker 参数现在是不允许设置的,这是为了确保每个 docker blocklet 运行过程中不会对宿主机的安全造成风险,所有不允许设置的 docker 参数解析后都会有红色的警告。
我们删除 --name 就可以发布了。但是为了让用户安装这个 MySQL Blocklet 更简单,我们可以做一些设置:
设置1:--publish 改成 docker 类型,--publish 参数是把 docker 内的端口公布到数组机,这里不需要担心端口占用,Blocklet Server 会自动重新分配端口。而 --publish(web) 类型表示这个端口是需要 Blocklet Server 分配一个 Mount Point 去进行访问的,MySQL 显然不需要直接访问,所以我们把它改成 docker 类型
设置2: --env MYSQL_ROOT_PASSWORD 和 --env MYSQL_PASSWORD 我们可以有两种设计,一种是设计成必填,这样用户首次安装这个 Blocklet 时就会要求用户去设置。另一种方案是设置成自动生成。
我们这里把他改成自动生成,自动生成的逻辑是当用户运行这个 Blocklet 时,我们会根据当前运行应用的私钥派发一个密码,这个密码是对于不同的应用是不一样的,对于相同的应用是永久固定的。我们暂时还没提供查询这个自动生成密码的功能,未来会提供。
为了用户安装简单,我们把它们设置成自动生成:
MySQL 的最终的配置:
解释一下上图的设置:
- --publish 1333:3306: 我们把 WordPress Docker 容器内的 3306 端口开放给了 Blocklet Server,因为它不是 Web 类型的,所以 Blocklet Server 不会分配一个 Mount Point 给这个 Blocklet
- --volume $BLOCKLET_DATA_DIR...: 表示把 Docker 容器内需要持久化的目录放到了 Blocklet data 目录,这里的 $BLOCKLET_DATA_DIR 会自动添加,并且只能放到这个目录的后续目录中
- --env MYSQL_ROOT_PASSWORD: 设置了这个密码会在 Blocklet 启动时自动生成
- --env MYSQL_MYSQL_UESR:设置了数据库默认 Dababase
- --env MYSQL_MYSQL_UESR:设置了数据库用户名
- --env MYSQL_PASSWORD: 设置了这个密码会在 Blocklet 启动时自动生成
很简单我们就创建好 MySQL 的 Blocklet 了。
接下来我们把 MySQL 上传到 Test Store、发布、安装到当前这个应用中,一会作为 WordPress 依赖。
创建 WordPress Blocklet#
假定你已经安装好了刚刚发布的 MySQL Blocklet,我们开始创建 WordPress Blocklet。
同样的,我们填写好 WordPress 的基本信息:
然后我们同样打开 Content 标签,点击 Docker Command,粘贴 WordPress 的 docker run 命令:
图中完整的命令是:
docker run \
--publish 8080:80 \
--volume $BLOCKLET_DATA_DIR/wordpress-files:/var/www/html \
-e WORDPRESS_DB_HOST="z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR-host" \
-e WORDPRESS_DB_USER="z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR-env.MYSQL_USER" \
-e WORDPRESS_DB_PASSWORD="z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR-env.MYSQL_PASSWORD" \
-e WORDPRESS_DB_NAME="z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR-env.MYSQL_DATABASE" \
wordpress
这里我需要解释一下这些信息, 他看起来有点复杂,这是因为我们需要把未来要安装的 MySQL 作为 WordPress 的数据进行关联。
WordPress 需要设置 DB 的 Host,这里我们输入刚刚创建的 MySQL 的 DID
+ -host
表示是某个 Blocklet 运行后的 Host:
-e WORDPRESS_DB_HOST="z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR-host"
WordPress 需要设置 DB User, DB Password, DB Name,这里我们输入刚刚创建的 MySQL 的 DID
+ -env.
+ 环境变量的 Key
表示是某个 Blocklet 运行后的某个环境变量的的值。
-e WORDPRESS_DB_USER="z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR-env.MYSQL_USER" \
-e WORDPRESS_DB_PASSWORD="z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR-env.MYSQL_PASSWORD" \
-e WORDPRESS_DB_NAME="z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR-env.MYSQL_DATABASE" \
如上面的设置,实际上做的事情是:
- DB_USER 绑定到 MySQL 的 MYSQL_USER 的 env
- DB_PASSWORD 绑定到 MySQL 的 MYSQL_PASSWORD 的 env
- DB_NAME 绑定到 MySQL 的 MYSQL_DATABASE 的 env
这个组合过程是一种约定,未来如果有更多的开发者用户使用这些功能,我们会设计更图形化的配置方案。
我们切换回 Docker Params ,我们可以看到已经自动识别并且设置好了:
同时,因为 WordPress 是需要有自己的 Mount Point 的,所以我们对 --publish 的类型设置为 Web(上文 MySQL 的 --publish 中有做解释)。
最后再解释一下上图的设置:
- --publish(web) 8080:80 : 我们把 WordPress Docker 容器内的 80 端口开放给了 Blocklet Server,并且因为它是 Web 类型的,所以 Blocklet Server 会分配一个 Mount Point 给这个 Blocklet
- --volume $BLOCKLET_DATA_DIR/wordpress-files:/var/www/html : 表示把 Docker 容器内需要持久化的目录放到了 Blocklet data 目录,这里的 $BLOCKLET_DATA_DIR 会自动添加,并且只能放到这个目录的后续目录中
- --env WORDPRESS_DB_HOST: 这是 WordPress 设置数据库 host 的环境变量,我们已经关联到一个 DID 为 z2qa25mcpadrUTrhPNeTDW91KLAdo5v4xHGgR(就是刚刚的 MySQL) 的某个环境变量上。
- 其他 --env 都是一个逻辑
然后在 Blocklets 标签中把 MySQL 设置成 WordPress 的依赖,这样安装 WordPress 时就会自动安装 MySQL:
一切设置好,我们就可以发布 WordPress 了。发布的方式和普通 Blocklet 雷同。
最后我们也提供这个上述设置的 WordPress 的 Test Store 地址,您可以安装试试看:
注意,安装 Docker 类型的 Blocklet 需要您的 Blocklet Server 启用了 Docker 模式和网络隔离: