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版本号等。
显示Docker信息:
查询镜像。OFFICIAL为OK的是官方镜像,默认搜索的是hub.docker.com。
拉取/下载镜像。默认是hub.docker.com(docker.io)上面的镜像,如果拉取公司内部的镜像或者其他仓库上的镜像,需要在镜像前面加上仓库的URL,如:
docker pull harbor.xxx.net/frontend:v1
拉取公网上的Nginx镜像:
推送镜像。把本地的镜像推送到公网仓库中,或者公司内部的仓库中。
默认登录和推送的是公网的镜像,如果需要推送到公司仓库或者其他仓库,只需要在镜像前面使用tag并加上URL即可:
前台启动一个容器:
[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:
查看当前正在运行的容器:
查看所有容器,包括已经退出的:
[root@K8S-master01 K8S-ha-install]# docker ps -a
查看正在运行的容器(即显示出容器的ID):
查看所有容器的ID,包括已经退出的:
进入到一个后台运行的容器(即之前用-d命令参数来指定后台运行方式的容器):
拷贝文件。双向拷贝,可以将本机的文件拷贝到容器,反之亦然:
删除已经退出的容器:
删除本机镜像。比如删除REPOSITORY为none的镜像:
镜像打标签(tag)。用于区分不同版本的镜像:
使用dockerbuild通过Dockerfile制作镜像。注意最后的一个点(.),表示使用当前目录的Dockerfile:
dockerbuild-t image_name:image_tag .
上述演示的都是Docker常用的基本命令,已可以满足日常需求,如果读者想要深入了解,可以参考Docker的相关资料。
2.1.3 Dockerfile的编写
Dockerfile是用来快速创建自定义镜像的一种文本格式的配置文件,在持续集成和持续部署时,需要使用Dockerfile生成相关应用程序的镜像,然后推送到公司内部仓库中,再通过部署策略把镜像部署到Kubernetes中。
通过Dockerfile提供的命令可以构建Dockerfile文件,Dockerfile的常用命令如下:
以下简单演示每个命令的使用方法。
使用RUN创建一个用户:
使用ENV定义环境变量并用CMD执行命令:
执行构建并启动测试:
使用ADD添加一个压缩包,使用WORKDIR改变工作目录:
使用COPY拷贝指定目录下的所有文件到容器,不包括本级目录。
此时只会拷贝webroot下的所有文件,不会将webroot拷贝过去:
设置启动容器的用户,在生产环境中一般不建议使用root启动容器,所以可以根据公司业务场景自定义启动容器的用户:
使用Volume创建容器可挂载点:
挂载Web目录到/data,注意,对于宿主机路径,要写绝对路径:
docker run -ti --rm -v `pwd`/web:/data centos:volume bash