Docker基础学习
Docker是什么
基于Linux内核的 Cgroups、Namespace 技术,以及 UnionFS(Union File System)组成 rootfs(Root File System)等技术,对进程进行封装隔离,实现操作系统层面的虚拟化技术。
从上面的介绍直观感受来说,Docker更像一个技术概念,它利用已有的技术特性和理念,使用Go语言开发了一个项目,叫做Docker。
它实现的进程隔离独立于宿主和其他隔离的进程外,因此被称为容器。
Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使其相比于虚拟机技术更为轻便、快捷。
Docker技术相比较于虚拟机技术:虚拟机技术是虚拟出一套完整的操作系统(自己的内核、硬件资源),再在该系统上运行所需的应用进程;而Docker容器没有自己的内核,也没有进行硬件虚拟,只是通过技术手段重新挂载一套新的文件系统,并在此文件系统上运行应用进程。
Docker技术相比较于虚拟机技术的优势:
- 更高效的利用系统资源
- 更快速的启动时间
- 一致的运行环境
- 持续交付(CI)和部署(CD)
- 更轻松的迁移
- 更轻松的维护和扩展
Docker基本概念
Docker的三大基本概念:
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
Docker镜像
前言:操作系统的组成分为 内核 和 用户空间,对于 Linux
而言,内核启动后,会挂载 root
文件系统(rootfs)为其提供用户空间支持。
Docker镜像(Image),就相当于是一个特殊的 rootfs ,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变(抽象点说,Docker镜像是一个只读的模版)。
因为Docker镜像包含有操作系统的完整的 rootfs,其体积往往是庞大的(百兆或者GB大小),这与介绍Docker时说它是轻量级的概念不符。所以Docker在设计时,利用了 Union FS
技术,将镜像设计为多层储存的架构。严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
例如:从Docker Hub下载一个 MySQL
镜像时,MySQL需要有一个操作系统作为运行环境,但它不会拿宿主机的操作系统,而是根据构建MySQL镜像的代码判断,从上一层获取镜像。
从图中可以看出,mysql:5.7.41镜像的上一层是oraclelinux:7-slim镜像。
Docker容器
镜像(Image
)和容器(Container
)的关系,就类似于面向对象编程中的 类
和 实例
一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
每个容器都是相互隔离的运行环境,具有自己的文件系统、进程空间和网络接口。容器可以与主机和其他容器进行通信。
Docker Registry
Docker Registry翻译为Docker注册表,又叫做Docker中央仓库。中央仓库可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个Docker镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest
作为默认标签。
Docker常用命令
镜像管理命令
docker pull <image>
:从注册表中拉取一个镜像。docker build [options] <path/to/dockerfile>
:根据Dockerfile构建一个镜像。docker push <image>
:将一个镜像推送到注册表中。docker images
:列出本地已有的镜像。等同于docker image ls
。docker rmi <image>
:删除一个镜像。
容器管理命令
-
docker run [options] <image> [COMMAND] [ARG...]
:创建并运行一个新的容器。[OPTIONS]
是可选的参数,用于配置容器的各种选项,例如端口映射、卷挂载、环境变量等。IMAGE
是容器所基于的镜像名称或镜像ID。[COMMAND] [ARG...]
是容器启动时要执行的命令和参数。
下面是一些常用的
docker run
命令选项(options):-d
:以后台模式(detached)运行容器。-p <host-port>:<container-port>
:将主机的端口映射到容器的端口。-v <host-path>:<container-path>
:将主机的目录或文件挂载到容器的目录。-e <key>=<value>
:设置环境变量。--name <container-name>
:为容器指定一个名称。--restart <restart-policy>
:设置容器的重启策略。-it
:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。一般会在command写bash。--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm
。
-
docker start <container>
:启动已经创建的容器。 -
docker stop <container>
:停止正在运行的容器。 -
docker restart <container>
:重启容器。 -
docker rm <container>
:删除容器。 -
docker ps [options]
:列出正在运行的容器。docker ps -a
:列出所有容器,包括正在运行的和已停止的容器。docker ps -q
:只显示容器的ID。docker ps -l
:显示最近创建的容器。docker ps --filter <key>=<value>
:根据指定的键值对筛选容器,例如docker ps --filter status=running
只显示正在运行的容器。
-
docker logs <container>
:查看容器的日志。默认输出所有日志。docker logs --tail 100 <container>
:只展示最后100行日志docker logs -f <container>
:实时(follow)模式下查看容器日志。
-
docker exec [options] <container> <command>
:在正在运行的容器中执行命令。docker exec -it <container> <command>
:在正在运行的容器中执行交互式命令。-it
选项用于指定交互式会话(Interactive)和终端(TTY)连接,以便你可以与容器进行交互。<container>
是容器的名称或容器ID。<command>
是要在容器内部执行的命令。例如:bash
网络和存储命令
docker network create <network>
:创建一个新的网络。docker network connect <network> <container>
:将容器连接到网络。docker volume create <volume>
:创建一个数据卷。docker volume ls
:列出本地已有的数据卷。docker volume rm <volume>
:删除一个数据卷。
其他常用命令
docker info
:显示Docker系统信息。docker version
:显示Docker客户端和服务器版本信息。docker inspect <container/image>
:获取容器或镜像的详细信息。docker attach <container>
:附加到正在运行的容器的标准输入、输出和错误流。docker cp <container>:<path/to/file> <host/path>
:从容器复制文件到主机。docker-compose up
:使用Docker Compose启动多个容器应用。