镜像仓库¶
公共镜像查看¶
平台左侧导航栏中点击 镜像中心
\(\rightarrow\) 镜像仓库
,进入公共镜像查看界面,如下图:
点击镜像可查看镜像 Dockerfile、镜像 URL、使用说明、描述信息、所属用户和创建时间,如下图:
镜像运行¶
警告
该方式仅用于镜像试运行, 不推荐 通过这种方式使用镜像。建议 将镜像编辑为星光应用,既可避免重复设置入口脚本,又可为镜像运行提供更多自定义参数设置。
点击上图中的 “提交作业” 按钮,可将镜像作为 runner 应用的基础镜像提交作业进行试运行。
备注
runner 应用是平台提供的,仅用于镜像试运行的应用。其设置了一个默认的 入口脚本 "/app/entrypoints/runfile-with-option.sh" 用于启动 webssh 服务,并将其作为镜像的 CMD
。
如下图:
小技巧
由于 runner 设置的入口脚本会覆盖镜像本身的 CMD
,若希望镜像本身的 CMD
能够正常执行,请打开 高级
配置模式,设置 镜像启动入口 以覆盖应用默认入口脚本。
镜像管理¶
平台左侧导航栏中点击 镜像中心
\(\rightarrow\) 镜像管理
,若用户没有镜像仓库,会有 申请开通
按钮,点击按钮即可开通镜像仓库,如下图:
若已有镜像仓库,将进入镜像管理界面,如下图:
在镜像管理界面中可以根据镜像名称、访问级别(公开 / 私有)、构建状态进行筛选。
对镜像列表中的每一项,可以查看镜像名称、完整镜像名、构建状态、大小、访问级别、描述信息、创建时间;
操作列中的五个按钮分别用于:
查看/更换镜像图标
查看构建脚本
查看镜像构建日志
删除镜像
将镜像作为基础镜像提交作业
镜像构建¶
在镜像管理界面,点击 + 构建
按钮,弹出镜像构建界面,如下图:
在镜像构建界面中,填写镜像名称、描述信息、构建方式(镜像 URL / tar 压缩包)、镜像图标,点击 确定
按钮,即可构建镜像。
备注
构建方式选择通过 “tar包” 构建时,所需的 tar 压缩包由用户自行上传(参考 数据管理)。
tar 压缩包需要通过 docker save -o [tar_name].tar [image_name] 命令生成,可参考 Create a backup that can then be used with docker load。
对于一个已有的镜像 tar 包,需要本地通过 docker load -i [tar_name].tar 命令验证是否能正确加载镜像,若能正确加载,则可以上传到平台进行镜像构建,可参考 Load images from a file (--input)。
镜像使用¶
通过星光构建的镜像仅允许以星光用户身份使用容器,因此制作、使用的镜像需要确保以星光用户身份能正常使用容器镜像。
确保以星光用户 uid 和 gid 启动容器可以正常使用¶
在打包镜像前,需要确保本地运行
docker run -it -u [uid] -g [gid] [image] /bin/bash
进入容器后,能够正常使用。
备注
其中 uid
和 gid
可以从 “存储管理” 页面中文件的属主获得,前面的数字是 uid
,后面的数字是 gid
,如下图用户的 uid
是 1xxx3, gid
是 9xxx5:
容器内星光用户身份 uid
gid
能够使用到容器内软件的前提是:
星光用户身份终端环境正确设置了
PATH
、LD_LIBRARY_PATH
等环境变量;星光用户身份具备软件及其相关文件的可读和可执行权限。
若无法正常使用,一般是没有满足以上两个前提。
星光用户身份环境变量设置¶
星光用户身份的终端环境下 PATH
、 LD_LIBRARY_PATH
等环境变量没有正确设置,相关变量缺乏运行软件所需的执行文件、软件依赖库路径等信息,从而导致以星光用户身份无法运行目标软件。
这些软件运行环境的信息的获取可以参考:
镜像的
ENTRYPOINT
和CMD
指定 user 的
~/.bashrc
和~/.bash_profile
(镜像是指定 user 身份的镜像)
小技巧
镜像 ENTRYPOINT
可通过
docker inspect [镜像名称 | 容器 ID | 容器名称]
查看,从 ENTRYPOINT
中即可查看 CMD
。
以星光用户身份进入容器后,若能成功执行镜像的 CMD
,则镜像能够在星光平台正常使用。
查找到软件及软件包位置后,在星光用户身份下同样加载即可,具体可参考 示例一。
软件读写权限修正¶
更改镜像来赋予软件包对所有用户的可读和可执行权限,步骤如下:
创建一个 Dockerfile 文件,内容如下:
FROM [image] USER root RUN chmod -R 755 /path/to/software
其中
image
是需要修改的镜像,USER root
表示切换到 root 用户,以便执行chmod -R 755 /path/to/software
,即为文件夹赋予可读可执行权限。/path/to/software
可能有多个,可以通过docker run -it -u [uid] -g [gid] [image] /bin/bash
启动容器,以 root 身份进入容器调试。
小技巧
对于正在运行的容器,可以通过
docker exec -it -u root [container] /bin/bash
以 root 身份进入容器进行调试。
在将所有涉及到的文件都赋予可读可执行权限后,且以星光用户身份可以正常使用时,执行
docker build -f Dockerfile -t [new_image_name]
构建新镜像,其中
new_image_name
是生成的新镜像名。
镜像类型¶
用户自己创建的镜像¶
若用户有 docker build
构建镜像基础,建议用户编写 Dockerfile 并以 docker build
的方式创建镜像。此时建议用户在 Dockerfile 中不使用 USER 命令切换用户身份,即以默认 root 身份安装软件,且软件安装路径为默认路径(一般安装在 /usr/bin
、 /lib
等默认位置),此时容器内所有 user 都可以获取并使用这些软件,表现为所有 user 的环境变量 PATH
和 LD_LIBRARY
等都包含软件及软件库的位置,并且软件对所有 user 都有可读和可执行权限。
同时需要 确保以星光用户 uid 和 gid 启动容器可以正常使用。
网络公开镜像¶
网络公开镜像大部分提供 root 身份进入使用,如 docker run -it [image] /bin/bash
进入容器后就是 root。
小部分需要以指定 user 身份进入使用,无论是 docker run -it [image] /bin/bash
进入容器就是默认指定用户,还是 docker run -it -u [user/uid] [image] /bin/bash
进入容器,都属于这一类。
root 镜像¶
大部分情况下,root 镜像的作者会使所有用户身份都可以直接获取到容器内所需软件,表现为所有 user 的环境变量 PATH
和 LD_LIBRARY_PATH
等都包含软件及软件库的位置,并且软件对所有 user 都有可读和可执行权限。
指定 user 身份镜像¶
对于这种镜像,其软件及软件库很可能不在默认 PATH
和 LD_LIBARAY_PATH
位置,而是在指定 user 家目录下。并且软件及软件库也可能没有对所有 user 的可读和可执行权限,而仅对指定 user 可读可执行。
不管何种类型的镜像,都需要 确保以星光用户 uid 和 gid 启动容器可以正常使用。
若遇到在星光用户身份下 PATH
和 LD_LIBRARY_PATH
未设置导致找不到软件及软件包位置问题和软件没有读和执行权限的问题,可以参考 星光用户身份环境变量设置 和 软件读写权限修正。
警告
星光会将一些公共软件挂载到容器的 /app
目录中,因此在制作镜像时,不要在镜像中创建 /app
目录并在其中存放文件,以免被星光挂载的 /app
覆盖。
用户镜像配额¶
在 镜像管理
页面点击 用户镜像配额
即可查看用户镜像仓库使用情况,如下图:
若用户需要调整镜像配额,可点击 申请调整
按钮发起 “申请调整镜像仓库配额” 审批。
租户镜像配额¶
除用户镜像配额外,用户的镜像仓库容量还受租户镜像配额限制,同一个租户内的所有用户共用一个配额。在 镜像管理
页面点击 租户镜像配额
即可查看租户镜像仓库使用情况,如下图:
若租户镜像仓库配额已满,即使用户镜像配额仍有余裕,用户也无法再构建新镜像。
如有需要,请 租户管理员 联系经办人调整租户镜像配额。
附录¶
示例一¶
以 dafoam/opt-packages:v3.1.1 镜像为例演示如何正确设置 PATH
、 LD_LIBRARY_PATH
等环境变量以使镜像能够在星光平台正常使用。
从 DAFoam 官网 可知, DAFoam 镜像要求以 dafoamuser 用户身份运行,若直接在星光平台运行,由于平台是以星光用户身份运行镜像,将因缺少环境变量而无法正常使用 python 等软件。
拉取镜像
在本地通过
docker pull dafoam/opt-packages:v3.1.1
下载 DAFoam 镜像。
检查镜像
ENTRYPOINT
和CMD
通过
docker inspect dafoam/opt-packages:v3.1.1
查看镜像的详细信息
可以看到镜像的
ENTRYPOINT
和CMD
均为空。检查镜像
~/.bashrc
文件由于镜像要求以 dafoamuser 用户身份运行,且并未设置有
ENTRYPOINT
和CMD
,则执行的应该是 dafoamuser 的 .bashrc。以 dafoamuser 身份运行 DAFoam 镜像
docker run -it --u dafoamuser dafoam/opt-packages:v3.1.1 bash
然后通过
cat ~/.bashrc
检查
~/.bashrc
文件可以看到文件最后一行是比较特别的。
查看 “/home/dafoamuser/dafoam/loadDAFoam.sh” 文件
可以看到该脚本的作用为设置环境变量,说明 python 等软件全部在镜像中。
那么之所以在星光平台运行时无法使用,就是由于以星光用户身份运行时,缺少对相关环境变量的设置。
尝试执行
source /home/dafoamuser/dafoam/loadDAFoam.sh
可以看到成功设置环境变量后即可正常使用软件
构建镜像并编辑为应用
在本地调试完成后,通过
docker save -o [tar_name].tar [image_name]
将镜像打包为 tar 包,而后通过星光平台的 镜像构建 功能将 tar 包构建为星光镜像。
最后通过 应用编辑 功能创建一个星光应用以使用该镜像。
示例二¶
以 tomcat 镜像为例演示如何正确设置软件及其相关文件的可读和可执行权限以使镜像能够在星光平台正常使用。
拉取镜像
在本地通过
docker pull tomcat
下载 tomcat 镜像。
确认镜像在未以星光用户身份启动时可正常运行
通过
docker run -d -p 8088:8080 tomcat
启动 tomcat 服务。
备注
-d 后台运行,-p 端口映射( 8088 为本机 ip 访问端口 : 8080 为 docker 容器内部端口)
浏览器访问 “http://localhost:8088” 测试 tomcat 是否正常启动
出现此页面说明 tomcat 启动成功。
但是由于 tomcat 的 docker 镜像做了修改,将原本位于 webapps 文件夹下的文件都移动到 webapps.dist 文件夹下面,导致页面 404。
使用
docker ps
查看容器列表
使用
docker exec -it [容器 ID] bash
进入容器
在容器内执行
cp -r webapps.dist/* webapps
将 webapps.dist 文件夹下的文件拷贝回 webapps 文件夹下,等待 30s 左右再刷新浏览器,则可正常访问页面
最后退出容器并将调整过的 tomcat 容器保存为新镜像,以免下次使用的时候需要重新调整(这里将新镜像命名为 tomcat:origin ,下文将以该镜像为基础进行调试)
docker commit [容器 ID] [镜像名称]
确保镜像以星光用户身份启动时仍可正常运行
将正在运行的 tomcat 容器关闭,避免端口重复
docker stop [容器 ID]
以星光用户身份启动调整过的新镜像
docker run -it -p 8088:8080 -u [uid] -g [gid] [镜像名称] # 新版本的 docker 指定 gid 的方式有所改变 docker run -it -p 8088:8080 -u [uid]:[gid] [镜像名称]
可以看到镜像运行出现问题。
浏览器访问 “http://localhost:8088” 也出现错误。
从镜像运行的报错信息中可以看出,容器试图在执行目录 “/usr/local/tomcat” 下创建工作目录失败。
查看文件信息可知 “/usr/local/tomcat” 的属主为 root 用户,星光用户身份缺少相关权限。将执行目录属主修改为星光用户即可解决该问题:
新建 dockerfile 文件,可命名为 tomcat.Dockerfile
FROM tomcat:origin # 要更改执行目录属主的目标镜像 USER root RUN chown -R [uid]:[gid] /usr/local/tomcat # 属主改为星光用户身份
小心
dockerfile 文件中请务必将注释信息删除!
根据 dockerfile 文件构建镜像
docker build -f tomcat.dockerfile -t [新构建的镜像名称] .
构建成功后再次以星光用户身份运行新构建的镜像,则可正常运行。
构建镜像并编辑为应用
将根据 dockerfile 文件新构建的镜像打包为 tar 包
docker save -o [tar 包名称] [目标镜像名称]
而后通过星光平台的 镜像构建 功能将 tar 包构建为星光镜像。
最后通过 应用编辑 功能创建一个星光应用以使用该镜像。
小技巧
tomcat 镜像本身已对 8080 端口做了监听,只需添加一个目的端口为 8080 的 http 协议的访问入口即可直接访问。