容器实战学习 day01
怎么解决容器问题?
怎么让 Kubernetes 节点上的容器,从内部触发自己的容器重
启啊?
我试了一下,在容器中把第 1 号进程杀了,然后容器退出,Kubernetes 自动地把容器带
回来,就能实现类似的自动重启功能了,同事试了也可以,认为问题解决了,也挺开心
的。我也没有多想,以为自己找到方法了。后来又有一个同事和我说,这样做没有效果啊。
我这才发现问题没那么简单,是我想当然了。所以,我又花时间理了理 Linux 信号的基本知识,
trace 了一下内核代码,终于让我找到了真正的原因,那就是对于发送给 1 号进程的信号,
内核会根据不同的类型、不同的注册状态,采取不同的处理方式。
你看,这是一个挺简单的问题,就是 kill 一下容器里的 1 号进程。你或许也遇到过,如果
你也和我开始时的态度一样,就很可能会错过找到真正答案的机会。这就是我说的,解决
容器问题时我们需要的一个态度:不要浅尝辄止,要刨根问底。
容器的问题大多都会归结到 Linux 系统上。Linux 系统从内核、库函数
以及服务程序上看,虽然都是开源的,但是它运行在生产环境的时候,几乎就是一个黑
盒。
我们要实现两个学习目标。
第一,系统掌握容器核心点:Namespace 和 Cgroups。
第二,理解 Namespace 和 Cgroups 对 Linux 原来模块的影响,看看它们是如何影响一
些传统操作系统的行为。
动手做镜像
docker run -d centos/httpd:latest
- run 的意思就是要启动一个容器, -d 参数里 d 是 Daemon 的首字母,
也就是让容器在后台运行。最后一个参数 centos/httpd:latest 指定了具体要启动哪一个镜像,比如这里咱们启
动的是 centos/httpd 这个镜像的 latest 版本。 - 镜像就是一个特殊的文件系统,它提供了容器中程序执行需要的所有文件。具体来说,就是应用程序想启动,需要三类文
件:相关的程序可执行文件、库文件和配置文件,这三类文件都被容器打包做好
这样,在容器运行的时候就不再依赖宿主机上的文件操作系统类型和配置了,做到了想在
哪个节点上运行,就可以在哪个节点上立刻运行。
怎么来做一个容器镜像呢?
- Docker 为用户自己定义镜像提供了一个叫做 Dockerfile 的文件,在这个 Dockerfile 文件
里,你可以设定自己镜像的创建步骤。
我们首先要理解这个 Dockerfile 做了什么,其实它很简单,只有下面这 5 行:
# cat Dockerfile
FROM centos:8.1.1911
RUN yum install -y httpd
COPY file1 /var/www/html/
ADD file2.tar.gz /var/www/html/
CMD ["/sbin/httpd", "-D", "FOREGROUND"]
我们具体来看这个 Dockerfile 的每一行,第一个大写的词都是 Dockerfile 专门定义的指
令,也就是 FROM、RUN、COPY、ADD、CMD,这些指令都很基础,所以我们不做详细解释
了,你可以参考 Dockerfile 的官方文档。
启动一个容器
- docker run -d registry/httpd:v1
- docker ps
- docker exec 命令,也就是执行 docker exec c5a9ff78d9c1 ps -ef
容器是什么
要回答这个问题,你可以先记住这两个术语 Namespace 和 Cgroups。如果有人问你
inux 上的容器是什么,最简单直接的回答就是 Namesapce 和 Cgroups。Namespace
和 Cgroups 可以让程序在一个资源可控的独立(隔离)环境中运行,这个就是容器了。
- 运行 docker exec c5a9ff78d9c1 ps -ef
和 ps -ef 实质的区别在哪里呢?