k8s(二)基础使用-制作docker镜像

1.创建、运行及共享容器镜像

1.1安装 Docker并运行第一个“Helloworld”容器

  • 运行Hello World容器

busybox是一个单一可执行文件,包含多种标准 UNIX命令行工具如 : echo、ls、gzip 等.除了包含 echo 命令的 busybox 命令,也可以使用如 Fedora、 Ubuntu 等功能完备的镜像 。

image-20230218102025589.png

目前的应用是单一可执行文件 (busybox) ,但也可以是一个有许多依赖的复杂应用。 整个配 置运行应用的过程是完全一致的。 同样重要的是应用是在容器内部被执行的,完全独立于其他所有主机上运行的进程。

  • 背后原理

    • 键入命令docker run之后,docker首先会检查镜像是否存在于本地库

    • 如果没有docker会从远程库查找此镜像并下载到本地

    • 之后docker依据这个镜像创建一个容器并在容器中运行命令

    • echo打印文字到标准输出流,然后进程终止容器ring值运行

image-20230218102238119.png
  • 运行其他镜像

在浏览器中搜索 http:/hub. docker.com或其他公开的镜像中心的可用镜像之后,可以像这样在 Docker中运行镜像:
$ docker run <image>

  • 容器镜像的版本管理

所有的软件包都会更新, 所以通常每个包都不止一个版本。 Docker支持同一镜像的多个版本。每一个版本必须有唯一的 tag名。 当引用镜像没有显式地指定 tag时, Docker会默认指定 tag为 latest。 如果想要运行别的版本的镜像, 需要像这样指定镜像的版本:
$ docker run <image>:<tag>

1.2创建一个简单的web应用

  • 编写js代码

构建一个简单的flask Web 应用,并把它打包到容器镜像中 。这个应用会接收 HTTP 请求并响应应用运行的主机名 。

这样应用运行在容器中,看到的是自己的主机名而不是宿主机名,即使它也像其他进程一样运行在宿主机上 。

当应用部署 在 Kubernetes 上并进行伸缩时(水平伸缩,复制应用到多个节点),你会发现 HTTP 请求切换到了应用的不同实例上 。

应用包含一个名为 app. py的文件,详见下面的代码清单。

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
 return "<p>Hello, World!</p>"

if __name__ == "__main__":
 app.run(host="0.0.0.0", port=5050)

注意:返回的主机名是服务器真实的主机名,不是客户端发出的 HTTP 请求中头的 Host 字段。

1.3 为镜像创建Dockerfile

为了把应用打包成镜像,首先需要创建一个叫 Dockerfile 的文件,它包含了一系列构建镜像时会执行的指令 。

Dockerfile 文件需要和 app.py文件在同一目录,并包含下面代码清单中的命令 。

FROM ubuntu:20.04 # 基础镜像

RUN apt-get update && apt-get install -y python3.8 python3-pip # 安装python

RUN python3 -m pip install --upgrade pip setuptools==45.2.0 # 更新包管理工具

RUN python3 -m pip install flask # 安装flask

COPY app.py /app.py # 拷贝项目文件到容器内

CMD ["python3", "app.py"] # 执行命令

1.4构建容器镜像

  • 构建命令

现在有了 Dockerfile 和 app.js 文件,这是用来构建镜像的所有文件 。 运行下面 的 Docker命令来构建镜像:
$ docker build -t kubia .

image-20230218110810750.png

  • 镜像如何构建的

    • 用户告诉 Docker 需要 基 于当前目录(注意命令 结尾的点)构建一个叫 kubia 的镜像

    • Docker会在目录中寻找 Dockerfile,然后基于其中的指令构建镜像 。

    • 构建过程不是由 Docker 客户端进行的,而是将整个目录的文件上传到 Docker守护进程并在那里进行的。

    • Docker客户端和守护进程不要求在同一台机器上。

    • 在构建过程中,Docker 首次会从公开的镜像仓库( Docker Hub)拉取基础镜像(node:7),除非己经拉取过镜像并存储在本机上了。


      image-20230218110858843.png
  • 镜像分层

    • 镜像不是一个大的二进制块,而是由多层组成的

    • 如果创建了多个基于相同基础镜像(比如例子中的 node : 7)的镜像,所有组成基础镜像的分层只会被存储 一 次 。

    • 拉取镜像的 时候, Docker会独立下载每一层 。一些分层可能已经存储在机器上了,所以 Docker 只会下载未被存储的分层 。

    • 镜像构建的过程中,拉取基础镜像所有分层之后, Docker在它们上面创建一个新层并且添加 app. js

    • 然后会创建另 一层来指定镜像被运行时所执行的命令。 最后一层会被标记为 kubia:latest。

    • other : latest 的镜像如何与我们构 建的镜像共享同一层 Node.js镜像。


      image-20230218115520278.png

1.5 运行容器

  • docker images查看本地镜像


    image-20230218115819078.png
  • 启动镜像
    docker run --name kubia-container -p 5050:5050 -d kubia
    这条命令告知 Docker基于 kubia 镜像创建一个叫 kubia-container 的新容器 。

这个容器与命令行分离( -d 标志),这意味着在后台运行 .

本机上的5050端口会被映射到容器内的5050端口( -p 5050: 5050 选项),所以可以通过 http:// localhost:5050 访问这个应用 。


image-20230218131154441.png
  • 获取容器更多信息
    $ docker inspect kubia-container

1.6探索容器内部

由于一个容器里可以运行多个进程,所以总是可以运行新的进程去看看里面发生了什么。如果镜像里有可用的shell二进制可执行文

件,也可以运行一个shell。

  • 在已有的容器内部运行shell
    $ docker inspect kubia-container

  • 这会在己有的 kubia-container 容器内部运行 bash。 bash进程会和主容器进程拥有相同的命名空间。

  • 这样可以从内部探索容器, 查看Node.js和应用是如 何在容器里运行的

  • -it 选项是下面两个选项的简写

    • -i,确保标准输入流保持开放 。 需要在 shell 中输入命令。

    • -t,分配一个伪终端(TTY)。

  • 从内部探索容器-容器内部只能看到三个进程 web服务、内部运行的shell和ps


    image-20230218132125358.png
  • 从外部探索容器-宿主机依然可以看见容器内的进程


    image-20230218132523002.png

这证明了运行在容器中的进程是运行在主机操作系统上的。

进程的 ID 在 容器中与主机上不同,容器使用独立的 PID Linux 命名 空间并且 有着独立的系列号,完全独立于进程树。

  • 容器的文件系统也是独立的

  • 正如拥有独立的进程树一样,每个容器也拥有独立的文件系统。

  • 在容器内列出 根目录的内容,只会展示容器内的文件,包括镜像内的所有文件,再加上容器运行时创建的任何文件(类似日志文件)


    image-20230218132752227.png
  • 此外应用不仅拥有独立 的文件系统,还有进程 、 用户、主机名和网络接口 。

  • 出错时,需要做的第 一件事是查看应用运行的系统的真实状态 。

  • 退出容器


    image-20230218133000811.png

1.7停止和删除容器

  • 可以通过告知 Docker停止 kubia-container 容器来停止应用 :
    $ docker stop kubia-container
    [图片上传失败...(image-d921dd-1676888083150)]

  • 因为没有其他的进程在容器内运行,这会停止容器内运行的主进程。

  • 容器本身仍然存在并且可以通过 docker ps -a 来查看 。 -a 选项打印出所有的容器,包括运行中的和己经停止的。

  • 想要真正地删除一个容器 ,需要运行
    $ dcoker rm kubia-container

    image-20230218133607328.png

  • 这会删除容器,所有的内容会被删除并且无法再次启动 。

1.8向仓库推送镜像

  • 现在构建的镜像只可以在本机使用 。 为了在任何机器上都可以使用,可以把镜像推送到一 个外部的镜像仓库

  • 在推送之前,需要重新根据 Docker Hub 的规则标注镜像 。 Docker Hub允许向以你的 Docker Hub ID 开头的镜像仓库推送镜像

  • 一旦知道了自己的 ID,就可以重命名镜像,现在镜像由 kubia 改为 amazingquyj/ kubia:
    docker tag kubia amazingquyj/kubia

  • 这不会重命名标签,而是给同一个镜像创建 一 个额外的标签 。 可以通过 docker images 命令列出本机存储的镜像来加以确认


    image-20230218141230860.png
$ docker login
$ docker push amazingquyj/kubia
image-20230218142727470.png
  • kubia和amazingquyj/kubia指向同一个镜像ID,所以实际上是同一个镜像的两个标签。

  • 在向 Docker Hub 推送镜像之前,先需要使用 docker login 命令和自己的用 户ID登录,然后就可以像这样向 DockerHub推送 yourid/kubia镜像 :

  • 在其他机器上运行此镜像


    image-20230218143136589.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容