云服务器内容精选

  • 迁移方案 表1 迁移方案及适用场景对比 方案类型 适用场景 注意事项 使用docker命令迁移镜像至SWR 待迁移的镜像数量较少 依赖磁盘存储,需要及时进行本地镜像的清理,而且落盘形成多余的时间开销,难以胜任生产场景中大量镜像的迁移。 依赖docker程序,docker daemon对pull/push的并发数进行了严格的限制,没法进行高并发同步。 一些功能只能经过HTTP api进行操作,单纯使用docker cli 没法做到,使脚本变得复杂。 使用image-syncer迁移镜像至SWR 待迁移的镜像数量庞大 支持多对多镜像仓库同步。 支持基于Docker Registry V2搭建的docker镜像仓库服务 (如Docker Hub、Quay、Harbor等)。 同步只通过内存和网络,不依赖磁盘存储,同步速度快。 增量同步, 经过对同步过的镜像blob信息落盘,不重复同步已同步的镜像。 并发同步,能够通过配置文件调整并发数。 自动重试失败的同步任务,能够解决大部分镜像同步中的网络抖动问题。 不依赖 docker 以及其余程序。 使用image-migrator迁移镜像至SWR 待迁移的镜像数量庞大 支持将基于Docker Registry v2搭建的Docker镜像仓库中的镜像迁移到华为云SWR中。 跨云harbor同步镜像至华为云SWR 部分客户存在多云场景,并且使用某一家云上的自建Harbor作为镜像仓库 仅支持 Harbor V1.10.5 及以上版本
  • 应用现状 随着容器化技术的发展,越来越多的企业使用容器代替了虚拟机完成应用的运行部署。目前许多企业选择自建Kubernetes集群,但是自建集群往往有着沉重的运维负担,需要运维人员自己配置管理系统和监控解决方案。企业自运维大批镜像资源,意味着要付出高昂的运维、人力、管理成本,且效率不高。 容器镜像服务 支持Linux、ARM等多架构容器镜像托管。企业可以将镜像仓库迁移到容器 镜像服务 ,节省运维成本。 如何把已有的镜像仓库平滑地迁移到容器镜像服务?这里将介绍4种常见的方案,用户可以根据自己的实际使用场景来选择。
  • 操作步骤 购买一个CCE集群。 登录CCE控制台。 在购买CCE集群页面配置集群参数,详细请参考创建集群参数配置。 等待集群创建成功。创建成功后在集群管理下会显示一个运行中的集群,且集群节点数量为0。 创建CCE节点。 集群创建成功后,您还需要在集群中创建运行工作负载的节点。CCE节点默认安装了Linux操作系统和Docker。我们可以用它创建基础镜像。 在下面的步骤中,我们将以Centos7.6为例,详细介绍如何创建JDK8基础镜像,并将它上传到SWR。 登录CCE控制台。 单击1中创建的集群,进入集群控制台。 在左侧菜单栏选择节点管理,进入节点页签,单击右上角“创建节点”,在弹框中配置节点的参数。 在网络配置中,选择“自动创建”1个弹性公网IP,带宽为5Mbit/s。 图1 网络配置 单击“下一步: 规格确认”。 查看节点规格无误后,阅读页面上的使用说明,勾选“我已阅读并知晓上述使用说明和《云容器引擎服务声明》”,单击“提交”。 等待节点创建成功。创建成功后在节点管理下会显示一个运行中的节点。 图2 CCE节点示例 下载JDK软件包。 节点创建成功后,单击节点名称,进入云服务器详情页。 在云服务器详情页,单击右上角“远程登录”。 选择一种登录方式,单击“登录”。 以root用户登录弹性云服务器。 新建一个目录image。 mkdir image 进入image目录。 cd image 下载JDK软件包。 wget https://builds.openlogic.com/downloadJDK/openlogic-openjdk/8u352-b08/openlogic-openjdk-8u352-b08-linux-x64.tar.gz 构建一个镜像。 执行vi dockerfile命令,编写一个Dockerfile,并写入以下信息: FROM centos #使用centos作为基础镜像 RUN useradd -d /home/springboot -m springboot #在工作目录下创建一个用户 ADD ./openlogic-openjdk-8u352-b08-linux-x64.tar.gz /home/springboot #拷贝jdk软件包到镜像,并自动解压 RUN chown springboot:springboot /home/springboot/openlogic-openjdk-8u352-b08-linux-x64 -R USER springboot #指定用户为springboot ENV JAVA_HOME=/home/springboot/openlogic-openjdk-8u352-b08-linux-x64 #设置环境变量 ENV PATH=$JAVA_HOME/bin:$PATH \ CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar WORKDIR /home/springboot/ #指定镜像的工作目录 按ESC,输入:wq,保存Dockerfile,并退出编辑。 执行下面的命令,构建一个镜像。 docker build -t openjdk:8 . 使用docker images命令,查看镜像是否构建成功。 图3 查看镜像是否创建成功 登录容器镜像服务控制台,并创建一个组织。 示例:这里我们创建一个名为testawa0306的组织。 上传镜像到5的组织下。 以root用户登录容器镜像服务控制台。 为镜像打标签。 示例如下:docker tag openjdk:8 swr.cn-north-4.myhuaweicloud.com/testawa0306/0penjdk:v8.8 上传镜像到步骤5的组织下。 docker push swr.cn-north-4.myhuaweicloud.com/testawa0306/0penjdk:v8.8 镜像上传成功后,我们可以在容器镜像服务控制台-“我的镜像”中找到刚刚上传成功的镜像。 (可选)镜像上传成功后,您可以使用已上传的镜像在CCE中部署工作负载。
  • 是否支持跨区域同步镜像? 目前SWR界面仅支持“华北-北京一”、“华北-北京四”、“华北-乌兰察布一”、“华东-上海一”、“华东-上海二”、“华南-广州”、“西南-贵阳一”、“中国-香港”、亚太-曼谷”、“亚太-新加坡”、“非洲-约翰内斯堡”区域同步镜像,其他区域没有此功能。 如果您想把最新推送的镜像同步到其他区域镜像仓库内,您可以先将镜像下载到本地,然后上传到需要同步区域的镜像仓库中。 父主题: 镜像同步
  • 入门指引 容器镜像服务是一种支持容器镜像全生命周期管理的服务,提供简单易用、安全可靠的镜像管理功能,帮助用户快速部署容器化服务。本文档以一个2048应用为例,帮助您学习如何安装容器引擎并构建镜像,以及如何使用容器引擎客户端上传镜像到容器镜像仓库。 上传镜像到容器镜像仓库支持两种方式:使用容器引擎客户端和console页面,console页面上传请参见页面上传。 上传镜像暂时没有开放镜像上传的API。 您将按以下流程学习如何使用容器镜像服务。 图1 入门流程
  • 二、构建镜像 在安装docker容器引擎的虚拟机上执行以下命令,下载2048应用的源码。 git clone https://gitee.com/jorgensen/2048.git 若提示“git: command not found”表示未安装Git工具,请先安装该工具(可使用yum install git命令)。 下载成功后,进入“2048”目录。 cd 2048 修改Dockerfile文件。 vim Dockerfile FROM nginx COPY . /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] FROM:指定基础镜像nginx。 COPY:将2048源码拷贝到容器内的“/usr/share/nginx/html”目录。 EXPOSE:暴露容器的80端口。 CMD:指定容器运行时的默认命令。 按“Esc”,输入:wq,保存并退出。 使用docker build命令构建镜像。 docker build -t 2048 . 其中, -t表示给镜像加一个标签,也就是给镜像取名,这里镜像名为2048。 . 表示上下文路径,镜像构建命令将该路径下的所有内容打包给容器引擎帮助构建镜像。 执行以下命令,查看已成功构建的2048镜像,版本为默认的latest。 docker images # docker images REPOSITORY TAG IMAGE ID CREATED SIZE 2048 latest 8d421c503ed0 About a minute ago 134MB nginx latest dd34e67e3371 6 days ago 133MB 您还可以看到一个nginx镜像,这个镜像是从镜像仓库下载下来,作为2048镜像的基础镜像使用的。 (可选)运行容器镜像。 镜像构建成功后,您可以执行docker run命令运行容器镜像。 docker run -p 8080:80 2048 docker run命令会启动一个容器,命令中-p是将虚拟机的8080端口映射到容器的80端口,即虚拟机的8080端口的流量会映射到容器的80端口,当您在本地机器的浏览器访问“http://E CS 的弹性公网IP:8080”时,就会访问到容器中,此时浏览器返回的内容就是2048应用页面。
  • 五、上传镜像 在安装容器引擎的虚拟机上执行以下命令,为2048镜像打标签。 docker tag [镜像名称1:版本名称1] [镜像仓库地址]/[组织名称]/[镜像名称2:版本名称2] 其中, [镜像名称1:版本名称1]:请替换为您所要上传的实际镜像的名称和版本名称。 [镜像仓库地址]:可在SWR控制台上查询,四、连接容器镜像服务中登录指令末尾的 域名 即为镜像仓库地址。 [组织名称]:请替换为三、创建组织中创建的组织。 [镜像名称2:版本名称2]:请替换为您期待的镜像名称和镜像版本。 示例: docker tag 2048:latest swr.cn-north-4.myhuaweicloud.com/cloud-develop/2048:v1 上传镜像至镜像仓库。 docker push [镜像仓库地址]/[组织名称]/[镜像名称2:版本名称2] 示例: docker push swr.cn-north-4.myhuaweicloud.com/cloud-develop/2048:v1 终端显示如下信息,表明上传镜像成功。 The push refers to repository [swr.cn-north-4.myhuaweicloud.com/cloud-develop/2048] fbce26647e70: Pushed fb04ab8effa8: Pushed 8f736d52032f: Pushed 009f1d338b57: Pushed 678bbd796838: Pushed d1279c519351: Pushed f68ef921efae: Pushed v1: digest: sha256:0cdfc7910db531bfa7726de4c19ec556bc9190aad9bd3de93787e8bce3385f8d size: 1780 返回SWR管理控制台,在“我的镜像”页面,执行刷新操作后可查看到对应的镜像信息。 镜像上传成功后,你可以使用已上传的镜像在云容器引擎中部署工作负载。
  • 一、安装容器引擎 首先,您需要准备一台虚拟机并安装docker容器引擎,请确保容器引擎为1.11.2及以上版本。 参考购买并登录Linux弹性云服务器创建一台带有弹性公网IP的Linux弹性云服务器。 作为演示,弹性云服务器和公网IP的规格不需要太高,例如弹性云服务器的规格为“1vCPUs | 2GB”、公网IP带宽为“1 Mbit/s”即可,操作系统以选择“CentOS 7.5”为例。 您也可以使用其他机器安装容器引擎,不创建弹性云服务器。 如果您使用的操作系统为EulerOS,请参考EulerOS操作系统下安装。 如果您使用的是Centos操作系统,建议选择CentOS7、CentOS7.2、CentOS7.3、CentOS7.4、CentOS7.5、CentOS7.6操作系统版本,否则可能导致安装异常。 创建完成后返回弹性云服务器列表,单击操作列的“远程登录”,以root用户登录弹性云服务器。 使用如下命令快速安装容器引擎。 curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh sudo systemctl daemon-reload sudo systemctl restart docker
  • 问题描述 假设在本地Docker客户端上制作了一个nginx镜像,版本号为v5,使用docker images命令查询SIZE为22.8MB: $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v5 22f2bf2e2b4f 9 days ago 22.8MB 通过客户端(即执行docker push命令)上传该镜像至SWR镜像仓库,查询大小为9.5MB。 在本地Docker客户端将镜像打包为tar格式,将nginx.tar下载至本地后,通过页面方式上传至SWR镜像仓库,查询大小为23.2MB。 可以发现,通过客户端和页面上传的镜像大小不一样。
  • 设置WORKDIR和CMD WORKDIR指令可以设置默认目录,也就是运行RUN / CMD / ENTRYPOINT指令的地方。 CMD指令可以设置容器创建时执行的默认命令。另外,您应该将命令写在一个数组中,数组中每个元素为命令的每个单词。 FROM node:7-alpine WORKDIR /app ADD . /app RUN npm install CMD ["npm", "start"]
  • 一个容器只运行一个进程 从技术角度讲,Docker容器中可以运行多个进程,您可以将数据库、前端、后端、ssh等都运行在同一个Docker容器中。但是,这样跟未使用容器前没有太大区别,且这样容器的构建时间非常长(一处修改就要构建全部),镜像体积大,横向扩展时非常浪费资源(不同的应用需要运行的容器数并不相同)。 通常所说的容器化改造是对应用整体微服务进行架构改造,改造后,再容器化。这样做可以带来如下好处: 单独扩展:拆分为微服务后,可单独增加或缩减每个微服务的实例数量。 提升开发速度:各微服务之间解耦,某个微服务的代码开发不影响其他微服务。 通过隔离确保安全:整体应用中,若存在安全漏洞,一旦被攻击,所有功能的权限都可能会被窃取。微服务架构中,若攻击了某个服务,只可获得该服务的访问权限,无法入侵其他服务。 提升稳定性:如果其中一个微服务崩溃,其他微服务还可以持续正常运行。 因此,上述企业门户网站可以进行如下改造,Web应用和MySQL运行在不同容器中。 MySQL运行在独立的镜像中,这样的好处就是,可以对它们分别进行修改,且不会牵一发而动全身。如下面这个例子所示,可以删除MySQL,只安装node.js。 FROM ubuntu ADD . /app RUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y nodejs RUN cd /app && npm install CMD npm start
  • 合理调整COPY与RUN的顺序 将变化最少的部分放在Dockerfile的前面,这样可以充分利用镜像缓存。 示例中,源代码会经常变化,则每次构建镜像时都需要重新安装NPM模块,这显然不是希望看到的。因此可以先拷贝package.json,然后安装NPM模块,最后才拷贝其余的源代码。这样的话,即使源代码变化,也不需要重新安装NPM模块。 FROM node:7-alpine WORKDIR /app COPY package.json /app RUN npm install COPY . /app ENTRYPOINT ["./entrypoint.sh"] CMD ["start"]
  • 添加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_DIR COPY package.json $PROJECT_DIR RUN npm install COPY . $PROJECT_DIR ENV MEDIA_DIR=/media \ APP_PORT=3000 VOLUME $MEDIA_DIR EXPOSE $APP_PORT HEALTHCHECK CMD curl --fail http://localhost:$APP_PORT || exit 1 ENTRYPOINT ["./entrypoint.sh"] CMD ["start"]
  • 使用特定的标签 当镜像没有指定标签时,将默认使用latest标签。因此,FROM ubuntu指令等同于FROM ubuntu:latest。当镜像更新时,latest标签会指向不同的镜像,这时构建镜像有可能失败。 如下示例中使用16.04作为标签。 FROM ubuntu:16.04 RUN apt-get update && apt-get install -y nodejs ADD . /app RUN cd /app && npm install CMD npm start
  • 删除多余文件 假设更新了apt-get源,下载解压并安装了一些软件包,它们都保存在“/var/lib/apt/lists/”目录中。 但是,运行应用时Docker镜像中并不需要这些文件。因此最好将它们删除,因为它会使Docker镜像变大。 示例Dockerfile中,删除“/var/lib/apt/lists/”目录中的文件。 FROM ubuntu:16.04 RUN apt-get update \ && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* ADD . /app RUN cd /app && npm install CMD npm start