-
华为开源镜像站2.0震撼上线https://mirrors.huaweicloud.com/powered by 华为云DevCloud 镜像站?啥玩意儿?能照镜子么? 先来个自我介绍,这么说吧 没有镜像站,直连国外源站,下载组件就像“望包石”,等到想死的心都有了。。。然后下载失败,主要看人品有了镜像站,体验飞一般的下载感觉,瞬间舒爽了。。。再也不用担心下载失败,人品碎一地了 Err….,还是不懂镜像站用处是啥?那就比较头疼了… …尽最后努力友情提示一下:开源软件下载加速 “快”?“好用”?“够用”?说说而已?NO!!我们是很认真,很认真的。。。Firstly,你只下载几十K、几十M,偶尔来个G?我们却拿出“双十一”剁手的功力,搜罗全世界的组件,缓存了100+T组件,根本停不下来。。。 Secondly!我们“壕”掷重金,拉上华为云CDN服务,搞了全国CDN加速,不管你在南方的艳阳里大雪纷飞,还是在北方的寒夜里四季如春,下载全覆盖~~还没完,因为“壕”,我们做了全站CDN!全站CDN!!全站CDN!!!更重要的是,还“免费”!“免费”!!“免费”!!!试问,还有谁。。。(预备。。唱:无敌是多么 多么寂寞;无敌是多么 多么空虚。。。) 第三,镜像站搞的都是“进出口贸易”,我们通过层层“努力”,打通香港节点.从香港出口帮你“专业”实时代理,全球拉组件。。。需我镜像者,虽远必拉。够不够诚意?! Fouthly,对于大家永远满足不了的诉(re)求(qing)。镜像种类我们一加再加,计划都排到了2046年。。。。目前已经支持语言,工具,操作系统等大大小小45+类镜像!!第五,为了让你用得安全,我们绞尽脑汁,晓之以理,动之以情。磨破嘴皮,不断推动跟国外社区的合作,一步一个脚印。。。 最后,妹子们(猿鼓励师)说“要有颜值!!颜值!!!,不然都是渣。。。,”so,猿们不顾产品经理阻挠。。。,把镜像站页面做了美颜和瘦身美颜前美颜后讲了这么多(口干),到底怎么用啊?只需访问:https://mirrors.huaweicloud.com/ 镜像配置一键生成,分分钟搞定,就是这么简单!!Um。。。我猜到了你们的小心思是不是想用docker镜像?是不是想用go镜像?是不是想要组件搜索?想不想快速发布组件到Maven central?……Anyway,这些都要看心情了(规划中)。。。最后的最后,送上小组才子即兴赋诗一首,镇楼!using huawei mirror, being bussiness leader,coding not only better and standing even topper,joining us sooner and you will be a winner
-
AOS编排服务能够对华为云服务进行编排,其模板提供了较多数据处理的机制。下文将举一些平常使用较多的模板编写范例,方便大家使用的同时也介绍一些AOS的特性。 1. 集群可选创建 资源较全的一些模板会部署一个集群供后续资源的部署,但是在调试的时候每次都进行集群的创建太麻烦,所以需要集群创建这个功能是可选的。tosca_definitions_version: huaweicloud_tosca_version_1_0 inputs: clusterId: default: create conditions: createCluster: cond_eq: # 如果输入的clusterId为create则表示创建 - get_input: clusterId - create node_templates: my-cluster: type: HuaweiCloud.CCE.Cluster condition: createCluster properties: xxx: xxx sftp-server: type: HuaweiCloud.CCE.Deployment properties: clusterId: cond_if: - createCluster # 如果创建了则使用创建的clusterId,不然使用输入 - get_reference: my-cluster - get_input: clusterId k8sManifest: kind: xxx 模板中使用了conditions这个特性,通过判断输入的clusterId的值,决定是否要对集群进行部署。第一步在cluster元素中通过conditions字段控制集群是否部署,第二步在具体创建资源的时候,通过条件判断clusterId的来源。 2. 使用secret传递AOS的secret、password类型的输入 AOS中文本参数类型有string、secret、password等,与string不同,secret、password类型会以加密的形式存储,但是如果应用需要使用这两种类型的数据的时候,直接get_input获取到的实际上是加密后的数据。为了让应用能够使用该类型,需要使用一些支持解密的元素进行中转,例如说CCE.Secret类型。 inputs: cluster-id: type: string secret: type: secret node_templates: a-secret-from-aos: properties: clusterId: get_input: cluster-id namespace: default data: secret: get_input: secret type: Opaque type: HuaweiCloud.CCE.Secret 该模板部署完毕之后会在指定集群内生成一个包含给定数据的secret,后续直接引用为环境变量或者作为卷挂载均可。 3. deployment常用配置 AOS支持对于CCE下属资源的编排,即进行k8s集群的、下属资源如deployment、statefulset、secret等资源的创建与删除。其下的k8sManifest更是可以直接透传创建请求给集群,灵活性大增。借由AOS的一些特性,可以得到更强的灵活性。 下方使用的deployment样例集合了较多的特性,可以视情况进行删减。如需部署需要与第二节中的secret写入同一份模板。美中不足的是,使用concat拼接deployment名称之后,堆栈名称不能过长,因为name的总长不能超过64。inputs: cluster-id: type: string cluster-version: type: string instances: type: integer default: 1 image: type: string default: 'nginx:latest' mount-path: type: string default: /mnt/credential mappings: region-map: # 每个region对应不同的镜像 cn-north-1: image: '100.125.0.198:20202/my-namespace/nginx:my-version' cn-east-2: image: '100.125.17.64:20202/my-namespace/nginx:my-version' cn-south-1: image: '100.125.16.65:20202/my-namespace/nginx:my-version' api-version: # 每个集群版本都有可能有自己的apiVersion v1.7: deployment: extensions/v1beta1 v1.9: deployment: apps/v1 conditions: use-default-image: # 是否使用默认镜像 cond_and: - cond_eq: # 如果镜像是默认值 - get_input: image - 'nginx:latest' - cond_or: # 同时是在支持的region范围内 - cond_eq: - get_input: HuaweiCloud.Region - cn-north-1 - cond_eq: - get_input: HuaweiCloud.Region - cn-east-2 - cond_eq: - get_input: HuaweiCloud.Region - cn-south-1 node_templates: a-deployment-from-aos: properties: clusterId: get_input: cluster-id namespace: default k8sManifest: apiVersion: # 使用集群版本选择使用的apiVersion get_in_map: - api-version - get_input: cluster-version - deployment kind: Deployment metadata: name: concat: # 名称中加入StackName,方便模板多次部署到同一个集群内 - sample-deploy- - get_input: HuaweiCloud.StackName labels: # label中加入堆栈名与app名为了在集群内不会出现重复 stack-name: get_input: HuaweiCloud.StackName app: sample-deploy spec: replicas: get_input: instances selector: matchLabels: # 与上面的label对应 stack-name: get_input: HuaweiCloud.StackName app: sample-deploy template: metadata: labels: # 与上面的label对应 stack-name: get_input: HuaweiCloud.StackName app: sample-deploy spec: containers: - env: # 环境变量也可以使用get_input - name: USER_NAME value: root - name: USER_PASSWORD valueFrom: secretKeyRef: key: secret name: get_attribute: - a-secret-from-aos - refName - name: CREDENTIAL_PATH # 路径等变量输入值推荐重复使用 value: get_input: mount-path image: cond_if: # 灵活选取镜像地址,一个模板支持多个region - use-default-image - get_in_map: - region-map - get_input: HuaweiCloud.Region - image - get_input: image volumeMounts: - mountPath: get_input: mount-path name: secret-volume imagePullPolicy: IfNotPresent name: sample-deploy ports: - containerPort: 80 imagePullSecrets: - name: default-secret volumes: - name: secret-volume # secret可以通过挂卷的方式挂载,安全性更好 secret: secretName: get_attribute: - a-secret-from-aos - refName requirements: - dependency: node: a-secret-from-aos type: HuaweiCloud.CCE.Deployment 4. service对接deployment的常用配置 作为应用对外访问的方式,service也是常用的资源,常用的配置如下。inputs: cluster-id: type: string node_templates: a-service-from-aos: properties: clusterId: get_input: cluster-id namespace: default k8sManifest: apiVersion: v1 kind: Service metadata: name: concat: # 名称中加入StackName,方便模板多次部署到同一个集群内 - sample-service- - get_input: HuaweiCloud.StackName labels: stack: get_input: HuaweiCloud.StackName app: # 此处的app标签使用deployment的名称,方便CCE前端访问的时候可以查找到该Service get_attribute: - a-deployment-from-aos - refName spec: ports: # nodePort字段显式填写可以自动生成 - port: 80 targetPort: 80 selector: # 必须与deployment内填写的matchLabels对应 stack-name: get_input: HuaweiCloud.StackName app: sample-deploy type: NodePort requirements: - dependency: node: a-deployment-from-aos type: HuaweiCloud.CCE.Service outputs: port: # 创建完毕之后,生成的nodePort端口可以通过这样的方式暴露出来 value: get_attribute: - a-service-from-aos - Port - 0 5. commonObject 如果有一些AOS当前还不支持的k8s,则可以使用通用元素进行创建删除。tosca_definitions_version: huaweicloud_tosca_version_1_0 inputs: clusterId: type: string kind: default: Namespace name: default: newnamespace node_templates: my-commonobject: type: HuaweiCloud.CCE.CommonObject properties: clusterId: get_input: clusterId k8sManifest: kind: get_input: kind apiVersion: v1 metadata: name: get_input: name
-
利用镜像快速搭建一个企业网站→镜像地址详情请点击→demo演示站更多精美模板→点这里
-
本文基于华为云容器镜像服务实践所编写,将一个单体应用进行容器改造为例,展示如何写出可读性更好的Dockerfile,从而提升镜像构建速度,构建层数更少,体积更小的镜像。下面是一个常见企业门户网站架构,由一个Web Server和一个数据库组成,Web Server提供web服务,数据库保存用户数据。通常情况下,这样一个门户网站安装在一台服务器上。如果把应用运行在一个Docker容器中,那么很可能写出下面这样的Dockerfile来。FROM ubuntuADD . /appRUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y nodejs ssh mysql RUN cd /app && npm install# this should start three processes, mysql and ssh# in the background and node app in foreground# isn't it beautifully terrible? <3CMD mysql & sshd & npm start当然这样Dockerfile有很多问题,这里CMD命令是错误的,只是为了说明问题而写。下面的内容中将展示对这个Dockerfile进行改造,说明如何写出更好的Dockerfile,共有如下几种处理方法。一个容器只运行一个进程不要在构建中升级版本将变化频率一样的RUN指令合一使用特定的标签删除多余文件选择合适的基础镜像设置WORKDIR和 CMD使用ENTRYPOINT (可选)在entrypoint脚本中使用exec优先使用COPY合理调整COPY与RUN的顺序设置默认的环境变量,映射端口和数据卷使用EXPOSE暴露端口使用VOLUME管理数据卷使用LABEL设置镜像元数据添加HEALTHCHECK使用USER做权限控制编写.dockerignore文件使用多阶段构建一个容器只运行一个进程从技术角度讲,Docker容器中可以运行多个进程,您可以将数据库,前端,后端,ssh等都运行在同一个Docker容器中。但是,这样跟未使用容器前没有太大区别,且这样容器的构建时间非常长(一处修改就要构建全部)、镜像体积大、横向扩展时非常浪费资源(不同的应用需要运行的容器数并不相同)。通常所说的容器化改造是对应用整体微服务架构改造,再容器化,这样做可以带来如下好处。单独扩展:拆分为微服务后,可单独增加或缩减每个微服务的实例数量。提升开发速度:各微服务之间解耦,某个微服务的代码开发不影响其他微服务。通过隔离确保安全:整体应用中,若存在安全漏洞,会获得所有功能的权限。微服务架构中,若攻击了某个服务,只可获得该服务的访问权限,无法入侵其他服务。隔离崩溃:如果其中一个微服务崩溃,其它微服务还可以持续正常运行。如前面的示例可以改造成下面架构,Web应用和MySQL运行在不同容器中。MySQL运行在单独的镜像中,下面的示例中删掉了MySQL,只安装node.js。FROM ubuntuADD . /appRUN apt-get update RUN apt-get upgrade -yRUN apt-get install -y nodejs RUN cd /app && npm installCMD npm start不要在构建中升级版本为了降低复杂性、减少依赖、减小文件大小、节约构建时间,你应该避免安装任何不必要的包。例如,不要在数据库镜像中包含一个文本编辑器。apt-get upgrade会使得镜像构建非常不确定,在构建时不确定哪些包会被安装,此时可能会产生不一致的镜像,因为你不再有你的应用程序该如何运行以及包含在镜像中依赖的哪种版本的正确源文件。如果基础镜像中的某个包过时了,你应该联系它的维护者。如果你确定某个特定的包,比如 foo,需要升级,使用 apt-get install -y foo 就行,该指令会自动升级 foo 包。删掉apt-get upgrade后,Dockerfile如下:FROM ubuntuADD . /appRUN apt-get updateRUN apt-get install -y nodejsRUN cd /app && npm installCMD npm start将变化频率一样的RUN指令合一Docker镜像是分层的,类似于洋葱,它们都有很多层,为了修改内层,则需要将外面的层都删掉。Docker镜像有如下特性:Dockerfile中的每个指令都会创建一个新的镜像层。镜像层将被缓存和复用。Dockerfile修改后,复制的文件变化了或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效。某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效。镜像层是不可变的,如果我们再某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在Docker容器中不可见。将变化频率一样的指令合并在一起,目的是为了更好的将镜像分层,避免带来不必要的成本。如本例中将node.js安装与npm模块安装放在一起的话,则每次修改源代码,都需要重新安装node.js,这显然不合适。FROM ubuntuADD . /appRUN apt-get update \ && apt-get install -y nodejs \ && cd /app \ && npm install CMD npm start因此,正确的写法是这样的:FROM ubuntuRUN apt-get update && apt-get install -y nodejs ADD . /appRUN cd /app && npm installCMD npm start使用特定的标签当镜像没有指定标签时,将默认使用latest 标签。因此, FROM ubuntu 指令等同于FROM ubuntu:latest。当镜像更新时,latest标签会指向不同的镜像,这时构建镜像有可能失败。如下示例中使用16.04作为标签。FROM ubuntu:16.04RUN apt-get update && apt-get install -y nodejs ADD . /app RUN cd /app && npm installCMD npm start删除多余文件假设我们更新了apt-get源,下载解压并安装了一些软件包,它们都保存在/var/lib/apt/lists/目录中。但是,运行应用时Docker镜像中并不需要这些文件。因此最好将它们删除,因为它会使Docker镜像变大。示例Dockerfile中,删除/var/lib/apt/lists/目录中的文件。FROM ubuntu:16.04RUN apt-get update \ && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* ADD . /app RUN cd /app && npm installCMD npm start选择合适的基础镜像在示例中,我们选择了ubuntu作为基础镜像。但是我们只需要运行node程序,没有必要使用一个通用的基础镜像,node镜像应该是更好的选择。更好的选择是alpine版本的node镜像。alpine是一个极小化的Linux发行版,只有4MB,这让它非常适合作为基础镜像。FROM node:7-alpineADD . /app RUN cd /app && npm installCMD npm start设置WORKDIR和 CMDWORKDIR指令可以设置默认目录,也就是运行RUN / CMD / ENTRYPOINT指令的地方。CMD指令可以设置容器创建是执行的默认命令。另外,您应该将命令写在一个数组中,数组中每个元素为命令的每个单词。FROM node:7-alpineWORKDIR /app ADD . /app RUN npm installCMD ["npm", "start"]使用ENTRYPOINT (可选)ENTRYPOINT指令并不是必须的,因为它会增加复杂度。ENTRYPOINT是一个脚本,它会默认执行,并且将指定的命令作为其参数。它通常用于构建可执行的Docker镜像。FROM node:7-alpineWORKDIR /app ADD . /app RUN npm installENTRYPOINT ["./entrypoint.sh"] CMD ["start"]在entrypoint脚本中使用exec在前文的entrypoint脚本中,我使用了exec命令运行node应用。不使用exec的话,我们则不能顺利地关闭容器,因为SIGTERM信号会被bash脚本进程吞没。exec命令启动的进程可以取代脚本进程,因此所有的信号都会正常工作。优先使用COPYCOPY指令非常简单,仅用于将文件拷贝到镜像中。ADD相对来讲复杂一些,可以用于下载远程文件以及解压压缩包。FROM node:7-alpineWORKDIR /appCOPY . /appRUN npm installENTRYPOINT ["./entrypoint.sh"] CMD ["start"]合理调整COPY与RUN的顺序将变化最少的部分放在Dockerfile的前面,这样可以充分利用镜像缓存。示例中,源代码会经常变化,则每次构建镜像时都需要重新安装NPM模块,这显然不是我们希望看到的。因此我们可以先拷贝package.json,然后安装NPM模块,最后才拷贝其余的源代码。这样的话,即使源代码变化,也不需要重新安装NPM模块。FROM node:7-alpineWORKDIR /appCOPY package.json /app RUN npm install COPY . /appENTRYPOINT ["./entrypoint.sh"] CMD ["start"]设置默认的环境变量,映射端口和数据卷运行Docker容器时很可能需要一些环境变量。在Dockerfile设置默认的环境变量是一种很好的方式。另外,我们应该在Dockerfile中设置映射端口和数据卷。示例如下:FROM node:7-alpineENV PROJECT_DIR=/appWORKDIR $PROJECT_DIRCOPY package.json $PROJECT_DIR RUN npm install COPY . $PROJECT_DIRENTRYPOINT ["./entrypoint.sh"] CMD ["start"]ENV指令指定的环境变量在容器中可以使用。如果你只是需要指定构建镜像时的变量,你可以使用ARG指令。使用EXPOSE暴露端口EXPOSE 指令用于指定容器将要监听的端口。因此,你应该为你的应用程序使用常见的端口。例如,提供 Apache web 服务的镜像应该使用 EXPOSE 80,而提供 MongoDB 服务的镜像使用 EXPOSE 27017。对于外部访问,用户可以在执行 docker run 时使用一个标志来指示如何将指定的端口映射到所选择的端口。FROM node:7-alpineENV PROJECT_DIR=/appWORKDIR $PROJECT_DIRCOPY package.json $PROJECT_DIR RUN npm install COPY . $PROJECT_DIRENV APP_PORT=3000EXPOSE $APP_PORTENTRYPOINT ["./entrypoint.sh"] CMD ["start"]使用VOLUME管理数据卷VOLUME 指令用于暴露任何数据库存储文件,配置文件,或容器创建的文件和目录。强烈建议使用 VOLUME来管理镜像中的可变部分和用户可以改变的部分。下面示例中填写一个媒体目录。FROM node:7-alpineENV PROJECT_DIR=/appWORKDIR $PROJECT_DIRCOPY package.json $PROJECT_DIR RUN npm install COPY . $PROJECT_DIRENV MEDIA_DIR=/media \ APP_PORT=3000VOLUME $MEDIA_DIR EXPOSE $APP_PORTENTRYPOINT ["./entrypoint.sh"] CMD ["start"]使用LABEL设置镜像元数据你可以给镜像添加标签来帮助组织镜像、记录许可信息、辅助自动化构建等。每个标签一行,由 LABEL 开头加上一个或多个标签对。 注意:如果你的字符串中包含空格,必须将字符串放入引号中或者对空格使用转义。如果字符串内容本身就包含引号,必须对引号使用转义。FROM node:7-alpine LABEL com.example.version="0.0.1-beta"添加HEALTHCHECK运行容器时,可以指定--restart always选项。这样的话,容器崩溃时,docker daemon会重启容器。对于需要长时间运行的容器,这个选项非常有用。但是,如果容器的确在运行,但是不可用怎么办?使用HEALTHCHECK指令可以让Docker周期性的检查容器的健康状况。我们只需要指定一个命令,如果一切正常的话返回0,否则返回1。当请求失败时,curl --fail 命令返回非0状态。示例如下:FROM node:7-alpine LABEL com.example.version="0.0.1-beta"ENV PROJECT_DIR=/app WORKDIR $PROJECT_DIRCOPY package.json $PROJECT_DIR RUN npm install COPY . $PROJECT_DIRENV MEDIA_DIR=/media \ APP_PORT=3000VOLUME $MEDIA_DIR EXPOSE $APP_PORT HEALTHCHECK CMD curl --fail http://localhost:$APP_PORT || exit 1ENTRYPOINT ["./entrypoint.sh"] CMD ["start"]使用USER做权限控制如果某个服务不需要特权执行,建议使用 USER 指令切换到非 root 用户。先在 Dockerfile 中使用类似 RUN groupadd -r postgres && useradd -r -g postgres postgres 的指令创建用户和用户组。你应该避免使用 sudo,因为它不可预期的 TTY 和信号转发行为可能造成的问题比它能解决的问题还多。如果你真的需要和 sudo 类似的功能(例如,以 root 权限初始化某个守护进程,以非 root 权限执行它),你可以使用 gosu。最后,为了减少层数和复杂度,避免频繁地使用 USER 来回切换用户。 注意:在镜像中,用户和用户组每次被分配的 UID/GID 都是不确定的,下次重新构建镜像时被分配到的 UID/GID 可能会不一样。如果要依赖确定的 UID/GID,你应该显示的指定一个 UID/GID。编写.dockerignore文件.dockerignore 的作用和语法类似于 .gitignore,可以忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少Docker镜像的大小。构建镜像时,Docker需要先准备context ,将所有需要的文件收集到进程中。默认的context包含Dockerfile目录中的所有文件,但是实际上,我们并不需要.git目录等内容。示例如下:.git/使用多阶段构建在 Docker 17.05 以上版本中,你可以使用多阶段构建来减少所构建镜像的大小。
-
很多同学在使用镜像构建的时候可能对构建配置选项里的 “Dockerfile目录” 和 “自定义构建路径” 要怎么填感觉有点懵逼,这里给大家分享一点干货帮助大家正确地填写这两个配置项,让大家更好的使用镜像构建功能。 19455 以下图weathermap工程为例,Dockerfile位于工程的 weather/Dockerfile目录下,因此只需要在“Dockerfile目录”中填写weather/Dockerfile即可,记住一定要带上Dockerfile这个文件名哟。所以这里的填写方法就是以工程的跟目录为起始完整地填写Dockerfile的文件路径+文件名即可。 19457 那“自定义构建路径”要怎么填写呢,这里就得说到华为镜像构建一个很人性化的功能,我们平时自己在进行构建时一般会使用如下命令 docker build -t xxx/xxxx:xxx . (这个红色的点不是句号,这个红色的点不是句号,这个红色的点不是句号重要的事情说三遍) 那问题来了这个点到底是什么意思呢,这个点其实就是我们的构建路径,一般我们使用 . 表示在当前目录下进行构建,还是以上面那个工程为例,当你进入到weathermap的根目录的执行上述命令的时候 . 的含义就是 ./ 表示在当前工程的根目录进行构建,当你进入到Dockerfile所在的weather目录执行以上命令的时候 . 的路径其实就是 ./weather 是不是有些明白了,但是又有点糊涂了这个配置项的到底有什么作用呢? 再来举一个栗子···· 我写了一个Dockerfile, 里边有一行COPY run.sh /home/workspace 经常写Dockerfile的同学对这样的命令肯定一点都不陌生,它就是拷贝一个文件到容器的/home/workspace下,那它是从哪里拷呢?就是从我们上面说到的构建目录里去拷,如果我们还是采用上述命令,以 . 作为构建路径,那我们就必须要保证执行构建命令路径下有该文件,否则制作镜像就会失败。 华为的镜像构建默认都是在工程的根目录下进行构建的,但是我就是任性,我就是不一样的花火,我就是要把需要拷贝的文件放到Dockerfile所在的目录下,这个时候要怎么办呢?还是以weathermap工程为例,我们只需要把“自定义构建路径”填写成 /weather 这样就相当于我们进入到了weather 目录再进行构建,这样我们就可以拷贝 weather 目录下的文件了。 辣么...问题来了,华为的镜像构建为啥不直接进入到Dockerfile所在的目录再执行构建呢, 我说了我就是任性,我就是不一样的花火, 我现在就要把Dockerfile放到/weather 目录下,但是我还想要把被拷贝的run.sh 文件放到工程的根目录下,这个时候对华为的镜像构建而言一切也很简单,我们只需要和上面一样继续指定Dockerfile的目录为weather/Dockerfile 然后把 “自定义构建路径”填成 . (亦或 / 亦可不填), 就满足了这样的场景 所以 “自定义构建路径” 提供了一个更灵活的方式让大家去组合Dockerfile 和构建路径的关系。 PS: 有一点要补充的是,Dockerfile文件必须要在个构建路径之下, 这个要怎么解释呢,比如你的Dockerfile是放在 pathA/pathB/pathC/Dockerfile目录下那你的构建路径只能是 / 或 /pathA 或 /pathA/pathB 或 /pathA/pathB/pathC。 至于为什么要这样呢,这个就得去问问Docker了。。。
-
简介本节介绍如何使用华为云镜像,通过切换镜像部署Windows环境。当您已经购买了弹性云服务器,但想切换成其它类型操作系统,或者想使用镜像重新部署已经预装了其它软件的环境,可以参考本文档的介绍和操作指导。切换操作系统的约束与限制可以参见切换操作系统。 操作步骤 [*]登录华为云管理控制台。 [*]选择“计算 > 弹性云服务器”。 [*]关闭弹性云服务器。 如果该实例刚刚创建,可以直接停止实例。如果实例已经运行了一段时间,您想保留其中的数据,请在操作前将数据备份到数据盘中。 注意: 在更换镜像后,系统盘的数据会全部被清空。因此务必做好数据备份工作。 [*]确定关闭弹性云服务器。 [*]弹性云服务器停止后,单击弹性云服务器所在行“操作列”的“更多 > 切换操作系统”。 [*]请仔细阅读“切换操作系统”对话框中的提示信息,并选择需要切换的镜像。 这里以使用镜像市场的“Wordpress官方正式版(Windows2008 | IIS)”并选择该镜像为例。 [*]设置登录方式,然后单击“确定”。 此处以密码登录为例进行说明。 [*]在“切换云服务器操作系统”页面,确认切换的操作系统规格无误后,阅读并勾选“我已经阅读并同意《华为弹性云服务器服务协议》”,单击“提交申请”。 提交切换操作系统的申请后,弹性云服务器的状态变为“切换操作系统中”,当该状态消失后,表示切换结束。 [*]当弹性云服务器处于“运行中”后,就可以登录弹性云服务器,开始使用您的环境了。
-
镜像上传后,您可以共享私有镜像给其他租户,并授予用户操作该镜像的权限。 前提条件 仅租户和具备该私有镜像管理权限用户才能共享镜像,被共享者只有只读权限,只能下载镜像。 操作步骤 1、登录容器镜像服务控制台。 2、在左侧菜单栏选择“我的镜像”,单击右侧要编辑镜像的名称。 3、在镜像详情页面选择“共享”页签。 4、单击“共享镜像”,在提示框中输入共享的账号,共享截止日期,选择共享权限,然后单击“确定”。 5、共享完成后,您可以在“我的镜像”中,勾选“我共享的镜像”,查看所有共享的镜像。 6、被共享的用户可登录容器镜像服务控制台,并在“我的镜像>他人共享”页面查看到该镜像信息。
-
镜像上传成功后,在CCE中创建工作负载时可选择“我的镜像”,以2048游戏为例,具体操作如下: 1、登录CCE控制台,单击左侧导航栏的“工作负载”。在“无状态工作负载”页签下,单击“创建工作负载”。 2、输入以下参数,其它保持默认。 工作负载名称:game。 容器集群:选择应用所要运行的集群。 实例数量:1。 3、单击“下一步”,添加容器。 单击“添加容器”,在“我的镜像”页签中,选择已上传的镜像,单击“确定”。 4、更多创建工作负载的步骤请参见创建无状态工作负载或创建有状态工作负载。
-
组织用于隔离镜像仓库,支持为不同用户分配相应的访问权限(读取、编辑、管理)。 以下是创建组织的步骤: [*]登录容器镜像服务控制台。 [*]在左侧菜单栏选择“组织管理”,单击右侧“创建组织”,在弹出的页面中填写“组织名称”,然后单击“确定”。
-
使用docker save命令可将Docker镜像制作成tar或tar.gz文件压缩包,具体命令格式如下。docker save [OPTIONS] IMAGE [IMAGE...]OPTIONS说明:--output , -o,表示导出到文件。示例:$ docker save nginx:latest > nginx.tar$ ls -sh nginx.tar108M nginx.tar $ docker save php:5-apache > php.tar.gz$ ls -sh php.tar.gz372M php.tar.gz $ docker save --output nginx.tar nginx$ ls -sh nginx.tar108M nginx.tar $ docker save -o nginx-all.tar nginx$ docker save -o nginx-latest.tar nginx:latest
-
摘要:本文不讲晦涩难懂的概念、不讲实现原理、不讲内核机制,仅仅从搭建一个简单web应用的场景出发,讲讲如何复用docker完成我们开发过程中的一些日常事务,达到提升研发效率的目的。Docker自12年发布,经过几年的蛰伏,15,16年势头猛劲,在大量的企业得到的实施,尤其是在互联网、大数据相关领域更是势不可挡。然而,在一些传统行业、政府、事业机关、小企业中,Docker的使用率还是相对较低的,原因是多方面的,但其中很重要一个原因,源于对这些铺天盖地席卷而来的新技术的“恐惧”。企业发展到一定规模后,其技术架构、组织架构、研发模式基于已经稳定,新技采用势必会对现有组织、业务产生影响,而这种影响的好坏,早期是很难判断的,因此除了少数技术狂热派,一般都会比较谨慎,然而小的初创公司,又很难承担一次技术选型的失败,因此更愿意去采用生态相对成熟、实施过程能有较大容错空间的技术。但是经过这些年的市场的磨练,Docker其实已经成为了云计算领域的一员老将,技术栈、生态各方面已经得到完善。本次以部署一个简单的web应用为例,希望能给还徘徊在Docker门口的开发者、决策者们一些启发,如何利用Docker来简化日常研发工作、提升研发效率。本文所讲解示例如下图,是一个简化的web应用模型,包含了常用的组件,下面将详细讲解如何基于Docker快速完成整个环境的搭建和软件的部署。搭建MySQL数据库一行命令搞定!docker run –dti-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7执行docker ps|grep mysql命令,能看到mysql的容器已经启动,比起下载、安装还有各种配置,够快吧。当然这样运行起来的MySQL,还没有办法供外部服务直接访问,,需要把容器内的服务开个通道,让外部服务通过宿主机的地址找到这个特殊通道,才能实现与外部服务的交互。在宿主机上执行netstat发现3306端口并未对外开放 把容器内的服务映射到宿主机上加上参数 -p 宿主机监听port:容器开放port,建立“通道”,这样当用户访问宿主机的port时,请求会自动发送到容器内对应的端口上docker run -dti -p 3306:3306 -eMYSQL_ROOT_PASSWORD=123456 --namemysql-service mysql:5.7加上端口映射后就可以通过宿主机访问了 对容器运行时产生的数据进行持久化因为每次执行docker run,相当于从指定镜像重新启动一台电脑,镜像是静态不变的,那么意味着,重启后之前运行时产生的数据会全部丢失,一切回归到初始状态,这个对数据库是致命的,如果不能持久化存储数据,也就失去了其意义,Docker也就不可能走到现在。在启动容器时,加上参数 -v 宿主机目录:容器内目录,即可将宿主机的目录mount到容器中,这样容器销毁时,宿主机目录的数据还在,重新启动容器,会继续从宿主机加载数据,借尸还魂,很机智。docker run -dti -p 3306:3306 -eMYSQL_ROOT_PASSWORD=123456 -v /usr1/mysql_data:/var/lib/mysql --name mysql-service mysql:5.7现在运行起来的MySQL就基本上已经能满足日常的需求了。当然,MySQL镜像本身还提供了强大的业务参数(这个是镜像制作者提供的,并非Docker提供),通过dockerrun的 -e 参数指定容器运行的环境变量(等价于Dockerfile里的ENV参数),实现相应的mysql能力,非常有用:MYSQL_ROOT_PASSWORD:指定root用户的密码MYSQL_USER: 新创建一个普通用户MYSQL_PASSWORD:新创建用户的密码MYSQL_DATABASE:新创建一个databaseMYSQL_ALLOW_EMPTY_PASSWORD:是允许无密码登陆想要使用时只需要通过加到命令行里即可,如:docker run -d -p 3306:3306 --namemysql-service -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_USER=visitor -eMYSQL_PASSWORD=visitor -e MYSQL_DATABASE=visitordb -eMYSQL_ALLOW_EMPTY_PASSWORD=true -v /usr1/mysql_data:/var/lib/mysql mysql:5.7这为我们制作业务镜像提供了一些参考,把部署、运行时所需要的变量,通过容器环境变量的方式传递给业务组件,当然业务组件也需要实现从这些约定好的变量里取值。使用定制的MySQL镜像,初始化数据当然,仅仅把MySQL启动起来大部分场景下是不够的,还需要创建业务需要的database、tables,有些时候可能还要导入一些初始的数据。接下来就讲一下,如何通过对官方镜像进行定制,实现在启动容器时,自动执行指定脚本,来创建表、初始化数据。定制镜像,就是基于官方的mysql镜像,加上一些脚本、修改一些权限,再统一打包到新的镜像里,在容器启动后自动执行这些脚本,做一些我们需要的业务操作。首先,我们以mysql:5.7作为基础镜像FROM mysql:5.7(语法:FROM 镜像名称:镜像版本号)然后,把需要在MySQL容器启动后执行的脚本拷贝到目录/docker-entrypoint-initdb.d下。(MySQL镜像启动后会扫描这个目录,然后自动执行里面的shell和sql脚本)COPY ./setup.sh/docker-entrypoint-initdb.d/setup.sh (语法:COPY 文件所在的主机路径:镜像中的绝对路径)接着,把setup.sh会引用到的其它文件,如shell,sql,config等,放到脚本中引用的目录下。(如果有多个脚本需要执行,都放在mysql指定目录下时,mysql并不知道脚本的执行先后顺序,因此一般是在mysql指定目录下放一个执行入口文件,在该文件中去按业务逻辑调用其它文件)COPY ./init.sql /myinfo/init.sql最后,在执行shell脚本时,希望root用户不输入密码就能登陆MySQL,这里需要按MySQL镜像的规范,设置一个环境变量:ENV MYSQL_ALLOW_EMPTY_PASSWORD yes(语法:ENV 环境变量名称 环境变量值)这样就生成了我们需要的Dockerfile文件执行 docker build . -t mysql:cust1就能生成我们自己的镜像了,后面加上参数-t就可以给生成的镜像打上标签,以便进行版本管理。运行该镜像的命令与最开始提到的一样,只是镜像的版本需要使用最新生成的mysql:cust1,这里不再赘述。上面MySQL的示例,涵盖了80%常用的docker制作和运行的指令和参数,这也就是我一直认为,Docker技术也许很高深,但使用确实很简单的原因。搭建tomcat,运行后台服务接下来按照制作MySQL镜像的方式,制作tomcat服务镜像,一个带有VisitorService应用的tomcat定制镜像,这里不再一步步讲解,直接把成品的Dockerfile拿出来给大家分享。FROM tomcat:7-jre8COPY ./VisitorService.war /usr/local/tomcat/webapps就是这么简单,两行搞定,思路和写MySQL的Dockerfile是一样的:1、先选择一个基础镜像:因为程序是基于JDK1.8开发的,所以选择了tomcat:7的jre1.8版本进行定制,具体还有哪些可用的镜像版本,可以在dockerhub官网查到2、然后把自定义的内容塞到镜像里:把编译好的war包拷贝到tomcat的webapps目录下,就像平时在自己测试机上操作一样。如果我们不想每次编译完war包都重新构建镜像,也可以用类似于MySQL目录映射的方法,在运行tomcat镜像时,把本地存放war包的路径,映射到容器的webapps目录下。3、设置环境变量:因为应用中会连接数据库,需要在启动容器时,把数据库信息加入到环境变量中,或在dockerfile中通过EVN参数设置,但因为值是会变的,直接写在dockerfile中,灵活性会差很多,因此我们采用了在启动时通过-e 的方式来设置,代码里已实现从环境变量获取这些信息。最终运行业务软件镜像容器的命令参考如下,命令行完成了目录映射、环境变量设置,并指定要启动的镜像版本:docker run -p 9999:8080 -v 本地目录/war文件:/usr/local/tomcat/webapps/xxx.war-eMYSQL_ADDR=mysql_ip:3306 -e MYSQL_DB=visitordb -e MYSQL_USER=visitor -eMYSQL_PWD=visitor -dti tomcat:7-jre8搭建nginx,运行静态web服务与Tomcat类似,也是有两种方法一种是,把需要部署在Nginx上的文件,以及配置打包到镜像中:FROM nginx:v2COPY ./index.html /usr/visitor/index.htmlCOPY ./visitor.conf/etc/nginx/conf.d/visitor.conf另一种是,从本地目录映射:docker run -p 80:80 -v 本地目录/xx.conf:/etc/nginx/conf.d/xx.conf -v本地目录:容器目录-dti nginx搭建并运行Redis服务因为只是存取一些缓存数据,因此不考虑对容器内的数据做持久化,直接放在容器里,因此这里不对redis镜像做任何改造,直接使用。docker run –p 6379:6379 –dti redis:2.8.23大功告成好了,一套简易的web应用环境就搭好了,下面就是最终效果我们来对比一下Docker帮我们提升了多少效率:环境搭建效率提升明显 说实话,以前搭环境最怕的就是像Nginx这种,下完还要编译之后才能运行的,一旦报错,那真是对耐性的考验。现在好了,一个Dockerfile,加docker build,docker run两个命令,轻轻松松搞定环境的搭建,以前这些困难全没了。最关键的是,日常研发过程中,搭建3至5套环境是最基本的要求了,使用编写好的Dockerfile,可以让我们快速完成各种TEST/QA/STAGE环境、Demo演示环境的搭建与复制,而不需要为拷贝动辄几十G的安装包而苦恼,也不会因为各各环境操作系统版本的差异而痛苦,着实为我们省了不少时间和精力。后记正因为Docker这么火,所有的公有云厂商不约而同的都提供了容器服务,这进一步降低了用户的使用门槛,让企业用户无需关心日常运维、问题处理、版本升级、技术演进等纷繁复杂的事务,使用户更专注于自身业务竞争力的提升。华为云提供的容器服务包括云容器引擎服务(CCE)和云容器实例服务(CCI),围绕着云容器,还提供了镜像管理、应用编排、应用运维管理、微服务管理、云中间件等一系列构建容器化应用生态所需的配套服务,并在兼容社区的基础上,针对游戏、电商、基因等行业,对容器的网络性能、计算性能、存储性能、安全等方面进行了优化,能满足广大用户CI/CD、自动化运维、秒级弹性伸缩、高并发低时延、高性能运算的诉求。赶紧点击下面的链接来体验一下吧:华为云容器引擎:https://console.huaweicloud.com/cce2.0/华为云容器实例:https://console.huaweicloud.com/cci/
-
华为云docker镜像加速何时启用?
-
不知华为镜像站是否有计划提供go相关的资源镜像包{:3_41:} 如果有的话,有大概的上线时间么?{:3_59:}
-
最近使用 NPM 镜像安装相关依赖包,使用的是咱们这个华为云镜像站代理的 npm 仓库地址,但是表现特别不稳定,常出现安装包报错的情况,具体情况如下图所示: 15828 15829 15830 而后续变更为淘宝镜像源后,安装同样的包成功: 15831 所以,咱们华为云镜像站代理的 NPM 镜像稳定性和下载速度有待提升 {:9_90:}
-
WordPress:建站必备工具,开源、免费、SEO效果显著,H5技术,移动端多屏自适应访问,内置数百万个插件和主题可以免费使用。 适用于:企业官网、博客、电商网站、相册网站、社区网站等 本产品的操作指导: 1.登录华为云,完成实名认证,后,即可购买此优惠产品。 2.默认此产品购买时不可修改配置,如需扩容可在享受完此优惠后,再进行升级操作。 3.选择默认镜像后,点击立即申请,进行支付。 4.支付成功后,资源信息即可显示在我的订单中。资源创建成功之后可以通过页面导航左上角“控制台”进行操作,(如果出现如图处理中,说明镜像创建中,请稍等几分钟后刷新订单) 14919 5.等待资源创建好,可以看到运行中的云服务器 6.可以点击资源名称如:Wordpress0418—>安全组进行端口配置 14920 点击云服务器的名称后可看到下图 14921 7.通过“快速添加规则”添加不同的端口,注意:请确保开通http(80),保证站点正常访问,如无法访问,可尝试将自定义值设置为1-8888。根据需要进行不同的端口配置,注:如全都不选,则默认为全选,勾选某个端口,则为开通某个端口。 14922 8.开通80端口之后,可以通过http://弹性IP地址/9panel如: http:// 弹性IP /9panel查看运维页面。首次访问IP地址,会触发自动安装。 输入http:// 弹性IP /9panel查看运维页面如下: 14923 输入IP地址,访问如下,触发自动安装: 14924 9.安装过程中会链接数据库,默认数据库用户名:root,默认数据库密码:123456。继续下面的步骤,会让您设置后台的用户名和密码,请牢记。直至安装成功。 14925 10.安装成功后,可以登录WordPress的前台后台(访问地址见上方表格) 前台如下: 14926 管理后台如下: 14927
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签