![再也不踩坑的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=1738845281-hu8maawMs3ST6eiKX2RyLwJ9hFVCgrf4-0-a48f996f47e539783854341219f0b99e)
显示Docker信息:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P63_57612.jpg?sign=1738845281-sZZr9nAZeEooLodWrAhmme2o37aOOdkt-0-757c4c6ce8ebaddb22af565acd460192)
查询镜像。OFFICIAL为OK的是官方镜像,默认搜索的是hub.docker.com。
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P64_57614.jpg?sign=1738845281-NdJl6AAh6JsuoW8OnD0XeGu6FHT5VonN-0-dbb28245157d11832dfbd21615a37077)
拉取/下载镜像。默认是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=1738845281-9IxHfkYm1Lgo4qTTNqpJMDYLYbEL3eEo-0-e0b681d00a4eff5bbaed0c002e22e176)
推送镜像。把本地的镜像推送到公网仓库中,或者公司内部的仓库中。
默认登录和推送的是公网的镜像,如果需要推送到公司仓库或者其他仓库,只需要在镜像前面使用tag并加上URL即可:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P65_57618.jpg?sign=1738845281-nUVTp0poP3Y0CCNKTx8GhU0OY3CISFzr-0-7eb8e7ff163d7adf138745b1cff85d35)
前台启动一个容器:
[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=1738845281-6CY5emgO4RiBSumILGFgp3ZrrMXuJgPU-0-93b1f0e6ffaa3149692d4924d3fa7dc4)
查看当前正在运行的容器:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P66_57624.jpg?sign=1738845281-3IsDMECaybLv2QMr3aEaz3At2dQtjDbP-0-b4114edef397f96a6854a3f8367f528c)
查看所有容器,包括已经退出的:
[root@K8S-master01 K8S-ha-install]# docker ps -a
查看正在运行的容器(即显示出容器的ID):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P66_57626.jpg?sign=1738845281-SdpUe6vIvLUtZb0WAtLW5QsPRVfMoxh1-0-6d073f4ec59872d6bee55e831cd0e9a6)
查看所有容器的ID,包括已经退出的:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57627.jpg?sign=1738845281-ddczfoK0jBUr9yj7hVvzpSqw863XyXsT-0-abdcde3aee341873e1db18340e32ebaa)
进入到一个后台运行的容器(即之前用-d命令参数来指定后台运行方式的容器):
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57628.jpg?sign=1738845281-R5Piv6ywG7szbaFW1PwJ8BuxzmOgPDos-0-dede39acc7debe3bfce7290eed945d54)
拷贝文件。双向拷贝,可以将本机的文件拷贝到容器,反之亦然:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57629.jpg?sign=1738845281-iERugELKab7z97yQwhf5NW2AgIbKBc2t-0-18e1deffdf93ded89770baefb376d6ed)
删除已经退出的容器:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57631.jpg?sign=1738845281-xqBQio5KgzTT2p8fvV4pV8cKzmPlQYub-0-fc201f87c7ef65bcdacbe5b007aee833)
删除本机镜像。比如删除REPOSITORY为none的镜像:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P67_57632.jpg?sign=1738845281-EkomEl2yrGtCCS4t2sMxjUN020jslbsu-0-cc4227ca099b5e1c1f6b79e8ff578386)
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P68_57633.jpg?sign=1738845281-LAszOs9XD150Xl29yyZg7qSqDUCTDCTx-0-200c0848cdbf08780336e4cce7984e21)
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P69_57634.jpg?sign=1738845281-zP5nZ9TNGEkWK1Xc9A1QUEUYj18j9KRm-0-530d36abff7a6e4a84b77b0d4d2f00a1)
镜像打标签(tag)。用于区分不同版本的镜像:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P69_57635.jpg?sign=1738845281-RJijMsmZBIAWZWC5E31LYGxb4LlhoO50-0-6d269c2ce706483fde01053804551799)
使用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=1738845281-h2VD5YsUi4RTovtB6huJ8YMjZ9OO1EGx-0-b11381599da8bdbe1e2df198ec30a700)
以下简单演示每个命令的使用方法。
使用RUN创建一个用户:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P69_57638.jpg?sign=1738845281-ybsCVbvCXqQpr2d9EWdcpsT3PBfi9zPr-0-6fe8d18c20000c63f84cb68d477ad6fb)
使用ENV定义环境变量并用CMD执行命令:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57640.jpg?sign=1738845281-WDnakMpfJbmVNhoiwmM8szbBHKlgqpiA-0-72c0cb20c1eb2db67a8f5be11f64d6e8)
执行构建并启动测试:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57641.jpg?sign=1738845281-nSEZLE0qdo5aXPzrQ4hkiza5QQJjtvFG-0-a367c462df6f664f5529bc5cdb6c7f32)
使用ADD添加一个压缩包,使用WORKDIR改变工作目录:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57642.jpg?sign=1738845281-kq0EbVtVweLIGRxJUsQYdbNJEeO5auS1-0-ac0f7431dc9fb4e360ddc57aa9a55b28)
使用COPY拷贝指定目录下的所有文件到容器,不包括本级目录。
此时只会拷贝webroot下的所有文件,不会将webroot拷贝过去:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_14572.jpg?sign=1738845281-4nGERov6x6YMvT31QWAabnw77bfig8Kq-0-495996aa3b67b60f069b1723f5db7afa)
设置启动容器的用户,在生产环境中一般不建议使用root启动容器,所以可以根据公司业务场景自定义启动容器的用户:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57644.jpg?sign=1738845281-tFmTuyKtZbc3RgATxXQ24oENG8J1AhTI-0-603d6bceb184ada5e6ea7484857cce08)
使用Volume创建容器可挂载点:
![](https://epubservercos.yuewen.com/62A1DF/15825992304144506/epubprivate/OEBPS/Images/Figure-P70_57645.jpg?sign=1738845281-pLl3nN3V1NxxcYGgerMDJEFbNsUlzInZ-0-bf22f1d1d018dda3ee05e75fc067896b)
挂载Web目录到/data,注意,对于宿主机路径,要写绝对路径:
docker run -ti --rm -v `pwd`/web:/data centos:volume bash