![再也不踩坑的kubernetes实战指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/323/27563323/b_27563323.jpg)
2.1 Docker基础
2.1.1 Docker介绍
Docker是一个开源的软件项目,在Linux操作系统上,Docker提供了一个额外的软件抽象层及操作系统层虚拟化的自动管理机制。Docker运行名为“Container(容器)”的软件包,容器之间彼此隔离,并捆绑了自己的应用程序、工具、库和配置文件。所有容器都由单个操作系统内核运行,因此比虚拟机更轻量级。
Docker利用Linux资源分离机制,例如cgroups及Linux Namespace来创建相互独立的容器(Container),可以在单个Linux实体下运行,避免了启动一个虚拟机造成的额外负担。Linux核心对Namespace(命名空间)的支持完全隔离了不同Namespace下的应用程序的“视野”(即作用范围),包括进程树、网络、用户ID与挂载的文件系统等,而核心cgroups则提供了资源隔离,包括CPU、存储器、Block I/O与网络。
2.1.2 Docker基本命令
本节介绍Docker的一些常用命令,这些命令有助于读者排查和解决集群中的问题。
查看Docker版本。包括Docker版本号、API版本号、Git Commit、Go版本号等。
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P62_57610.jpg?sign=1738895825-B0uk1OK8ZLCKquzzui9XlaG9d6Ko59cl-0-bfb065cad3e680a19e7c275c54cd14d5)
显示Docker信息:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P63_57612.jpg?sign=1738895825-qWstcmWZvhUjsL6gjZid8ZZuzRTuqmjU-0-3b4b2ca51e23103b50d248049a6ad485)
查询镜像。OFFICIAL为OK的是官方镜像,默认搜索的是hub.docker.com。
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P64_57614.jpg?sign=1738895825-PyvqwX19oZsrjWEVs2whkpmiC1DfGJEc-0-7ffd7d5e6b062e1cea3d01289c5de022)
拉取/下载镜像。默认是hub.docker.com(docker.io)上面的镜像,如果拉取公司内部的镜像或者其他仓库上的镜像,需要在镜像前面加上仓库的URL,如:
docker pull harbor.xxx.net/frontend:v1
拉取公网上的Nginx镜像:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P65_57617.jpg?sign=1738895825-9e5562rDWTR87F8n118W1noeDkoEv8T6-0-4975115f58c594ae3af0e1d29f2f0740)
推送镜像。把本地的镜像推送到公网仓库中,或者公司内部的仓库中。
默认登录和推送的是公网的镜像,如果需要推送到公司仓库或者其他仓库,只需要在镜像前面使用tag并加上URL即可:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P65_57618.jpg?sign=1738895825-ydlO5biFwbVBh6flLk75uL8U4mTwKo8d-0-7f48ca666d95e301bb0643aac1b6f94b)
前台启动一个容器:
[root@DockerTestServer ~]# docker run -ti nginx bash root@23bc7ccabb09:/#
后台启动:
[root@DockerTestServer ~]# docker run -tid nginx bash 1bcf5154d5c3a57d92a6796f526eac2cefd962aaca9cf4098689bfe830bb9e5e
端口映射。可以将本机的端口映射到容器的端口,比如将本机的1111端口映射到容器的80端口:
[root@DockerTestServer ~]# docker run -ti -p 1111:80 nginx bash root@cd676d572188:/#
挂载卷。可以将本机的目录挂载到容器的指定目录,比如将hosts文件挂载到容器的hosts:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P66_57623.jpg?sign=1738895825-V1syMyD6GS4cWU6dpa2LQ5sayiOfdRss-0-75ab612115ad58206102c62db0077998)
查看当前正在运行的容器:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P66_57624.jpg?sign=1738895825-WdsWSQ7PS9gKn7MSp8BAkVUQMiooQ03P-0-a118a64ed8a92da12d950d7a521a600f)
查看所有容器,包括已经退出的:
[root@K8S-master01 K8S-ha-install]# docker ps -a
查看正在运行的容器(即显示出容器的ID):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P66_57626.jpg?sign=1738895825-C7pcJMMZ46j8hYD9NHZkcDZXnO8aDpzc-0-986294155c3a41190b17e937f273aba8)
查看所有容器的ID,包括已经退出的:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57627.jpg?sign=1738895825-N1uhHQwFyI3epkEcfZyyWQ03UZ4RY56N-0-f9aadffd4211969c0aee0a2a7c216b86)
进入到一个后台运行的容器(即之前用-d命令参数来指定后台运行方式的容器):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57628.jpg?sign=1738895825-5fWtOeXlO44F6uCSY7ko1bSg0IoS0Kpx-0-045c3e7928b0b27a852969ed3656ce23)
拷贝文件。双向拷贝,可以将本机的文件拷贝到容器,反之亦然:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57629.jpg?sign=1738895825-XOBQOqB2hrbDzuSc4ygdAwnhzCsrG8lX-0-d7d2099ea0981af000016109c347d941)
删除已经退出的容器:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57631.jpg?sign=1738895825-e4Q8O6gQpJQGncE3DILAk4wwSaICFjoL-0-fa37fd651d2379d8173bebd8ae0c3f20)
删除本机镜像。比如删除REPOSITORY为none的镜像:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57632.jpg?sign=1738895825-kBPIB32O1ZgCxWxGHXGoRHyBpyicTzCs-0-bed3cb47fb0997db06e34bebfa52a373)
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P68_57633.jpg?sign=1738895825-EYA09SqyJtujP2Pp8dHi6H1tcMH5SFrV-0-b75f1ea13d20966adb03f8b8513c2195)
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P69_57634.jpg?sign=1738895825-gn06qdnllGf681jkYF0maeU1GpU8mycF-0-51e705c5afc3f5c6c6d7fa99b43502c7)
镜像打标签(tag)。用于区分不同版本的镜像:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P69_57635.jpg?sign=1738895825-AlsWVIxBTaKgLZSYy0S1Q9wCAy7714kt-0-175032272e6ee4045f1af399d757e14a)
使用dockerbuild通过Dockerfile制作镜像。注意最后的一个点(.),表示使用当前目录的Dockerfile:
dockerbuild-t image_name:image_tag .
上述演示的都是Docker常用的基本命令,已可以满足日常需求,如果读者想要深入了解,可以参考Docker的相关资料。
2.1.3 Dockerfile的编写
Dockerfile是用来快速创建自定义镜像的一种文本格式的配置文件,在持续集成和持续部署时,需要使用Dockerfile生成相关应用程序的镜像,然后推送到公司内部仓库中,再通过部署策略把镜像部署到Kubernetes中。
通过Dockerfile提供的命令可以构建Dockerfile文件,Dockerfile的常用命令如下:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P69_57637.jpg?sign=1738895825-4shTGi4qgCz9bzbx3maYsvlnT18x9WT3-0-251ac078f74e81160b6a91899c1d4b06)
以下简单演示每个命令的使用方法。
使用RUN创建一个用户:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P69_57638.jpg?sign=1738895825-ZDd4Cy9Ha26EC4jVwB7LmtU075aImAHN-0-0c683ec583ec6812a5e62313ddd93a90)
使用ENV定义环境变量并用CMD执行命令:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57640.jpg?sign=1738895825-HLCL4KhrWnubcEEt8wCzOgdTlEHNlKxy-0-fa7bfa00c6d93ea102970debfa5d035a)
执行构建并启动测试:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57641.jpg?sign=1738895825-qNeZrE3a50cdefIQH1i4ABpLNDLUomah-0-94dd425392633f73cc726d89645c241d)
使用ADD添加一个压缩包,使用WORKDIR改变工作目录:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57642.jpg?sign=1738895825-K8eGoDpaCWiR8zLXMTI0DU2D4REWuCZy-0-5a1df607c3090494349f3f8d6406ce96)
使用COPY拷贝指定目录下的所有文件到容器,不包括本级目录。
此时只会拷贝webroot下的所有文件,不会将webroot拷贝过去:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_14572.jpg?sign=1738895825-jGCBTDdssygKvEYdxid0x1QzHaK41uNN-0-ac7cfafaf3d7138f5ce79ed009a1be9d)
设置启动容器的用户,在生产环境中一般不建议使用root启动容器,所以可以根据公司业务场景自定义启动容器的用户:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57644.jpg?sign=1738895825-51wK1OsVkTxdjohGo5otWUBxsaJFh0bl-0-ef7ef8db6c129fdbef17673b3b4860f9)
使用Volume创建容器可挂载点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57645.jpg?sign=1738895825-PaJrFzwPEg7UWkH9JqjkPEVrJzFsz5nB-0-3d79601843c7b7c7043bfa7e38710407)
挂载Web目录到/data,注意,对于宿主机路径,要写绝对路径:
docker run -ti --rm -v `pwd`/web:/data centos:volume bash