vlambda博客
学习文章列表

k8s系列教程-docker基础知识

认识docker

docker是Docker.inc 公司开源的一个基于LXC技术之上构建Container容器引擎技术,Docker基于容器技术的轻量级虚拟化解决方案,实现一次交付到处运行。docker实现程序集装箱的概念,把我们需要交付的内容集装聚合成一个文件(镜像文件)直接交付。

docker 基本原理

docker 架构图:

从架构图中我们可以看出,docker有三大核心,包括容器,仓库,镜像

  • 镜像(image):文件的层次结构,以及包含如何运行容器的元数据
  • 容器(container):容器是镜像创建的运行实例,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看作是一个简易版的linux环境,Docker利用容器来运行应用
  • 仓库(repository):仓库是集中存放镜像文件的场所,仓库注册服务器上往往存放着多个仓库,每个仓库中又保存了很多镜像文件,每个镜像文件有着不同的标签。

docker 具有如下特性:

  • 文件系统隔离:每个进程容器运行在完全独立的根文件系统中
  • 资源限制:每个进程容器运行在自己的网络命名空间中,拥有自己的虚拟接口和ip地址等
  • 写时复制:由于镜像采用层式文件系统,所以采用写时复制方式创建镜像的根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间
  • 日志记录:docker会收集和记录每个进程容器的标准流,用于实时检索或批量检索。不消耗本地io
  • 变更管理:容器文件系统的变更可以提交到新的镜像中,并可以重复使用以创建更多容器。
  • 交互式shell:docker可以分配一个虚拟终端并关联到任何容器的标准输入上。
  • namespace隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和ip地址等

docker 工作流程图:

k8s系列教程-docker基础知识

docker 工作流程大体分为三步:

  • build:制作镜像,镜像如同一个集装箱,封装了包括文件,运行环境等资源
  • Ship: 运输镜像,将制作好的镜像上传到仓库中,以便拉取
  • Run: 运行镜像,通过镜像创建一个容器

docker容器及镜像结构:


Docker 支持通过扩展现有镜像,创建新的镜像,新镜像是从 base 镜像一层一层叠加生成的,每新增一个应用,就会叠加一层镜像。镜像分层的好处就是共享资源,比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker 只需在磁盘上保存一份 base 镜像, 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。

当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

dockers基础操作

docker 原理我们基本普及了,接下来我们进入实战环节。接下来我们将在windows操作系统上安装docker desktop,需要注意的地方就是windows系统不能是家庭版的,需要开启虚拟化,需要安装WSL2。具体的流程我就不介绍了,网上能找到比较多的例子

docker 安装完成之后,我们可以运行一个hello world 镜像测试:

docker run hello-world

命令行窗口输出拉取镜像运行的日志,接下来对镜像和容器进行查看删除等操作:

## 查看正在运行的容器
docker ps

## 查看所有容器
docker ps -a 

## 查看镜像
docker images

## 删除镜像

docker rm 容器id

## 删除镜像
docker rmi 镜像id

## 拉取远程仓库镜像
docker pull nginx

## 进入容器
docker exec -it 镜像id /bin/bash

docker 实战

接下来我们创建一个springboot应用并制作成镜像,maven依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
      
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
      
  </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <repository>${project.artifactId}</repository>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                    <tag>${project.version}</tag>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

然后在pom文件的同级目录下创建 Dockerfile:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

dockerfile-maven-plugin 是制作镜像的maven插件,插件和build默认绑定,执行build阶段运行该插件,push绑定到deploy阶段。

而dockerfile是制作镜像的描述文件。Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。Dockerfile参数说明:

在我们执行 mvn package指令时会在命令行输出整个docker镜像的制作过程,并在后续能在docker中通过docker images 查看该镜像。制作好的镜像只是存在我们的本地中,我们可以推到远程仓库到其他机器上运行,而几大云平台都提供了免费的远程私有仓库,比如阿里云效和腾讯云coding。后续如果有时间会出Jenkins+docker+springboot的详细教程介绍如何一键远程部署我们的应用。