Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
场景简介
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
背景知识
本场景主要涉及以下云产品和服务:
云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。一台云服务器ECS实例等同于一台虚拟服务器,内含CPU、内存、操作系统、网络配置、磁盘等基础的组件。云服务器ECS免去了您采购IT硬件的前期准备,让您像使用水、电、天然气等公共资源一样便捷、高效地使用服务器,实现计算资源的即开即用和弹性伸缩。阿里云ECS持续提供创新型服务器,解决多种业务需求,助力您的业务发展。
阿里云容器镜像服务(简称 ACR)是面向容器镜像、Helm Chart 等符合 OCI 标准的云原生制品安全托管及高效分发平台。 ACR 支持全球同步加速、大规模/大镜像分发加速、多代码源构建加速等全链路提效,与容器服务 ACK 无缝集成,帮助企业降低交付复杂度,打造云原生应用一站式解决方案。
容器技术
容器是一个允许我们在资源隔离的过程中,运行应用程序和其依赖项的 、轻量的 、操作系统级别的虚拟化技术, 运行应用程序所需的所有必要组件都打包为单个镜像,这个镜像是可以重复使用的。当镜像运行时,它是运行在独立的环境中,并不会和其他的应用共享主机操作系统的内存、CPU或磁盘。这保证了容器内的进程不会影响到容器外的任何进程。
镜像仓库(Registry) Docker的镜像存储中心通常被称为Registry。当您需要获取自己私有镜像时,首先需要登录Registry,然后拉取镜像。修改过镜像之后,您可以再次将镜像推送回Registry中去。或者在本地通过Docker镜像构建的功能生成镜像,再推送到Registry中。
前提条件
云起实验室将在您的账号下开通本次实操资源,资源按量付费,需要您自行承担本次实操的云资源费用。
本实验1小时预计产生费用0.08元。如果您调整了资源规格、使用时长,或执行了本方案以外的操作,可能导致费用发生变化,请以控制台显示的实际价格和最终账单为准。
进入实操前,请确保阿里云账号满足以下条件:
创建实验资源
在实验页面,勾选我已阅读并同意《阿里云云起实践平台服务协议》和我已授权阿里云云起实践平台创建、读取及释放实操相关资源后,单击开始实操。
创建资源需要5分钟左右的时间,请您耐心等待。
在云产品资源列表,您可以查看本场景涉及的云产品资源信息。

安全设置
资源创建完成后,为了保护您阿里云主账号上资源的安全,请您重置云服务器ECS的登录密码和设置安全组端口。
重置云服务器ECS的登录密码。
在云产品资源列表的ECS云服务器区域,单击管理。

在实例详情页签的基本信息区域,单击重置密码。

在重置实例密码对话框中,设置新密码和确认密码,重置密码的方式选择在线重置密码,配置SSH密码登录策略选择开启,单击确认修改。

返回如下结果,表示ECS实例root用户的登录密码重置成功。

设置安全组端口。
在云产品资源列表的安全组区域,单击管理。

在访问规则区域的入方向中,添加SSH(22)、HTTP(80)、HTTPS(443)和8000端口。
重要添加端口时,授权对象建议选择您的本机IP地址。

创建容器镜像服务ACR个人版实例
容器镜像服务ACR个人版面向个人开发者,提供了基础的容器镜像生命周期管理,适合个人开发者开发学习或者业务容器化初期使用。本文介绍如何创建个人版实例。
个人版面向个人开发者,公测限额免费使用,无SLA承诺及SLA受损赔偿且有使用限制。
登录容器镜像服务控制台。
在页面右上角,切换到华东2(上海)。

在实例列表页面,单击个人版区域任意位置。
在提示对话框中,单击创建个人版。

搭建Docker服务
Docker是一个开源的容器引擎,用于创建、管理和编排容器,可以轻松为任何应用创建一个轻量级、可移植、自给自足的容器。本步骤将在ECS上部署一个Docker服务,并配置DockerHub的镜像加速器。
在云产品资源列表的ECS云服务器区域,单击远程连接。

在登录实例对话框中,输入用户自定义密码,单击确定。

执行如下命令,添加docker-ce的dnf源。
sudo dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo执行如下命令,安装Alibaba Cloud Linux 3专用的dnf源兼容插件。
sudo dnf -y install dnf-plugin-releasever-adapter --repo alinux3-plus执行如下命令,安装Docker。
sudo dnf -y install docker-ce --nobest如果执行命令时,出现类似如下的报错信息,您需要执行
sudo dnf clean packages清除软件包缓存后,重新安装docker-ce。(8-9/12): docker-ce-24.0.7-1.el8.x86_64.rpm 38% [================- ] 8.2 MB/s | 38 MB 00:07 ETA The downloaded packages were saved in cache until the next successful transaction. You can remove cached packages by executing 'dnf clean packages'. Error: Error downloading packages: containerd.io-1.6.26-3.1.el8.x86_64: Cannot download, all mirrors were already tried without success如果执行命令时,出现类似下图的报错信息,您需要注释/etc/yum.repos.d下的CentOS源,注释后重新安装docker-ce。

执行如下命令,检查Docker是否安装成功。
docker -v返回类似如下结果,表示Docker已安装成功。

执行如下命令,启动Docker服务,并设置开机自启动。
sudo systemctl start docker sudo systemctl enable docker执行以下命令,查看Docker是否启动。
sudo systemctl status docker返回如下结果,表示Docker已启动。查看完后,按
CTRL+C退出。
配置镜像加速器
返回至容器镜像服务控制台页签。在左侧导航栏中,选择。

在镜像加速器页面,单击CentOS,复制下方的命令。

返回至云服务器ECS终端页签。执行上一步骤复制的命令。

准备应用代码和Dockerfile
本步骤操作将创建一个工作空间,然后在工作空间下创建一个基于Golang的HelloWorld代码文件和一个用来构建运行Hello代码所需环境镜像的Dockerfile文件。
执行如下命令,创建工作空间并进入。
mkdir -p /tmp/demo && cd /tmp/demo执行如下命令,在工作空间下创建HelloWorld代码文件,用来在容器环境中监听HTTP服务,输出HelloWorld字符串。
cat > /tmp/demo/main.go << EOF package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello! World\n") }) fmt.Println("start to serve...") http.ListenAndServe(":80", nil) } EOF执行如下命令,在工作空间下创建Dockerfile文件。
cat > /tmp/demo/Dockerfile << EOF FROM golang:1.12-alpine # change current working dir WORKDIR /go/src/app # copy main.go into /go/src/app COPY . . # go build and install the app RUN go install -v ./... # run the app by default CMD ["app"] EOF
5. 本地构建镜像并运行镜像
本步骤将指导您使用Docker基本命令构建和运行镜像。
执行如下命令,使用docker build命令构建镜像。
docker build . -t demo:v1返回如下结果。
说明参数
.表示指定当前路径作为构建上下文,即Dockerfile所在的本地路径。参数
-t demo:v1指定镜像名称和标签。
执行如下命令,查看已有镜像。
sudo docker images返回如下结果,您可查看到上一步构建的镜像。

执行如下命令,使用docker run命令运行镜像。
docker run -d -p 8000:80 demo:v1返回如下结果。
说明参数
-d设置容器运行模式为后台运行。参数
-p 8000:80将容器内部使用的网络端口映射到主机上,其中8000为主机端口,80为容器内部使用端口。
执行如下命令,使用curl工具访问容器中的HelloWorld服务。
curl localhost:8000返回如下结果,表示成功访问容器中的HelloWorld服务。

执行如下命令,使用docker rm命令删除容器。
docker rm -f $(docker ps -a | grep "demo:v1" | awk '{print $1}')返回如下结果。

创建远程镜像仓库
本步骤操作将指导您使用自己的阿里云账号开通容器镜像服务并创建镜像仓库。阿里云容器镜像服务默认实例版可免费使用,其使用限制请参见容器镜像服务计费说明。
返回至容器镜像服务控制台页签。在左侧导航栏中,单击实例列表。

在实例列表页面,单击个人实例。

在概览页面,单击设置Registry登录密码。

在设置Registry登录密码对话框中,输入密码和确认密码,单击确定。

在概览页面左上角,确认是否在华东2(上海)地域。在左侧导航栏中,选择。

在命名空间页面, 单击创建命名空间。

在创建命名空间对话框中,设置命令空间名称,单击确定。

在左侧导航栏中,选择。

在镜像仓库页面,单击创建镜像仓库。

在创建镜像仓库的仓库信息中,命名空间选择您创建的命名空间,仓库类型选择私有,设置仓库名称和摘要,单击下一步。

在创建镜像仓库的代码源中,单击本地仓库,然后单击创建镜像仓库。

返回如下页面,在基本信息页面,您可查看创建的镜像仓库详情信息。

推送拉取镜像
本步骤操作将本地镜像推送到远程仓库中,并运行远程仓库中的指定版本镜像。
返回至云服务器ECS终端页签。执行如下命令,登录镜像仓库。
说明您需要将命令中的
<镜像仓库登录名>替换为您的阿里云主账号用户名,<个人版实例所在的地域>替换为shanghai,再执行命令。回车执行命令后会弹出Password:提示,请您输入设置的Registry登录密码。docker login --username=<镜像仓库登录名> registry.cn-<个人版实例所在的地域>.aliyuncs.com如果您不清楚阿里云主账号用户名,请登录账号中心查看您的里云主账号用户名。

返回如下结果,表示已登录阿里云Docker Registry。

推送镜像。
执行如下命令,给本地镜像打标签。
说明您需要将命令中的
<镜像ID>替换为demo:v1,<个人版实例所在的地域>替换为shanghai,<命名空间名称>和<镜像仓库名称>替换为您创建的命名空间名称和镜像仓库名称,<镜像版本号>替换为v1。docker tag <镜像ID> registry.cn-<个人版实例所在地域>.aliyuncs.com/<命名空间名称>/<镜像仓库名称>:<镜像版本号>
执行如下命令,推送本地镜像至个人版实例。
说明您需要将命令中的
<个人版实例所在的地域>替换为shanghai,<命名空间名称>和<镜像仓库名称>替换为您创建的命名空间名称和镜像仓库名称,<镜像版本号>替换为v1。docker push registry.cn-<个人版实例所在地域>.aliyuncs.com/<命名空间名称>/<镜像仓库名称>:<镜像版本号>返回如下结果,镜像正在推送中,请您耐心等待推送完成。

查看个人实例中的镜像。
返回至容器镜像服务控制台页签。在基本信息页面的左侧导航栏中,单击镜像版本。

在镜像版本页面,您可查看到推送的镜像。

返回至云服务器ECS终端页签。执行如下命令,拉取指定版本的远程镜像。
说明您需要将命令中的
<个人版实例所在的地域>替换为shanghai,<命名空间名称>和<镜像仓库名称>替换为您创建的命名空间名称和镜像仓库名称,<镜像版本号>替换为v1。docker pull registry.cn-<个人版实例所在地域>.aliyuncs.com/<命名空间名称>/<镜像仓库名称>:<镜像版本号>返回如下结果。

执行如下命令,查看已有镜像。
sudo docker images返回如下结果,您可以看到拉取的镜像,说明拉取镜像成功。请您记下REPOSITORY和TAG,下一步需要使用。

执行如下命令,运行拉取的远程镜像。
说明您需要将命令中的
<REPOSITORY>和<TAG>替换为上一步获取的REPOSITORY和TAG。docker run -d -p 8000:80 <REPOSITORY>:<TAG>返回结果如下。

执行如下命令,访问HelloWorld服务。
返回结果如下,表示您已成功访问HelloWorld服务。
curl localhost:8000
清理资源
在完成实验后,如果无需继续使用资源,选择不保留资源,单击结束实操。在结束实操对话框中,单击确定。

在完成实验后,如果需要继续使用资源,选择付费保留资源,单击结束实操。在结束实操对话框中,单击确定。请随时关注账户扣费情况,避免发生欠费。
