k8s 怎么手动拉取docker镜像

举报
i-WIFI 发表于 2024/09/23 09:13:19 2024/09/23
【摘要】 首先我们需要安装 ​​docker​​ 来打包镜像,如果你本地已经安装了 ​​docker​​推荐安装方法目前使用 Docker Desktop 来安装 docker 还是最简单的方案,打开官网下载对应你电脑操作系统的包即可当安装完成后,可以通过 ​​docker run hello-world​​ 来快速校验是否安装成功!安装 minikube我们还需要搭建一套 k8s 本地集群 (使用云...

首先我们需要安装 ​docker​ 来打包镜像,如果你本地已经安装了 ​docker​

推荐安装方法

目前使用 Docker Desktop 来安装 docker 还是最简单的方案,打开官网下载对应你电脑操作系统的包即可

当安装完成后,可以通过 ​docker run hello-world​ 来快速校验是否安装成功!

安装 minikube

我们还需要搭建一套 k8s 本地集群 (使用云厂商或者其它 k8s 集群都可) 。本地搭建 k8s 集群的方式推荐使用 minikube。

可以根据 minikube 快速安装 来进行下载安装,这里简单列举 MacOS 的安装方式,Linux & Windows 操作系统可以参考官方文档 快速安装。

brew install minikube

启动 minikube

因为 minikube 支持很多容器和虚拟化技术 (Docker, Hyperkit, Hyper-V, KVM, Parallels, Podman, VirtualBox, or VMware Fusion/Workstation),也是问题出现比较多的地方,所以这里还是稍微说明一下。

如果你使用 ​​docker​​ 的方案是上面推荐的 Docker Desktop ,那么你以下面的命令启动 minikube 即可,需要耐心等待下载依赖。

minikube start --vm-driver docker --container-runtime=docker

启动完成后,运行 ​​minikube status​​ 查看当前状态确定是否启动成功!

如果你本地只有 Docker CLI,判断标准如果执行 ​​docker ps​​​ 等命令,返回错误 ​​Cannot connect to the Docker daemon at unix:///Users/xxxx/.colima/docker.sock. Is the docker daemon running?​​ 那么就需要操作下面的命令。

brew install hyperkit
minikube start --vm-driver hyperkit --container-runtime=docker

# Tell Docker CLI to talk to minikube's VM
eval $(minikube docker-env)

# Save IP to a hostname
echo "`minikube ip` docker.local" | sudo tee -a /etc/hosts > /dev/null

# Test
docker run hello-world

minikube 命令速查

​minikube stop​​ 不会删除任何数据,只是停止 VM 和 k8s 集群。

​minikube delete​​ 删除所有 minikube 启动后的数据。

​minikube ip​​ 查看集群和 docker enginer 运行的 IP 地址。

​minikube pause​​ 暂停当前的资源和 k8s 集群

​minikube status​​ 查看当前集群状态

安装 kubectl

这一步是可选的,如果不安装的话,后续所有 ​​kubectl​​​ 相关的命令,使用 ​​minikube kubectl​​ 命令替代即可。

如果你不想使用 ​​minikube kubectl​​​ 或者配置相关环境变量来进行下面的教学的话,可以考虑直接安装 ​​kubectl​​。

brew install kubectl

注册 docker hub 账号登录

因为默认 minikube 使用的镜像地址是 DockerHub,所以我们还需要在 DockerHub 账号,

并且使用 login 命令登录账号。

docker login

Container

我们的旅程从一段代码开始。新建一个 ​​main.go​​ 文件,复制下面的代码到文件中。

package main

import (
	"io"
	"net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
	io.WriteString(w, "[v1] Hello, Kubernetes!")
}

func main() {
	http.HandleFunc("/", hello)
	http.ListenAndServe(":3000", nil)
}

上面是一串用 Go 写的代码,代码逻辑非常的简单,首先启动 HTTP 服务器,监听 ​​3000​​​ 端口,当访问路由 ​​/​​​的时候 返回字符串 ​​[v1] Hello, Kubernetes!​​。

在以前,如果你想将这段代码运行起来并测试一下。你首先需要懂得如何下载 golang 的安装包进行安装,接着需要懂得 ​​golang module​​ 的基本使用,最后还需要了解 golang 的编译和运行命令,才能将该代码运行起来。甚至在过程中,可能会因为环境变量问题、操作系统问题、处理器架构等问题导致编译或运行失败。

但是通过 Container (容器) 技术,只需要上面的代码,附带着对应的容器 ​​Dockerfile​​ 文件,那么你就不需要 golang 的任何知识,也能将代码顺利运行起来。

Container (容器) 是一种沙盒技术。它是基于 Linux 中 Namespace / Cgroups / chroot 等技术组合而成,更多技术细节可以参照这个视频 如何自己实现一个容器。

下面就是 Go 代码对应的 ​​Dockerfile​​​,简单的方案是直接使用 golang 的 alpine 镜像来打包,但是因为我们后续练习需要频繁的推送镜像到 DockerHub 和拉取镜像到 k8s 集群中,为了优化网络速度,我们选择先在 ​​golang:1.16-buster​​​ 中将上述 Go 代码编译成二进制文件,再将二进制文件复制到 ​​base-debian10​​ 镜像中运行 (Dockerfile 不理解没有关系,不影响后续学习)。

这样我们可以将 300MB 大小的镜像变成只有 20MB 的镜像,甚至压缩上传到 DockerHub 后大小只有 10MB!

# Dockerfile
FROM golang:1.16-buster AS builder
RUN mkdir /src
ADD . /src
WORKDIR /src

RUN go env -w GO111MODULE=auto
RUN go build -o main .

FROM gcr.io/distroless/base-debian10

WORKDIR /

COPY --from=builder /src/main /main
EXPOSE 3000
ENTRYPOINT ["/main"]

需要注意 ​​main.go​​​ 文件需要和 ​​Dockerfile​​​ 文件在同一个目录下,执行下方 ​​docker build​​ 命令,第一次需要耐心等待拉取基础镜像。并且需要注意将命令中 guangzhengli 替换成自己的 DockerHub 注册的账号名称。 这样我们后续可以推送镜像到自己注册的 ​​DockerHub​​ 仓库当中。

docker build . -t guangzhengli/hellok8s:v1
# Step 1/11 : FROM golang:1.16-buster AS builder
# ...
# ...
# Step 11/11 : ENTRYPOINT ["/main"]
# Successfully tagged guangzhengli/hellok8s:v1


docker images
# guangzhengli/hellok8s          v1         f956e8cf7d18   8 days ago      25.4MB

​docker build​​​ 命令完成后我们可以通过 ​​docker images​​​ 命令查看镜像是否 build 成功,最后我们执行 ​​docker run​​​ 命令将容器启动, ​​-p​​​ 指定 ​​3000​​​ 作为端口,​​-d​​ 指定容器后台运行。

docker run -p 3000:3000 --name hellok8s -d guangzhengli/hellok8s:v1

运行成功后,可以通过浏览器或者 ​​curl​​​ 来访问 ​​http://127.0.0.1:3000​​​ , 查看是否成功返回字符串 ​​[v1] Hello, Kubernetes!​​。

这里因为我本地只用 Docker CLI,而 docker runtime 是使用 ​​minikube​​​,所以我需要先调用 ​​minikube ip​​​ 来返回 minikube IP 地址,例如返回了 ​​192.168.59.100​​​,所以我需要访问 ​​http://192.168.59.100:3000​​​ 来判断是否成功返回字符串 ​​[v1] Hello, Kubernetes!​​。

最后确认没有问题,使用 ​​docker push​​​ 将镜像上传到远程的 ​​DockerHub​​​ 仓库当中,这样可以供他人下载使用,也方便后续 ​​Minikube​​ 下载镜像使用。 需要注意将 guangzhengli 替换成自己的 DockerHub 账号名称

docker push guangzhengli/hellok8s:v1

经过这一节的练习,有没有对容器的强大有一个初步的认识呢?可以想象当你想部署一个更复杂的服务时,例如 Nginx,MySQL,Redis。你只需要到 DockerHub 搜索 中搜索对应的镜像,通过 ​​docker pull​​​ 下载镜像,​​docker run​​ 启动服务即可!而无需关心依赖和各种配置

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。