Kubernetes实践讲解——基于RancherV2.3.5

一、Docker

Docker是什么

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口 ————百度百科

简单来说,Docker镜像就是存放一个或者多个应用的系统。

Docker优点

一个优秀的项目之所以优秀,完全是因为他们的优点的突出(废话

  • Automating the packaging and deployment of applications(使应用的打包与部署自动化)
  • Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
  • Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
  • Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)

可以实现应用程序的自动化部署,这不得不说对开发还是运维来讲这是非常nice的,不需要被测试来回的催促是否将修改的bug部署上去,在Kubernetes的时候还可以实现不停机部署,那种舒适度岂是一个爽字可以描述。

Docker局限

没有什么应用可以实现一切,只是做了比优秀更好

  1. Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
  2. LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
  3. 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
  4. 网络管理相对简单,主要是基于namespace隔离
  5. cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
  6. Docker对disk的管理比较有限
  7. container随着用户进程的停止而销毁,container中的log等用户数据不便收集

虽然有这么多的局限性,但是也无法掩盖Docker的发光点,使用的丝滑。

Image(镜像)

正如开头讲的,Docker是让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,那么镜像又是什么呢?

操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系 统。

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文 件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含任何动态数据,其内容在构建之后也不会被改变。

因为镜像包含了操作系统完整的root文件系统,所占有的空间往往会非常的大,所以Docker在设计的使用使用了UnionFS的技术,进行分层存储。

分层存储是怎么实现的呢?

rancher docker关系 docker和rancher区别_ubuntu

简单的说,就是你在Dockerfile中写的几行命令就会有几层的镜像层。

在镜像构建的过程中,也是一层层的进行构建的,所以前一层总是后一层的基础,当镜像层构建完成后不在改变,新的镜像只会构建新的镜像层,而没有发生改变的镜像层会使用之前构建好的。这个也是为什么第一次构建的时候时间会比后期用的时间长的原因。

rancher docker关系 docker和rancher区别_rancher docker关系_02

使用镜像
获取镜像,获取镜像的命令为:
docker pull  [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

例子

docker pull ubuntu
启动镜像
docker run -it --rm ubuntu:16.04  /bin/bash
  • -it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • –rm :这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容 器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果, 不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
  • ubuntu:16.04 :这是指用 ubuntu:16.04 镜像为基础来启动容器。
  • /bin/bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash 。
  • 进入镜像后,可以使用基础的shell指令 退出exit
列出镜像
docker image ls

列出部分镜像

docker image ls ubuntu

列出特定的某个镜像,也就是说指定仓库名和标签

docker image ls ubuntu:16.04
查看所有容器
docker ps -a

启动已经停止的容器

docker start [CONTAINER ID]

停止启动的容器

docker stop [CONTAINER ID]

docker restart 重启

导入和导出镜像

导出 [CONTAINER ID] 快照到本地的地址/文件名.tar

docker export [CONTAINER ID]  本地的地址/文件名.tar

可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1

cat docker/ubuntu.tar | docker import - test/ubuntu:v1
删除容器
docker rm -f [CONTAINER ID]
删除镜像
docker rmi 镜像名/[CONTAINER ID]
构建镜像
docker build -t 镜像名:标签  .

一定不要忘记构建的标点

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
设置标签
docker tag [CONTAINER ID] 新的名字和标签
docker tag 860c279d2fec runoob/centos:dev

Dockerfile

一切的一切的根源,docker的构建起于此。

指令

作用

FROM

指定基础镜像

RUN

执行命令

COPY

复制文件,从上下文目录中复制文件或者目录到容器里指定路径。

ADD

复制文件、可以解压文件,在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

CMD

容器启动命令

ENTRYPOINT

如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

ENV

设置环境变量

AGE

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

EXPOSE

仅仅只是声明端口。

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

ONBUILD

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式

FROM golang:1.9-alpine
RUN apk --no-cache add git
WORKDIR /go/src/github.com/go/helloworld/
RUN go get -d -v github.com/go-sql-driver/mysql
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/go/helloworld/app .
CMD ["./app"]