• [问题求助] 【openEuler 容器镜像】使用openEuler基础镜像编译镜像出错
    使用openEuler基础镜像编译镜像出错。Dockerfile如下:FROM openeuler:20.03-lts-sp1 COPY my_exec_bin / RUN chmod +x /my_exec_bin ENTRYPOINT ["/my_exec_bin"]编译命令为:docker build -t "openeuler/my_exec_binmy_exec_bin:1.0.0" .报错:OCI runtime create failed: container_linux.go:318: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown
  • [硬件整机] 【mdc300F产品】【部署功能】mdc300F跑的程序能用docker部署吗?
    【功能模块】【操作步骤&问题现象】我司用了大量的mdc300F设备,但是不同设备的环境有稍微差别,为了软件部署的方便与稳定,想采用容器化部署方式,将环境与代码一起打包,请问可以实现吗?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 【云原生】Docker部署数据库的持久化
    在上一篇基于docker的安装中,我们使用enmotech的最新镜像完成了安装和启动。容器部署非常方便,卸载更是简单。但是这个特点如同一柄双刃剑,带来便利的同时,也会有一些缺点。容器一旦删除,容器内的所有数据和配置都会丢失。即使重新运行一个新的容器,得到的不过是一个崭新的初始状态的数据库。所以,对于数据库这种需要持久化的数据来说,还需要看下如何才能防止因为容器的删除或损坏导致数据的丢失。在openGauss数据库中,通过指定相关参数来实现此功能。数据库持久化启动我们本次持久化测试的环境基于上一篇在docker部署openGauss。我们先把上次启动的容器实例删掉。[root@pekphisprb70593 docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 573ea1edffb8 enmotech/opengauss:3.0.0 "entrypoint.sh gauss…" 3 days ago Up 3 days 5432/tcp opengauss [root@pekphisprb70593 docker]# docker stop 573ea1edffb8 573ea1edffb8 [root@pekphisprb70593 docker]# docker rm 573ea1edffb8 573ea1edffb8以下命令使用原opengauss镜像启动一个容器:docker run --name opengauss --privileged=true -d -e GS_PASSWORD=Enmo@123 -v /enmotech/opengauss:/var/lib/opengauss -p 15432:5432 enmotech/opengauss:3.0.0其余参数的解释可以参考上一篇安装。这里我们主要关注下 -p   -v两个参数。-p参数:openGauss的默认侦听启动在容器内的5432端口上,如果想要从容器外部访问数据库,则需要在docker run的时候指定-p参数。比如以上命令将允许使用15432端口在容器外访问数据库。上述命令正常启动容器数据库之后,可以通过外部的gsql进行数据库访问。-v 参数:指定Docker中openGauss的所有数据文件,容器内是/var/lib/opengauss目录 ,宿主机是/enmotech/opengauss目录。如果宿主机的/enmotech/opengauss如果不存在,docker会自动创建,但是必须是绝对路径。Docker对其拥有读写权限。在容器内部查看数据库目录。如下图,已在容器内/var/lib/opengauss创建了data目录。[root@pekphisprb70593 docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 89747134cd4d enmotech/opengauss:3.0.0 "entrypoint.sh gauss…" About a minute ago Up About a minute 0.0.0.0:15432->5432/tcp, :::15432->5432/tcp opengauss [root@pekphisprb70593 docker]# docker exec -it 89747134cd4d /bin/bash root@89747134cd4d:/# cd /var/lib/opengauss/data/ root@89747134cd4d:/var/lib/opengauss/data# ls asp_data gs_gazelle.conf pg_audit pg_errorinfo pg_location pg_notify pg_snapshots PG_VERSION postmaster.opts undo base gs_profile pg_clog pg_hba.conf pg_log pg_perf pg_stat_tmp pg_xlog postmaster.pid gaussdb.state gswlm_userinfo.cfg pg_csnlog pg_ident.conf pg_logical pg_replslot pg_tblspc postgresql.conf postmaster.pid.lock global mot.conf pg_ctl.lock pg_llog pg_multixact pg_serial pg_twophase postgresql.conf.lock sql_monitor 我们在宿主机上查看下数据库目录。如下图,已在宿主机上/enmotech/opengauss创建了data目录。可以看到容器中的数据已存储到操作系统中。数据持久化验证下面我们通过建表、插入数据查看是否可以完成数据的持久化存储。进入容器,登录数据库。[root@pekphisprb70593 docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 89747134cd4d enmotech/opengauss:3.0.0 "entrypoint.sh gauss…" About a minute ago Up About a minute 0.0.0.0:15432->5432/tcp, :::15432->5432/tcp opengauss [root@pekphisprb70593 docker]# docker exec -it 89747134cd4d /bin/bash root@89747134cd4d:/var/lib/opengauss/data# su - omm omm@89747134cd4d:~$ gsql omm=# 是个新的数据库实例,看下我之前安装时测试创建的用户wxx在不。不出所料,就是不存在的。因为之前操作的时候并没有进行持久化的启动。创建表test1,然后插入数据。create table test1(id int,name varchar(20)); INSERT INTO test1 VALUES (1, 'oligei');关闭数据库。omm@89747134cd4d:~$ gs_ctl stop -D /var/lib/opengauss/data/ [2022-07-19 02:46:25.253][423][][gs_ctl]: gs_ctl stopped ,datadir is /var/lib/opengauss/data waiting for server to shut down....[root@pekphisprb70593 docker]#启动数据库。[root@pekphisprb70593 docker]# docker start 89747134cd4d 89747134cd4d [root@pekphisprb70593 docker]# docker exec -it 89747134cd4d /bin/bash root@89747134cd4d:/# su - omm omm@89747134cd4d:~$ gsql验证一下容器重启后,原来的数据还在。只是重启的话,那数据没丢一点都不意外。我们更多关注的是容器删除这种情况。[root@pekphisprb70593 docker]# docker stop 89747134cd4d 89747134cd4d [root@pekphisprb70593 docker]# docker rm 89747134cd4d 89747134cd4d [root@pekphisprb70593 docker]# docker exec -it 89747134cd4d /bin/bash Error: No such container: 89747134cd4d可以看到原容器已删除成功。现在重新启动,看下是否持久化成功。这里还是需要使用之前指定的存储路径的。[root@pekphisprb70593 docker]# docker run --name opengauss --privileged=true -d -e GS_PASSWORD=Enmo@123 -v /enmotech/opengauss:/var/lib/opengauss -p 15432:5432 enmotech/opengauss:3.0.0 [root@pekphisprb70593 docker]# docker ps [root@pekphisprb70593 docker]# docker exec -it 74b94a7bda80 /bin/bash root@74b94a7bda80:/# su - omm omm@74b94a7bda80:~$ gsql omm=# select * from test1;结果上个图。由上图也可以看出,原来的表记录依然存在,数据库持久化成功。
  • [容器专区] AR502H-CN【docker容器安装和运行】安装失败
    【功能模块】希望在设备上运行边缘计算程序neuron。该程序dockers运行方式如下docker run -d --name neuron -p 7000:7000 -p 7001:7001 --privileged=true --restart=always neugates/neuron:2.1.0【操作步骤&问题现象】1、新建Ubuntu虚拟机,拉取neuron镜像并保存到本地     docker save -o neuron.tar neugates/neuron:2.1.02、基于neuron.tar 制作ova包:     ./create-ova -t docker -di /u03/neuron.tar -dt tar  -dc ./bin/sh -tl neuron -o /u03/3:上传neuron.ova镜像至设备文件夹/mnt/internal_storage4:安装容器:container install neuron01 neuron.ova5:运行失败【截图信息】【日志信息】(可选,上传日志内容或者附件)    收集的日志信息见附件。Jul 21 11:54:32 huawei VM[2861]: [LOG][INFO][DOCKER] parse start response code: 400, data: OCI runtime create failed: container_linux.go:318: starting container process caused "exec: \"./bin/sh\": stat ./bin/sh: no such file or directory": unknown.
  • [技术干货] 【云原生】使用Docker部署openGauss
    Docker是一个开源的应用容器引擎,让开发者可以把应用及依赖包打包到一个可移植的容器中,然后发布到流行的Linux或Windows机器或虚拟机上。openGauss是一款高性能、高安全、高可靠、高智能的企业级开源关系型数据库。openGauss 3.0.0 发布后,云和恩墨制作了docker版本。基于此, 我们可以不需要使用原始安装包和一系列安装配置,可以直接运行docker镜像的版本。本文主要介绍通过Docker安装openGauss 3.0.0,方便DevOps用户的安装、配置和环境设置。1.安装Docker首先准备一台x86_64已安装了CentOS 7.6的服务器。我用的还是上次centos安装时找小伙伴申请的华为云ECS服务器,不过卸载掉了已安装的openGauss。(可选)配置yum源。yum是centos下更新、管理软件的命令,yum源是yum命令去哪里取安装包的地图,yum命令查询yum源也就是repo文件上配置的地址去取相应的rpm包进行安装。常见的yum源:华为云、网易、阿里云等。我使用的是华为云的镜像 https://mirrors.huaweicloud.com/home ,需要先注册。然后按照图片指示和网站描述的步骤和命令进行操作,注意换一下CentOS的版本。执行wget 获取repo的时候,如果执行失败, 可以尝试把https 换成http。如果你可以直接执行 yum search zlib-devel 而没有报错的话就说明无需额外配置,可以直接下一步了。有些公司内无法连接公网的需要自己配置相应的公司内部的yum源。然后下载需要的安装包。yum install -y yum-utils等待下载完成。设置镜像的仓库 。这里我还是使用的是华为云的镜像,然后按照图片指示和网站描述的步骤和命令进行操作,注意根据OS切换页签到Fedora/CentOS/RHEL这里。 PS: 这个也可以是其他网站的源,网上有很多,这里我就不再赘述。这里第2步执行wget 获取repo的时候,如果执行失败, 可以尝试把https 换成http。执行 sudo yum install docker-ce 的时候要根据提示输入y ,等到提示Complete ! 就安装好了。启动Docker,状态为active(running)就OK。systemctl enable docker systemctl start docker systemctl status docker2. 配置Docker设置docker加速。由于国内直接访问docker hub网速很慢,拉取镜像的时间很长。通常我们使用镜像加速或者从国内的一些平台镜像仓库上拉取。创建 /etc/docker/daemon.json 新增内容 。cd /etc/docker/ vi daemon.json配置几条国内的加速地址。我这分别是Docker中国区的、网易的和中国科技大学的。{ "registry-mirrors": [ "https://registry.docker-cn.com", "http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"] }重启docker。systemctl daemon-reload service docker restart执行 docker info 命令查看最后是否有新加的registry-mirrors部分。拉取hello world验证下,如图所示表示成功。docker pull hello-world3 拉取openGauss镜像openGauss 3.0.0 有企业版和轻量版。轻量版定位是在软硬件资源受限场景下仍可使用openGauss,但是保留了企业版大部分的特性,轻量版通过参数默认关闭的特性:Ustore、Asp、增量检查点、双写、列存、段页式存储等,还有些不支持的特性如ORC文件访问、Kerberos安全校验、AI、全密态数据库、CM、OM。工具也进行了精简,保留了用户常用的gsql、gs_ctl、gs_guc、gs_dump、gs_restore等工具,和安装部署、升级的工具liteom。但是对于个人或者实验环境也足够了。前两部稍微繁琐一丢丢,但是配置好了一劳永逸,可以随意拉镜像了。openGauss镜像这里我们用的云和恩墨的镜像。从3.0.0版本开始(包括3.0.0版本)容器使用Lite版安装包,基础镜像的大小进一步降低到100MB以下;默认启动后的空载内存占用小于200MB;在容器内部的操作系统级别添加vi,ps等基础命令。因为3.0.0是最新版本,所以latest就是3.0.0。这里,直接用的指定版本。docker pull enmotech/opengauss:3.0.0执行docker images查看下我们的已有镜像,enmotech/opengauss:3.0.0 也在此列。4. 开启实例镜像拉取后就可以一条命令启动实例。GS_PASSWORD=Enmo@123 可以修改成自己熟悉的密码。docker run --name opengauss --privileged=true -d -e GS_PASSWORD=Enmo@123 enmotech/opengauss:3.0.0GS_PASSWORD:设置openGauss数据库的超级用户omm以及测试用户gaussdb的密码。如果要从容器外部(其它主机或者其它容器)连接则必须要输入密码。GS_NODENAME:数据库节点名称,默认为gaussdb。GS_USERNAME:数据库连接用户名,默认为gaussdb。GS_PORT:数据库端口,默认为5432。除了GS_PASSWORD外都可以使用默认值。若要设定非默认值,和GS_PASSWORD一样使用 -e 设定。进入容器,测试连接[root@pekphisprb70593 dockerfiles]# docker ps --获取CONTAINER ID [root@pekphisprb70593 dockerfiles]# docker exec -it 1d54ee4a5f40 /bin/bash --把这个命令里的 1d54ee4a5f40 修改为实际的ID然后就和在普通服务器一样操作了。openGauss镜像配置了本地信任机制,因此在容器内连接数据库无需密码。root@1d54ee4a5f40:/# su - omm omm@1d54ee4a5f40:~$ gsql使用docker安装确实简单又快捷。5. Q&A.Q:docker 启动实例的时候报错“docker: Error response from daemon: Conflict. The container name "/opengauss" is already in use by container”,但是docker ps又查不到,而且也连不上 ?A:先执行docker ps -a 查看所有进程,看到处于Exited  状态。之前已经启动过opengauss这个名字的实例了,再次执行的话就会报冲突。至于查不到,原因很可能是启动后重启了docker。解决办法有两个,一是创建实例的时候修改实例名,如opengaussNew;二是删除原来的opengauss实例,然后重新启动实例。docker rm 实际的CONTAINER IDQ:如果不需要了,要怎么卸载?A:如果不需要了,就可以不需要卸载啊后处理,直接通过删除容器的方式删除数据库。−删除容器docker ps -a docker rm 实际的CONTAINER ID−删除镜像docker rmi -f 镜像ID
  • [交流吐槽] 第一章-环境配置
    # OpenHarmony 开发环境搭建 ## WSL + VSCode + DevEco 我并没有使用华为官方推荐的 Windows + Ubuntu 虚拟机开发的方式,因为我觉得过于繁琐,索性我就直接用微软的 WSL2 直接安装了 DevEco Device Tool,配合 Windows Terminal 使用,还是很舒服的,但是我不知道为什么华为默认只支持了 Bash,还不能修改默认安装位置?作为有文件洁癖的我的解压了官方安装包,修改了里面的安装脚本,还把默认支持的 Shell 从 `/bin/sh` 改为了 `/usr/bin/zsh`,这样就很舒服了。 然后就是初始化、编译一把梭了,结果出现了以下问题。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035367799215219.png) Google 之后发现,原来是缺少了 [gn](https://github.com/timniederhausen/gn)(GN 是一个用来生成 Ninja 构建文件的工具),没啥好说的,再下载编译一下 gn 就行了。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035387591629965.png) 结果还是报错: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035413732213275.png) 这个问题我就没那么多时间陪你慢慢解决了,索性我直接换用了 Docker。希望华为自己也能优化一下这些工具的配置,简化繁琐的流程,同时也要给予开发者足够的个性化(只支持 Bash 这合适吗?)。 ## Docker 先搜索一下有没有官方镜像,看来是有的,就是可能有点老了。另外需要注意的是它的 tag 不是 `latest`,而是 `0.0.3`。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035428419253135.png) 那就直接 pull 下来就好了,然后直接 run 一下容器就行了,另外还在里面配置了 ssh。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035445682324873.png) 初始化、编译一个项目试试。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20227/17/1658035457066710484.png) OK,看来是没问题了,算是搭建好了吧。
  • [存储类] 【对象存储服务obs】【obsutil报错】在docker中异常: /bin/sh: obsutil:not found
    【功能模块】对象存储服务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文件内容【日志信息】(可选,上传日志内容或者附件)
  • [干货汇总] Docker容器:将带UI的程序直接转为Web应用,so easy
    >摘要:使用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界面,投射到任意的网络目的端。 即: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654132780202343224.png) 其原理是利用X11协议,把界面投射转化为网络协议,到达目的端显示出来。 但是这种方案,有一个硬性要求:就是目的端必须要安装一个“投屏软件(X11 Server)”,比如:VcXsrv 或者 MobaXterm。 那么用户想要看到App的界面,他就得额外安装一个软件,用户体验并不是最佳的。 # 一、VNC方案 Windows的远程桌面,相信大家都用过吧。 VNC就是Linux版的远程桌面。它可以将屏幕,通过网络共享给客户端。 在服务端,安装vncserver。 在客户端,安装vncviewer。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654132793968614741.png) 不过,windows是自带了一个 远程桌面客户端。对VNC的话,用户就得安装一个 vnc-viewer客户端。和X11方案差不多,还是不够方便。 # 二、noVNC方案 好消息是,VNC-Viewer有一个WEB版的客户端,叫做 noVNC。它直接打开网页,就获得VNC-Viewer能力。详见:https://novnc.com/info.html 于是,我们可以将方案拓展为: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654132807363446276.png) 毕竟,浏览器基本上每个客户都会有。这就好比,微信大家都有,所以“单独安装一个App”vs“微信小程序” ,肯定是后者在使用更便捷一样的道理。 所以你可以看到各大云厂商,比如华为云的ECS虚机,也都自带了使用noVNC的方式来展示虚机的界面。可见noVNC的产品化可靠性还是OK的。 # 三、具体操作 这里我为了方便,准备将各种Server都安装到一个Docker容器里面,如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654132825636861204.png) ## 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 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654133028850496244.png) 这里填,第3步咱设置的密码。然后可以看到App的界面啦: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654133039587406619.png) # 四、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-ce镜像不可用
    用的这里的命令,无法成功安装docker给出的链接https://repo.huaweicloud.com/docker-ce/linux/centos/7/aarch64/stable/Packages/containerd.io-1.6.4-3.1.el7.aarch64.rpm下没有对应的文件
  • [其他问题] 【mdc产品】【x86交叉编译功能】提供的x86平台可以做成docker容器
    提供的x86平台可以做成docker容器吗?
  • [技术干货] 华为云云容器引擎CCE使用入门【与云原生的故事】【转载】
    一、创建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远程访问配置详解
    本文主要介绍了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详细步骤
    大家好,本篇文章主要讲的是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容器定时备份数据库并发送到指定邮箱(设计思路)
    这篇文章主要介绍了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
  • [知识分享] 解构华为云HE2E项目中的容器技术应用
    本文分享自华为云社区《解构华为云HE2E项目中的容器技术应用》,作者: 敏捷小智。 [华为云DevCloud HE2E DevOps实践](https://support.huaweicloud.com/bestpractice-devcloud/devcloud_practice_2000.html)当中,项目采用Docker技术进行构建部署。 容器技术应用,其实说简单也很简单,其流程无外乎:制作镜像——上传镜像——拉取镜像——启动镜像。 今天,我们就带大家**从容器技术应用的角度来解构HE2E项目**。 HE2E技术架构图: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992365690666986.png) # 创建项目 在华为云DevCloud中创建项目时选择DevOps样例项目,即可创建出预置了代码仓库、编译构建、部署等任务的DevOps样例项目,此项目即HE2E项目。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992378881932915.png) # 代码仓库 HE2E项目中预置了代码仓库phoenix-sample。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992390990581615.png) 在根目录下可以看到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部署时所需的配置进行讲解,大家不要心急噢。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992407472733292.png) # 功能模块与制作镜像的Dockerfile result、vote、worker三个文件夹分别对应HE2E当中的三个功能模块:结果、投票、处理。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992423270273381.png) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992434412423310.png) 可以看到,三个文件夹下各自都有Dockerfile文件。制作镜像的时候就是靠这些Dockerfile文件来进行制作的。 我们以result下的Dockerfile进行举例说明: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992465473662973.png) 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。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992476232626864.png) 其余的vote和worker两个功能模块也是按此种办法制作镜像。值得一提的是,worker文件夹下有Dockerfile、Dockerfile.j和Dockerfile.j2三个文件,但是在构建任务中,我们只需选择一个文件进行镜像制作,选择的是Dockerfile.j2这个文件。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992491928827644.png) 在Dockerfile.j2文件中,将target下的内容复制到code/target下,但是target文件夹又并不在代码当中。这是因为worker下的项目是Java项目,target文件夹是在Maven构建的过程产生的,所以在构建任务phoenix-sample-ci中,制作Worker镜像之前需要先通过Maven进行构建。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992499038223440.png) 通过以上的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 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992522247849007.png) 这句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是采用第三方应用,所以在镜像版本方面会有区别。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992549737260463.png) 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个构建任务。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992578449603097.png) 我们仅分析phoenix-sample-ci任务即可。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992591941404932.png) # 三个功能模块的构建 在进行代码解构时,对构建任务的部分内容已经进行过分析了,其中就包括如何通过指定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两个文件制作镜像并上传。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992617870611458.png) # 替换部署配置文件并打包 通过以上的步骤,镜像就已完全上传至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)所需的配置文件修改为可部署、可应用的版本。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992636272683258.png) 这两个文件修改完毕后,都进行tar打包的操作。打包后的产物也通过接下来的两个“上传XX”步骤上传软件包到了软件发布库。 # Tips 在本项目的帮助文档中,提到了“配置基础依赖镜像”。整个这一段落是由于构建任务中使用的基础镜像源DockerHub拉取受限,采取了一个折中的办法拉取镜像。简言之,整段操作即通过创建prebuild任务来实现基础镜像版本的替换,以避免开发者在进行构建phoenix-sample-ci任务时出现拉取镜像失败的情形。相应地,也在“配置并执行编译构建任务”中禁用了Postgres和Redis镜像的制作步骤。 # 部署 在编译构建环节,我们已经成功将三个功能模块镜像(vote、result、worker)和两个第三方镜像构建并上传至SWR(容器镜像仓库)中了。接下来需要做的就是将SWR中的镜像拉取到我们的部署主机并启动。 在整个实践中,提供了ECS部署和CCE部署两种方式,并且在项目中预置了3个部署任务。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992665932342943.png) 我们仅分析phoenix-sample- standalone任务即可。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992675863946981.png) # 传输软件包至部署主机中 在构建环节,我们除了制成镜像并上传到SWR以外,还对配置文件进行了修改、压缩并上传到了软件发布库。在部署过程中,我们首先要做的,就是把配置文件从软件发布库中传到部署主机当中。 结合实际的部署任务来看,就是:向[主机组] group-bhd部署一个[软件包/构建任务(的产物)],我们选择了[构建任务] phoenix-sample-ci的最新版本([构建版本][Latest])构建产物,将其[下载到主机的部署目录]。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992690142429572.png) 这一步骤执行完毕后,在部署主机的/root/phoenix-sample-standalone-deploy路径下,就会存在之前构建任务中压缩的docker-stack.tar.gz和phoenix-sample-k8s.tar.gz。ECS部署中,我们仅需要解压docker-stack.tar.gz,这个文件是docker-compose-standalone.yml的压缩包(回顾一下构建任务中的“替换部署配置文件并打包”)。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992698717175913.png) # 通过执行shell命令启动docker-compose 解压完成后,我们就可以通过执行docker-compose启动命令来启动项目了。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992904755929258.png) 在这一步骤当中,前三行分别输出了三个参数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个容器进程。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992916628234226.png) 与此同时,访问http://{ip}:5000和http://{ip}:5001即可访问项目的用户端与管理端。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992924275226079.png) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649992931703616375.png) # 结语 本文从容器技术应用的角度解构了HE2E项目的代码仓库配置、镜像构建、及docker-compose的部署方式。希望通过本篇文章分享可以使更多的开发者了解容器技术和华为云。