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

  • 容器镜像的版本管理

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

1.2创建一个简单的web应用

  • 编写js代码

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

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

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

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

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
 return "

Hello, World!

" 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

你可能感兴趣的:(k8s(二)基础使用-制作docker镜像)