【Docker | 1】Docker基础介绍

1 Docker是什么 

Docker是一个开源的应用程序容器化平台,可以将应用程序打包到容器中,以便在不同的环境中部署运行。

Docker是基于容器技术实现,可以快速构建、发布和运行应用程序,同时提供了一种轻量级、灵活、可移植的应用程序部署方案。 

1.1 Docker的主要组件

Docker的主要组件包括:

  1. Docker引擎:Docker引擎是Docker的核心组件,用于管理和运行容器。Docker引擎包括Docker daemon、Docker CLI和Docker API等组件,可以通过命令行接口或API进行容器的创建、启动、停止、删除等操作。

  2. Docker镜像:Docker镜像是应用程序的打包格式,包含了应用程序的代码、依赖项和配置等信息。Docker镜像可以通过Dockerfile进行构建,也可以从Docker Hub等镜像仓库中获取。Docker镜像是容器的基础,可以用于创建和启动容器。

  3. Docker容器:Docker容器是Docker镜像的运行实例,可以在容器内运行应用程序。Docker容器提供了一种轻量级、隔离的运行环境,可以避免应用程序之间的冲突和干扰。Docker容器可以通过Docker引擎进行创建、启动、停止、删除等操作。

1.2 Docker的优点

Docker的优点包括:

  1. 简化应用程序部署:Docker可以将应用程序打包到镜像中,避免了依赖项和配置的问题,可以在不同的环境中快速、可靠地部署应用程序。

  2. 提高应用程序可移植性:Docker提供了一种轻量级、可移植的应用程序部署方案,可以在不同的操作系统和硬件平台上运行应用程序。

  3. 提高应用程序安全性:Docker提供了一种隔离的运行环境,可以避免应用程序之间的干扰和攻击,提高了应用程序的安全性。

  4. 提高应用程序可伸缩性:Docker可以快速创建和启动容器,可以根据应用程序的负载情况动态调整容器数量,提高了应用程序的可伸缩性。

总之,Docker是一种非常有用的应用程序容器化平台,可以大幅度提高应用程序的部署、可移植、安全和可伸缩性等特性。

2 Docker实现原理

Docker实现原理主要是基于Linux内核的容器技术实现的,其中包括以下几个方面:

  1. 命名空间(Namespace)
  2. 控制组(Cgroup)
  3. 联合文件系统(UnionFS)
  4. 容器镜像(Container Image)
  5. 容器(Container)

2.1 命名空间(Namespace)

命名空间(Namespace):命名空间是一种隔离机制,可以将系统资源隔离开来,每个命名空间拥有自己的资源视图。

Docker使用命名空间实现对文件系统、网络、进程、用户和IPC等方面的隔离。

Docker中常用的命名空间 

具体来说,Docker中常用的命名空间包括以下几种:

  1. 文件系统命名空间(Mount Namespace):每个容器都有自己的文件系统命名空间,可以在容器内挂载自己的文件系统,并隔离其他容器的文件系统。这样,容器内的文件系统视图就与宿主机和其他容器不同,可以实现文件系统的隔离。

  2. 网络命名空间(Network Namespace):每个容器都有自己的网络命名空间,可以拥有自己的网络设备、IP地址和路由表等,与宿主机和其他容器隔离开来。这样,容器内的网络视图就与宿主机和其他容器不同,可以实现网络的隔离。

  3. 进程命名空间(PID Namespace):每个容器都有自己的进程命名空间,可以拥有自己的进程ID空间,与宿主机和其他容器隔离开来。这样,容器内的进程视图就与宿主机和其他容器不同,可以实现进程的隔离。

  4. 用户命名空间(User Namespace):每个容器都有自己的用户命名空间,可以拥有自己的用户ID空间,与宿主机和其他容器隔离开来。这样,容器内的用户视图就与宿主机和其他容器不同,可以实现用户的隔离。

  5. IPC命名空间(IPC Namespace):每个容器都有自己的IPC命名空间,可以拥有自己的System V IPC和POSIX消息队列等,与宿主机和其他容器隔离开来。这样,容器内的IPC视图就与宿主机和其他容器不同,可以实现IPC的隔离。

2.2 控制组(Cgroup)

控制组(Cgroup):控制组是一种资源限制机制,可以限制进程的资源使用,例如CPU、内存、磁盘和网络等。Docker使用控制组实现对容器资源的限制和管理。

常用的控制组 

Docker中常用的控制组包括以下几种:

  1. CPU控制组:可以限制容器使用CPU的时间片和CPU核心数等,避免容器占用过多的CPU资源,影响其他容器和宿主机的性能。

  2. 内存控制组:可以限制容器使用的内存大小和交换空间大小等,避免容器占用过多的内存资源,导致宿主机出现内存不足的情况。

  3. I/O控制组:可以限制容器使用磁盘和网络带宽等资源的速度和带宽,避免容器占用过多的I/O资源,影响其他容器和宿主机的性能。

  4. 设备控制组:可以限制容器访问和使用设备的权限和范围,避免容器对宿主机的设备造成损害或影响。 

 2.3 联合文件系统(UnionFS)

联合文件系统(UnionFS):联合文件系统是一种文件系统层次结构,可以将多个文件系统合并为一个文件系统。Docker使用联合文件系统实现镜像的分层和共享,减少了存储空间的占用。

Docker中常用的联合文件系统是AUFS(Another UnionFS)。AUFS是一种基于联合文件系统实现的文件系统,可以将多个文件系统合并为一个文件系统,并且支持镜像分层和共享。

在Docker中,每个容器都有自己的文件系统视图,而且容器与宿主机和其他容器的文件系统视图是相互隔离的。

Docker使用AUFS实现容器镜像的分层和共享,其基本原理如下:

  1. 每个Docker镜像都是由多个只读层(Layer)组成的,每个层都是一个文件系统。
  2. 容器启动时,Docker使用AUFS将多个只读层合并为一个可写层(Writable Layer),并作为容器的根文件系统。
  3. 当容器对文件系统进行修改时,Docker会将修改的内容保存在可写层中,而不影响原有的只读层。
  4. 在创建新的容器时,Docker可以共享已有的只读层,从而加速容器的创建和部署。

2.4 容器镜像(Container Image)

容器镜像(Container Image):容器镜像是应用程序的打包格式,包含了应用程序的代码、依赖项和配置等信息。

Docker使用Dockerfile和联合文件系统构建容器镜像,可以快速地创建和部署应用程序。

在Docker中,每个容器都是基于一个或多个镜像构建而成的。通过Docker的镜像分层和共享机制,可以将多个镜像组合在一起,形成一个完整的容器镜像。

Docker镜像的分层机制可以大大减少存储空间的占用,提高镜像的重用性和可扩展性。

Docker镜像可以通过Dockerfile来定义和构建。

Dockerfile是一个文本文件,包含了一系列指令和参数,用于指导Docker构建镜像。通过Dockerfile,可以指定容器镜像的基础镜像、需要安装的软件包、配置文件和启动指令等内容。

Docker镜像的管理和分发可以通过Docker Hub和私有仓库来实现。Docker Hub是一个公共的Docker镜像仓库,包含了数以万计的常用镜像,用户可以在其中搜索和下载需要的镜像。私有仓库则是用户自己构建和管理的Docker镜像仓库,可以用于存储和分发自定义的镜像。

镜像构建示例

下面是一个后端Java构建镜像的Dockerfile示例:

dockerfile文件

# 基础镜像
FROM openjdk:11-jdk

# 镜像作者信息
MAINTAINER Your Name <[email protected]>

# 设置工作目录
WORKDIR /app

# 复制项目文件到镜像中
COPY ./target/my-application.jar /app/my-application.jar

# 设置容器启动命令
CMD ["java", "-jar", "/app/my-application.jar"]

这个Dockerfile的基础镜像是openjdk:11-jdk,即Java 11开发环境。

然后设置了容器的工作目录为/app,将项目构建生成的my-application.jar文件复制到镜像中的/app目录下。

最后,设置容器启动命令为java -jar /app/my-application.jar,即使用Java命令启动应用程序。

构建

在构建镜像时,可以使用以下命令:

docker build -t my-application .

其中,-t参数指定了镜像的名称和标签,即my-application。

最后的.表示使用当前目录下的Dockerfile文件进行构建。

运行

构建完成后,可以使用以下命令运行容器:

docker run -p 8080:8080 my-application

其中,-p参数指定了宿主机和容器之间的端口映射,即将容器的8080端口映射到宿主机的8080端口上。

my-application则是之前构建的镜像名称和标签。

2.5 容器(Container)

容器(Container):容器是镜像的运行实例,可以在容器内运行应用程序。

Docker使用命名空间和控制组对容器进行隔离和限制,提供了一种轻量级、隔离的运行环境。

容器(Container)是Docker中的一个重要概念,它是由Docker镜像创建出来的一个运行实例。容器可以看作是一个独立的、隔离的运行环境,其中包含了应用程序的运行时环境、文件系统和网络配置等信息。

在Docker中,每个容器都是基于一个或多个镜像构建而成的。通过Docker的镜像分层和共享机制,可以将多个镜像组合在一起,形成一个完整的容器镜像。在容器中,可以运行任意的应用程序,包括Web应用、数据库、消息队列、缓存等。

Docker容器特点

Docker容器具有以下特点:

  1. 轻量级:容器是一种轻量级的虚拟化技术,相比于传统的虚拟机,容器的启动和销毁速度更快,占用的资源更少。

  2. 隔离性:每个容器都是一个独立的运行环境,与宿主机和其他容器相互隔离,可以避免应用程序之间的冲突和干扰。

  3. 可移植性:容器可以在不同的平台和环境中运行,具有很好的可移植性和可重复性。

  4. 可扩展性:容器可以很容易地进行扩展和缩减,可以根据应用程序的负载情况自动调整容器的数量和资源分配。

在Docker中,容器的管理和操作可以通过Docker命令行工具来实现。可以使用docker run命令创建和启动容器,使用docker stop命令停止容器,使用docker rm命令删除容器,使用docker ps命令查看容器的运行状态等。

总之,容器是Docker中的一个重要概念,它是由Docker镜像创建出来的一个运行实例,可以看作是一个独立的、隔离的运行环境。Docker容器具有轻量级、隔离性、可移植性和可扩展性等特点,为应用程序的部署和管理提供了一种高效、可靠的方式。

容器的简单操作命令

以下是一些常用的Docker容器操作命令:

1 创建并启动容器:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

其中,OPTIONS是一些可选参数,如-p指定端口映射,-v指定数据卷挂载,-e指定环境变量等;IMAGE是要使用的镜像名称和标签;COMMAND和ARG是可选的容器启动命令和参数。

例如,创建并启动一个基于nginx:latest镜像的容器,将宿主机的80端口映射到容器的80端口上:

docker run -p 80:80 nginx:latest
2 查看容器运行状态:
docker ps [OPTIONS]

其中,OPTIONS是一些可选参数,如-a表示查看所有容器,-q表示只输出容器ID等。

例如,查看当前正在运行的所有容器:

docker ps
3 停止容器:
docker stop [OPTIONS] CONTAINER [CONTAINER...]

其中,OPTIONS是一些可选参数,如-t指定停止容器的超时时间。

例如,停止名为my-container的容器:

docker stop my-container
4 启动已停止的容器:
docker start [OPTIONS] CONTAINER [CONTAINER...]

其中,OPTIONS是一些可选参数,如-a表示启动所有已停止的容器。

例如,启动名为my-container的容器:

docker start my-container
5 删除容器:
docker rm [OPTIONS] CONTAINER [CONTAINER...]

其中,OPTIONS是一些可选参数,如-f表示强制删除容器,即使容器正在运行。

例如,删除名为my-container的容器:

docker rm my-container
6 进入容器:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

其中,OPTIONS是一些可选参数,如-it指定使用交互式终端进入容器。

例如,进入名为my-container的容器,并使用bash命令:

docker exec -it my-container bash

以上是一些常用的Docker容器操作命令,可以通过这些命令来创建、启动、停止、删除和进入容器,实现容器的管理和操作。

2.6 总结 

Docker实现原理主要是基于Linux内核的容器技术实现的,通过命名空间、控制组、联合文件系统、容器镜像和容器等组件,实现了对应用程序的隔离、限制、打包和部署等功能。这些组件相互协作,共同实现了Docker的高效、可靠、可移植和安全的特性。

猜你喜欢

转载自blog.csdn.net/qq_35133411/article/details/131686362