你的第一个容器镜像,构建、分发、运行 [ K8s | from zero to hero ]

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 再也不要当容器小白了!Build ship and run!

什么是容器?

因为虚拟机(vm)存在一定不足,容器技术的诞生后才如此受欢迎。以传统的Java应用架构而言,将一个应用程序生成一个war包,放到一个tomcat容器当中并在一台虚拟机(VM)中启动运行,然后配置nginx的负载均衡策略,将来自用户的请求转发到某个tomcat应用上,这种基于主机或虚拟机部署的应用会存在以下问题:可移植性差、可维护性差、可扩展性差、无法资源隔离。扩展阅读

而容器是什么呢?它就是一个视图隔离、资源可限制、独立文件系统的进程集合。所谓“视图隔离”就是能够看到部分进程以及具有独立的主机名等;控制资源使用率则是可以对于内存大小以及 CPU 使用个数等进行限制。容器就是一个进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。

容器具有一个独立的文件系统,因为使用的是系统的资源,所以在独立的文件系统内不需要具备内核相关的代码或者工具,我们只需要提供容器所需的二进制文件、配置文件以及依赖即可。只要容器运行时所需的文件集合都能够具备,那么这个容器就能够运行起来。扩展阅读《详解 K8s 容器基本概念》

什么是容器镜像?

从一个比较具体的角度去看,镜像就是一个多层存储的文件,相较于普通的ISO系统镜像来说,分层存储会带来两个优点:

  • 一个是分层存储的镜像比较容易扩展,比如我们可以基于一个Ubuntu镜像去构建我们的Nginx镜像,这样我们只需要在Ubuntu镜像的基础上面做一些Nginx的安装配置工作。一个Nginx镜像工作就算制作完成了,我们不需要从头开始去制作各种镜像。
  • 另一点是可以优化镜像存储空间,假如我们有两个镜像,Tag1.0镜像和 Tag2.0镜像,我们如果以传统方式去传这两个镜像,每个镜像大概130多兆,但如果我们以分层的方式去存储两个镜像,我们通过下面两个紫色的才能共享,可以节约大量的空间,两个镜像加起来只需要140多兆的空间就可以存下来。这样一是节省了存储空间,二是可以减少网络上的开销,比如我们已经把下面镜像下载了,我们要去下载上面镜像的时候,我们只需要去下10M的部分。

如果从抽象的角度去看,Docker镜像其实是Docker提供的一种标准化的交付手段传统应用在交付的时候其实是交付一个可执行文j件。问题在于传统方式的这个可执行文件不包括它的运行环境,我们可能会因为32位系统或64位系统,或者开发测试使用1.0软件,结果交付时候发现用户的环境是2.0等各种各样的问题,导致我们要去花时间去排查;但是,如果我们以Docker镜像的标准化形式去交付,我们就会避免掉这些问题。

扩展阅读《Docker 镜像优化与最佳实践

**好了,闲话少叙。下面开始实验时间。
**

1. 实验概述

本实验会使用 Dockerfile 将下面 golang 代码构建成镜像,并通过阿里云镜像服务将镜像分发到阿里云虚拟机,运行该镜像。

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)
}

2. 实验目标

完成此实验后,可以掌握的能力有:

  1. Dockerfile 编写和使用
  2. 使用阿里云镜像服务来分发镜像。

NOTE: 学前建议: 了解 docker 的基本操作命令 以及 如何使用 ECS 实例。

3. 实验详情

3.1 准备应用代码和 Dockerfile

首先在本地生成一个文件夹 demo,并将 golang 代码拷贝到 demo 文件夹下的 main.go.

$ pwd
/tmp/demo

$ ls
main.go

$ cat main.go
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)
}

在当前 demo 目录下编写 Dockerfile ,如下所示

$ cat Dockerfile
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"]

3.2 构建镜像

通常情况下,使用以下命令即可构建镜像

$ pwd
/tmp/demo

# demo:v1 表示镜像名字demo和标签v1
$ docker build . -t demo:v1

Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM golang:1.12-alpine
 ---> 8ff3fd35cf82
Step 2/5 : WORKDIR /go/src/app
Removing intermediate container ffd88a948413
 ---> 1056ea513b89
Step 3/5 : COPY . .
 ---> 9fc4655c973a
Step 4/5 : RUN go install -v ./...
 ---> Running in 928fc776a6e1
app
Removing intermediate container 928fc776a6e1
 ---> a93f17a3a726
Step 5/5 : CMD ["app"]
 ---> Running in 9e3463aa81f6
Removing intermediate container 9e3463aa81f6
 ---> 8697c7279c74
Successfully built 8697c7279c74
Successfully tagged demo:v1

NOTE:

在国内访问 Docker Hub 速度比较慢,可以在Docker引擎中设置镜像加速器加速对Docker Hub的访问。

更新 /etc/docker/daemon.json,添加如下参数,并重启Docker引擎。

{
 "registry-mirrors": ["https://registry.docker-cn.com"]
}
构建完毕之后,可以在本地运行验证下是否符合预期

映射容器内 80 端到宿主机上的 8000 端口

$ docker run -d -p 8000:80 demo:v1

curl 一下查看结果

$ curl localhost:8000
Hello! World

如果看到 `Hello! World` 字样,我们就可以进入下一个环节了。

#### 3.3 推送镜像至阿里云容器镜像服务

在推送之前,需要注册阿里云账号和开通阿里云容器镜像服务

> 阿里云注册链接: [注册阿里云](https://account.aliyun.com/register/register.htm)
> 
> 阿里云登录链接: [登录阿里云](https://account.aliyun.com/login/login.htm)
> 
> 阿里云容器镜像服务页面: [访问阿里云容器镜像服务](https://cr.console.aliyun.com) 
> 
> 容器镜像服务(Container Registry)提供安全的应用镜像托管能力,精确的镜像安全扫描功能,稳定的国内外镜像构建服务,便捷的镜像授权功能,方便用户进行镜像全生命周期管理。

当我们拥有阿里云容器镜像服务账号之后呢,可以使用 docker 客户端来登陆服务。

$ docker login -username=** registry.cn-hangzhou.aliyuncs.com
Password:
Login Succeeded

在推送到镜像之前,需要将本地镜像修改为对应的镜像仓库地址:

mydemo 可以替换成自己的命名空间

$ docker tag demo:v1 registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1

$ docker push registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1

#### 3.4 登陆阿里云 ECS 机器来下载 demo:v1 镜像

登陆 ECS 实例,通过 docker pull 来下载镜像

mydemo 请替换成 3.3 步骤中指定的命令空间

$ docker pull registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1

下载完毕之后,我们就可以直接运行该镜像

$ docker run -d -p 8000:80 registry.cn-hangzhou.aliyuncs.com/mydemo/demo:v1

并查看 ECS 机器的 `8000` 端口

$ curl localhost:8000

另外,可以移步 《课后实践:应用容器构建与部署》
直接在阿里云大学沙箱实验环境中尝试哦!!

本文由阿里云容器云平台团队撰写,如有问题或希望转载还请与我们沟通,谢谢!

相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
17天前
|
Kubernetes 调度 Docker
深入探讨容器编排技术:从Docker到Kubernetes
容器编排在现代IT中日益关键,从Docker到Kubernetes,助力应用的自动化部署和扩展。Docker提供容器技术,打包应用及环境为镜像,通过引擎、镜像、容器、网络和存储组件实现隔离运行。Kubernetes作为高级容器编排平台,管理Pod(多容器集合),其核心包括API服务器、控制器管理器、调度器和Kubelet。Kubernetes集群由Master和Worker节点构成,实现Pod的高效调度和运行。
|
10天前
|
存储 Kubernetes C++
【专栏】Kubernetes VS Docker Swarm:哪个容器编排工具更适合你?
【4月更文挑战第27天】对比Kubernetes和Docker Swarm:K8s在可扩展性和自动化方面出色,有强大社区支持;Swarm以简易用著称,适合初学者。选择取决于项目需求、团队技能和预期收益。高度复杂项目推荐Kubernetes,快速上手小项目则选Docker Swarm。了解两者特点,助力选取合适容器编排工具。
|
8天前
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里云函数计算中,容器运行过程中的最大内存使用量获取如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
31 2
|
13天前
|
运维 Kubernetes Linux
10分钟搭建Kubernetes容器集群平台(kubeadm)
10分钟搭建Kubernetes容器集群平台(kubeadm)
|
13天前
|
Kubernetes Ubuntu Linux
Kubernetes(K8S)集群管理Docker容器(部署篇)
Kubernetes(K8S)集群管理Docker容器(部署篇)
|
13天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
13天前
|
Kubernetes Ubuntu Docker
Kubernetes(K8S v1.1版本) 集群管理Docker容器之部署篇
Kubernetes(K8S v1.1版本) 集群管理Docker容器之部署篇
|
22天前
|
安全 Linux Nacos
如何在CentOS使用Docker运行Nacos容器并实现无公网IP远程访问UI界面
如何在CentOS使用Docker运行Nacos容器并实现无公网IP远程访问UI界面
|
10天前
|
存储 监控 安全
【专栏】Docker Compose:轻松实现容器编排的利器
【4月更文挑战第27天】Docker Compose是款轻量级容器编排工具,通过YAML文件统一管理多容器应用。本文分三部分深入讨论其核心概念(服务、网络、卷和配置)、使用方法及最佳实践。从快速入门到高级特性,包括环境隔离、CI/CD集成、资源管理和安全措施。通过案例分析展示如何构建多服务应用,助力高效容器编排与管理。
|
8天前
|
存储 虚拟化 数据中心

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版
  • 推荐镜像

    更多